簡體   English   中英

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

[英]Phalcon php router notFound not working

我現在正在抨擊Phalcon,試圖讓我了解它,因為我正在考慮將一個大項目從CodeIgniter移植到Phalcon或其他框架,然后繼續開發。

我正在使用路由器嘗試捕獲404錯誤,但這不能按預期工作。 路由器它自己似乎工作,因為我也有$router->add("/"來獲取站點索引控制器,如果index.php沒有定義,如果我評論出來,回家/然后拋出404 !但是,鍵入一些不存在的控制器名稱,例如test,給我錯誤“PhalconException:TestController處理程序類無法加載”。我的htaccess是根據Phalcon文檔教程。

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

該站點具有domain.com/group-name/到達的用戶提交的組。在CI中,我使用404路由加載組控制器,該組控制器將激活對該組的搜索。 如果找到它將顯示該組,如果沒有它將拋出404頁面與404標題。 很可能在Phalcon中有更好的方法,但我至少想知道為什么我的notFound潰敗無法工作;)

編輯:不確定這是否會改變,但我使用的是基本控制器“controllerBase”,所有主控制器都在擴展。 它只包含一些變量和初始化函數以及可以從控制器調用的另一個函數。 我不會想到這會影響notFound路由,但我想我最好提一下。

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

難道你不覺得這必須是另一種方式嗎? 我會說如果你有像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');
}

理想情況下,你有一個更好的機制來處理404s,所以你可以throw new NotFoundException(); 並且不管理動作中的標題。 並且不要忘記路線順序 :由於您可以使用add()添加許多路線,添加路線的順序表明它們的相關性,添加的最新路線具有比首次添加更多的相關性。

關於$router->notFound()無法正常工作,它聞起來像是一些簡單的東西 - 在調用東西時你是否三重檢查名稱/路徑/順序?

它看起來像你過早地調用$ 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM