CakePHP 3 маршруты при использовании отдельных пространств имен контроллера - PullRequest
0 голосов
/ 21 февраля 2019

Этот вопрос касается маршрутизации (config/routes.php) в CakePHP 3.7.3

У меня есть приложение, которое использует 3 контроллера.Два из них находятся в пространстве имен администратора:

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

Я пытаюсь добиться следующих вещей:

  1. Сделать «ярлык» URL https://example.com/admin, который обслуживает 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 не может быть найден.

Ошибка: Создайте класс AdminController ниже в файле: src/Controller/AdminController.php

Контроллер, который его просят использовать, - Users, поэтому я неЯ не понимаю, почему он запрашивает AdminController?

Для решения (2) я попытался:

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

Однако при попытке доступа к https://example.com/foo выдается следующая ошибка:

Ошибка: не удалось найти FooController.

Очевидно, это не то, что я пытаюсь сделать - я ожидаю, что он будет использовать контроллер Articlesи view действие, которое я указал в массиве.

В моих двух административных контроллерах (Controller/Admin/ArticlesController.php и Controller/Admin/UsersController.php) я объявил:

namespace App\Controller\Admin;

вне классаимя, например class ArticlesController extends AppController

Для не-Admin ArticlesController (Controller/ArticlesController.php) я объявил:

namespace App\Controller;

, за которым следует имя класса class ArticlesController extends AppController

Это кажется слишком сложным.Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 21 февраля 2019

В вашем rout.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);
})
...