2

我现在只是在抨击 Phalcon,试图弄清楚它,因为我正在考虑将一个大项目从 CodeIgniter 移植到 Phalcon 或其他框架,然后再继续开发。

我正在使用路由器尝试捕获 404 错误,但这并没有按预期工作。它自己的路由器似乎正在工作,因为$router->add("/"如果未定义 index.php,我还必须获取站点索引控制器,如果我将其注释掉,回家/然后抛出 404!但是,输入一些不存在的控制器名称,例如 test,会给我错误“PhalconException:无法加载 TestController 处理程序类”。我的 htaccess 是按照 Phalcon 文档教程。

在引导程序(index.php)中我有;

$di->set('router', function() { require __DIR__ . '/../app/config/routes.php'; return $router; });

我的 routes.php 看起来像这样;

$router = new \Phalcon\Mvc\Router();

// default
$router->add("/", array(
    'controller' => 'index',
    'action' => 'index'
));

//Set 404 paths
$router->notFound(array(
    "controller" => "group",
    "action" => "index"
));

$router->handle();
return $router;

该站点具有通过 domain.com/group-name/ 访问的用户提交的组。在 CI 中,我使用 404 路由加载组控制器,该控制器将激活对该组的搜索。如果找到,它将显示该组,如果没有,它将抛出一个带有 404 标题的 404 页面。很可能在 Phalcon 中有更好的方法来做到这一点,但我至少很想知道为什么我的 notFound 溃败无法正常工作;)

编辑:不确定这是否会改变任何东西,但我正在使用所有主控制器都在扩展的基本控制器“controllerBase”。它只包含一些变量和一个初始化函数以及另一个可以从控制器调用的函数。我不会认为这会影响 notFound 路由,但我认为我最好以任何方式提及它。

4

3 回答 3

8

\Phalcon\Mvc\Router 的默认行为不使用 notFound() 方法。

如果您想使用 notFound(),您需要先禁用默认路由,如下所述:http: //docs.phalconphp.com/en/latest/reference/routing.html#default-behavior

在您的示例中,您只需要更改:

$router = new \Phalcon\Mvc\Router();

到以下:

$router = new \Phalcon\Mvc\Router(false);
于 2014-05-29T22:12:18.880 回答
2

你不觉得这一定是相反的吗?我会说,如果您的路由domain.com/group-name/必须像路由一样处理,而不是像 404 那样处理……只有当找不到组时,应用程序才应该以 404 响应。听起来更简单,更合乎逻辑。

$router = new \Phalcon\Mvc\Router();

// group - match any 1+ characters
$router->add("/(.+)", array(
    'controller' => 'group',
    'action' => 'index',
    'params' => 1
));

// default
$router->add("/", array(
    'controller' => 'index',
    'action' => 'index'
));

// action in group controller
public function indexAction($group) {
    if ($this->groupExists($group)) {
        // display it
    } else {
        $this->dispatcher->forward([
            'action'     => 'error404',
            'controller' => 'error'
        ]);
    }
}

// action in error controller
public function error404() {
    // …
    // dispay the error
    // …

    $this->response->setStatusCode(404, 'Not Found');
}

理想情况下,您将拥有更好的机制来处理 404,因此您可以只throw new NotFoundException();管理操作中的标头,而无需管理标头。并且不要忘记路线顺序:由于您可以根据需要添加许多路线,因此添加路线add()的顺序表明它们的相关性,最新添加的路线比首次添加的路线具有更多相关性。

关于$router->notFound()不工作,它闻起来像是缺少了一些简单的东西——当调用事物时,你是否三次检查了名称/路径/顺序?

于 2014-05-22T08:03:16.123 回答
1

在我看来,您调用 $router->handle() 太早了。

它有助于检查其他项目如何完成相同的事情: https ://github.com/phalcon/forum/blob/master/app/config/routes.php

引导程序:

$di->set(
    'router',
    function () {
        return require __DIR__ . '/../app/config/routes.php';
    },
    true
);

路线:

$router = new \Phalcon\Mvc\Router();

// default
$router->add("/", array(
    'controller' => 'index',
    'action' => 'index'
));

//Set 404 paths
$router->notFound(array(
    "controller" => "group",
    "action" => "index"
));

return $router;

再次引导:

... end of file ...


echo $application->handle()->getContent();
于 2014-05-22T01:03:15.520 回答