【问题标题】:CakePHP 3 routes when using separate Controller namespaces使用单独的控制器命名空间时的 CakePHP 3 路由
【发布时间】:2019-02-21 10:27:05
【问题描述】:

这个问题涉及 CakePHP 3.7.3 中的路由 (config/routes.php)

我有一个使用 3 个控制器的应用程序。其中两个位于“Admin”命名空间中:

  • Controller/Admin/ArticlesController.php
  • Controller/Admin/UsersController.php
  • Controller/ArticlesController.php

我正在努力实现以下目标:

  1. 创建一个服务于Admin/UsersController::login() 的“快捷方式”网址https://example.com/admin - 即https://example.com/admin/users/login

  2. 在我的网站前端显示页面的函数是ArticlesController::view()。如果我有一个 URL slug “foo”,我的页面会提供来自 URL https://example.com/articles/view/foo 的内容。不过我只想https://example.com/foo

在我的config/routes.php 中,我已经配置了管理员路由:

Router::scope('/', function (RouteBuilder $routes) {

    Router::prefix('admin', function ($routes) {
        // All routes here will be prefixed with `/admin`
        // And have the prefix => admin route element added.
        $routes->fallbacks(DashedRoute::class);
    });

    $routes->fallbacks(DashedRoute::class);

});

这行得通 - 我可以在 https://example.com/admin/users/login 登录。

为了解决(1)我尝试添加以下内容:

Router::connect('/admin', ['controller' => 'Users', 'action' => 'login']);

// The line above is immediately outside the existing code shown previously:
Router::scope('/' ...

但这给了我一个错误:

错误:找不到 AdminController。

错误:在文件中创建下面的类 AdminController:src/Controller/AdminController.php

它被要求使用的控制器是Users,所以我不明白为什么它要求AdminController

为了解决(2)我尝试:

$routes->connect('/*', ['controller' => 'Articles', 'action' => 'view]);

但是,当尝试访问 https://example.com/foo 时,会出现以下错误:

错误:找不到 FooController。

显然这不是我想要做的 - 我希望它使用我在数组中指定的 Articles 控制器和 view 操作。

在我的两个管理控制器(Controller/Admin/ArticlesController.phpController/Admin/UsersController.php)中,我声明:

namespace App\Controller\Admin;

在类名之外,例如class ArticlesController extends AppController

对于非管理员ArticlesController (Controller/ArticlesController.php) 我已经声明:

namespace App\Controller;

后跟类名class ArticlesController extends AppController

这似乎过于复杂。有人可以帮忙吗?

【问题讨论】:

    标签: php cakephp routing cakephp-3.x


    【解决方案1】:

    在你的 routes.php 中添加:

    Router::defaultRouteClass(DashedRoute::class);
    

    对于管理员路由:

    Router::prefix('admin', function ($routes) {
        $routes->connect('/login', ['controller' => 'Users', 'action' => 'login']);
        $routes->fallbacks(DashedRoute::class);
    });
    

    对于公共路由:

    Router::scope('/', function (RouteBuilder $routes) {
        $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
        $routes->fallbacks(DashedRoute::class);
    })
    

    【讨论】:

    • 对于管理员路由,它给出了一个错误,提示“在文件中创建类 LoginController:src/Controller/LoginController.php”。不知道为什么控制器被称为“用户”并且在任何情况下都在“管理员”命名空间中(即它应该是Controller/Admin/UsersController.php,而不是Controller/UsersController.php
    猜你喜欢
    • 2012-03-07
    • 2010-09-07
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多