@boston, посмотрел пример @vanchelo - это не то. Данный код позволяет перехватить именно ошибочные урлы и вывести 404-ю страницу для них. У меня такой же код используется в модулях:
<?php
namespace Backend;
class Module implements \Phalcon\Mvc\ModuleDefinitionInterface
{
public function registerAutoloaders()
{
$loader = new \Phalcon\Loader();
$loader->registerNamespaces([
'Backend' => __DIR__,
'Backend\Controller' => __DIR__ . '/controller/',
'Backend\Model' => __DIR__ . '/model/',
])->register();
}
public function registerServices($di)
{
$di->set('dispatcher', function ()
{
$eventsManager = new \Phalcon\Events\Manager();
$eventsManager->attach('dispatch', function ($event, $dispatcher, $exception)
{
if ($event->getType() == 'beforeException')
{
switch ($exception->getCode())
{
case \Phalcon\Dispatcher::EXCEPTION_HANDLER_NOT_FOUND:
case \Phalcon\Dispatcher::EXCEPTION_ACTION_NOT_FOUND:
$dispatcher->forward([
'module' => 'backend',
'controller' => 'error',
'action' => 'notFound'
]);
return false;
}
}
});
$dispatcher = new \Phalcon\Mvc\Dispatcher();
$dispatcher->setDefaultNamespace('Backend\Controller');
$dispatcher->setEventsManager($eventsManager);
return $dispatcher;
});
$di->set('view', function ()
{
$view = new \Phalcon\Mvc\View();
$view
->setMainView('layout')
->setViewsDir(__DIR__ . '/view/');
$view->disableLevel([
\Phalcon\Mvc\View::LEVEL_BEFORE_TEMPLATE => true,
\Phalcon\Mvc\View::LEVEL_AFTER_TEMPLATE => true,
\Phalcon\Mvc\View::LEVEL_LAYOUT => true,
]);
return $view;
});
}
}
Свою задачу данный код выполняет отлично, но не решает поставленную задачу. Например, в базовом контроллере код:
class Controller extends \Library\Controller
{
public function initialize()
{
parent::initialize();
if (!$this->auth->logged_in())
{
HTTP::redirect('/login');
}
else
{
if (!$this->auth->get_user()->admin)
{
$this->dispatcher->forward([
'module' => 'backend',
'controller' => 'error',
'action' => 'notFound'
]);
}
}
$this->tag->setTitle($this->message->get('application', 'title'));
}
}
Как в этом коде использовать пример @vanchelo? Что-то я с ходу придумать не смог (.
В идеале, вместо $this->dispatcher->forward хочется использовать throw new Exception (или throw new Exception_404, например) и модуль, который будет перехватывать эти exception-ы и обрабатывать их в зависимости от кода.