Могу ли я сделать так, чтобы CakePHP возвращал подходящий код состояния в зависимости от определенных условий? - PullRequest
1 голос
/ 03 июня 2009

Этот вопрос немного связан с моим старым постом Работа с URL-адресами псевдонимов в CakePHP

После долгих раздумий я изучаю возможность использования собственного скрипта 404 в моем приложении Cake, которое достигается, когда URL-адрес не сопоставляется ни с какими контроллерами / действиями. Этот скрипт будет проверять $ this-> здесь и искать его в базе данных перенаправлений. Если совпадение найдено, он будет отслеживать конкретный промо-код и перенаправлять.

Я думаю, коды состояния. Могу ли я заставить свой скрипт возвращать подходящий код состояния в зависимости от определенных условий? Например:

  1. URL соответствует перенаправлению - возвращает 301
  2. URL действительно не имеет места назначения - верните 404.

Могу ли я сделать это?

EDIT:

А как насчет этого? Кто-нибудь видит какие-либо проблемы с этим? Я положил его в app_controller.

function appError($method, $params) {

    //do clever stuff here

}

Ответы [ 3 ]

6 голосов
/ 03 июня 2009

Это должно работать. Предполагая, что вы перенаправили 404 на действие контроллера LegacyUrls :: map (). Код должен быть сохранен в app / app_error.php:

<?php
class AppError extends ErrorHandler{
    function error404($params) {
        $Dispatcher = new Dispatcher();
        $Dispatcher->dispatch('/legacy_urls/map', array('broken-url' => '/'.$params['url']));
        exit;
    }

    function missingController($params) {
        $Dispatcher = new Dispatcher();
        $Dispatcher->dispatch('/legacy_urls/map', array('broken-url' => '/'.$params['url']));
        exit;
    }
}
?>

Удачи!

4 голосов
/ 03 июня 2009

Я всегда создавал app \ views \ errors \ missing_action.ctp и app \ views \ errors \ missing_controller.ctp

Cake автоматически отображает одно из этих представлений, когда URL не отображается на контроллере или его методах.

Если нет определенной необходимости для кодов ошибок, которые вы не дали, это будет работать отлично!

0 голосов
/ 06 ноября 2011

Я бы хотел дополнить ответ Феликса.

Эта версия выводит ошибку 404 в браузер:

class AppError extends ErrorHandler
{
        function _outputMessage($template)
        {
                if ($template === 'error404') {
                        $Dispatcher = new Dispatcher();
                        $Dispatcher->dispatch('legacy_urls/map', array('broken-url' => '/'.$params['url']));
                        return;
                }
                parent::_outputMessage($template);
        }
}
...