Этот вопрос касается маршрутизации (config/routes.php
) в CakePHP 3.7.3
У меня есть приложение, которое использует 3 контроллера.Два из них находятся в пространстве имен администратора:
Controller/Admin/ArticlesController.php
Controller/Admin/UsersController.php
Controller/ArticlesController.php
Я пытаюсь добиться следующих вещей:
Сделать «ярлык» URL https://example.com/admin
, который обслуживает Admin/UsersController::login()
- т.е. https://example.com/admin/users/login
Функция, которая показывает страницы в веб-интерфейсе моего сайта: 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
Это кажется слишком сложным.Кто-нибудь может помочь?