Phalcon php路由器notFound无法正常工作

时间:2014-05-21 23:19:42

标签: php phalcon phalcon-routing

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

我正在使用路由器尝试捕获404错误,但这没有按预期工作。它自己的路由器似乎正在工作,因为如果没有定义index.php,我也有$router->add("/"来获取站点索引控制器,如果我发表评论,那么回家/然后抛出404!但是,键入一些不存在的控制器名称,例如测试,给我错误“PhalconException:TestController处理程序类无法加载”。我的htaccess是根据Phalcon docs教程。

在bootstrap(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;

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

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

3 个答案:

答案 0 :(得分:6)

\ 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);

答案 1 :(得分: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();而不管理操作中的标头。并且不要忘记routes order:因为您可以使用add()添加许多路线,添加路线的顺序表明它们的相关性,添加的最新路线具有比首次添加更多的相关性。

关于$router->notFound()没有工作,它闻起来像是一些简单的东西 - 在调用东西时你是否三重检查名称/路径/顺序?

答案 2 :(得分:1)

在我看来,你过早地调用$ router-> handle()。

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

bootstrap:

$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();