Zend Framework 0.6.0 page 404

d1m

Новичок
Zend Framework 0.6.0 page 404

Приветствую всех!

В ZF версии 0.2 если контроллер не находился вызывалось действие noRoute контроллера IndexController. В версии 0.6 такое действие исключили и предложили заменить его более понятным - __call(). В общем-то все бы и ничего, если бы не одно "но".
Вот есть урл www.example.com/test/test1 . Вот пользователь заходит, если он наберет не test1 а test2 то именно этот метод и отработает. Но если он наберет www.example.com/tets/test1 ? То тогда фреймворк выматюгается, что нет такого контроллера. Это в лучшем случае, потому как по умолчанию он вообще отобразит пустую страницу.
Можно в своем index.php ставить костыль:
PHP:
try{
    $controller = Zend_Controller_Front::getInstance();
    $controller->throwExceptions(true);
    Zend_Controller_Front::run("$path/controllers");
}
catch (Zend_Controller_Exception $e)
{
    $smarty = Zend::registry('smarty');
    $smarty->display('error404.tpl');
}
но мне кажется, что должен быть вариант это красиво и без такого горбыля завернуть. Кто чего скажет?
 

Observer

Новичок
Re: Zend Framework 0.6.0 page 404

Лично мне удалось решить эту проблему следующим образом:

Для страницы 404 создается класс контроллера Error404Controller с методом index()

PHP:
$router = new Zend_Controller_RewriteRouter;
$router->removeDefaultRoutes();
// статический маршрут для стартовой страницы
$router->addRoute('/', new Zend_Controller_Router_StaticRoute('/', array('controller' => 'index', 'action' => 'index')));
$router->addRoutes($routes); // прочие маршруты

$controller = Zend_Controller_Front::getInstance();
$controller->setBaseUrl('/');
$controller->setRouter($router);

$controller->setDefaultController('error404');
$controller->setControllerDirectory($controller_path);

$response = $controller->dispatch();
echo $response;
В этом случае не нужно даже заполнять методы __call в контроллерах - если не найдено действие, то вызывается контроллер error404
 

d1m

Новичок
и, как я понял, остальные роуты надо прописывать самому руками по типу
PHP:
$routes[] = new Zend_Controller_Router_StaticRoute('login', array('controller' => 'login', 'action' => 'form'));
Нашел также такой метод:

PHP:
  class Plugin_Notfound extends Zend_Controller_Plugin_Abstract
  {
      public function preDispatch($request)
      {
          $dispatcher = Zend_Controller_Front::getInstance()
                        ->getDispatcher();

          if (!$dispatcher->isDispatchable($request))
          {

$request->setControllerName($dispatcher->getDefaultController())
                      ->setActionName('noroute')
                      ->setDispatched(false);
          }
      }
  }
( http://www.nabble.com/noRouteAction-....no-function-...please-help-t2863934s16154.html )

-~{}~ 09.01.07 13:49:

и, глядя на твой пример, можно легко создавать Alias-ы.
 

Observer

Новичок
Автор оригинала: d1m
и, как я понял, остальные роуты надо прописывать самому руками по типу
PHP:
$routes[] = new Zend_Controller_Router_StaticRoute('login', array('controller' => 'login', 'action' => 'form'));
У меня все возможные маршруты определены в конфигурации, поэтому подставить массив маршрутов (у меня они как статические, так и динамические) не представляет труда.

Нашел также такой метод:
Ну что же... сами во всем разобрались :)
Вариант с плагином выглядит более "правильным", у меня он как-то проскочил, хотя тоже читаю рассылку.
 
Сверху