【问题标题】:Phalcon php router notFound not workingPhalcon php路由器未找到无法正常工作
【发布时间】:2014-07-10 19:37:15
【问题描述】:

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

我正在使用路由器尝试捕获 404 错误,但这并没有按预期工作。它自己的路由器似乎正在工作,因为如果 index.php 未定义,我也有$router->add("/" 来获取站点索引控制器,如果我将其注释掉,回家/然后抛出 404!但是,输入一些不存在的控制器名称,例如测试,给我错误“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 路由,但我认为我最好以任何方式提及它。

【问题讨论】:

    标签: php phalcon phalcon-routing


    【解决方案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();
    

    【讨论】:

    • 我已经按照你的例子做了,但它仍然不会通过 404 - 只是缺少模型消息。
    • 你可以尝试使用事件管理器附加一个钩子来调度异常吗? docs.phalconphp.com/en/latest/reference/…
    【解决方案2】:

    你不觉得这一定是相反的吗?我会说,如果你有像domain.com/group-name/ 这样的路由,它们必须像路由一样处理,而不是像 404s……只有当找不到组时,应用程序才应该用 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() 不工作,它闻起来像是缺少一些简单的东西 - 你是否在调用时三次检查名称/路径/顺序?

    【讨论】:

    • 感谢您的回复@Ian。我同意有更好的方法来做我想做的事情,你的建议很有意义,但现在我只需要了解为什么 notFound 不起作用。我检查了名称、路径、顺序等。一切似乎都如我所料。
    • 也看看我的编辑,虽然我怀疑它与这个问题有任何关系。
    【解决方案3】:

    \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-09-22
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 2019-12-31
    • 2016-11-26
    • 2014-12-05
    相关资源
    最近更新 更多