使用单独的Controller名称空间时的CakePHP 3路由

时间:2019-02-21 10:27:05

标签: php cakephp routing cakephp-3.x

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

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

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

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

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

  2. 在我的网站前端显示页面的功能是ArticlesController::view()。如果我有一个URL标记“ 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。

     

错误:在文件src/Controller/AdminController.php

中创建下面的类AdminController。

被要求使用的控制器是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

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

namespace App\Controller;

后跟类名class ArticlesController extends AppController

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

1 个答案:

答案 0 :(得分:0)

在您的route.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);
})