отсутствует определенный маршрут — Missing Route в Cakephp 3.4

Я пытаюсь использовать префикс «студент». Когда я создаю ссылку в шаблоне или файле макета, я получаю эту ошибку, как показано на рисунке:
введите описание изображения здесь

код в rout.php

    <?php
use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;

Router::defaultRouteClass(DashedRoute::class);

Router::scope('/', function (RouteBuilder $routes) {
$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
$routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
$routes->fallbacks(DashedRoute::class);
});Router::prefix('admin', function ($routes) {
$routes->connect('/users/', [ 'controller' => 'MyUsers', 'action' => 'index', 'plugin'=>false]);
$routes->connect('/login', [ 'controller' => 'MyUsers', 'action' => 'login', 'plugin'=>false, 'prefix'=>'admin']);
$routes->connect('/', [ 'controller' => 'MyUsers', 'action' => 'dashboard', 'plugin'=>false]);
$routes->fallbacks(DashedRoute::class);
});

Router::prefix('trainer', function ($routes) {
$routes->connect('/users/', [ 'controller' => 'MyUsers', 'action' => 'index', 'plugin'=>false]);
$routes->connect('/login', [ 'controller' => 'MyUsers', 'action' => 'login', 'plugin'=>false]);
$routes->connect('/', [ 'controller' => 'MyUsers', 'action' => 'dashboard', 'plugin'=>false]);
$routes->fallbacks(DashedRoute::class);
});Router::prefix('student', function ($routes) {
$routes->connect('/courses/', array ( 'controller' => 'Courses', 'action' => 'index', 'plugin' => false, 'prefix' => 'student', '_ext' => NULL, ));
$routes->connect('/', array ( 'controller' => 'MyUsers', 'action' => 'dashboard', 'plugin' => false));
});

/**
* Load all plugin routes.  See the Plugin documentation on
* how to customize the loading of plugin routes.
*/
Plugin::routes();

файл макета student.ctp имеет только одну строку кода:

<li><?php echo $this->Html->link('Courses', [ 'controller' => 'Courses', 'action' => 'index', 'plugin' => false, 'prefix' => 'student', '_ext' => NULL, ]);?></li>

AppController.php:

    <?php

namespace App\Controller;

use Cake\Controller\Controller;
use Cake\Event\Event;
use  Cake\Core\Configure;
use Cake\Network\Exception\NotFoundException;class AppController extends Controller
{

public $helpers = array(
'CakeDC/Users.AuthLink',
'CakeDC/Users.User',
);public function initialize()
{
parent::initialize();

$this->loadComponent('RequestHandler');
$this->loadComponent('Flash');
$this->loadComponent('CakeDC/Users.UsersAuth');
$this->loadComponent('Utils.GlobalAuth');

$this->Auth->config('loginRedirect', array('controller'=>'Courses', 'action'=>'index', 'plugin'=>FALSE));
$this->Auth->config('logoutRedirect', array('controller'=>'MyUsers', 'action'=>'login', 'plugin'=>FALSE));
$this->Auth->config('unauthorizedRedirect', array('controller'=>'Courses', 'action'=>'index', 'prefix'=>$this->Auth->user('role')));
$this->Auth->config('loginAction', array('controller'=>'MyUsers', 'action'=>'login'));
$this->Auth->allow(['login', 'logout']);}public function beforeRender(Event $event)
{
if (!array_key_exists('_serialize', $this->viewVars) &&
in_array($this->response->type(), ['application/json', 'application/xml'])
) {
$this->set('_serialize', true);
}

$this->_renderLayout();
}

private function _renderLayout()
{
$prefix =  isset($this->request->params['prefix'])?$this->request->params['prefix']:FALSE;

if(!$prefix)
{
return;
}

$this->viewBuilder()->setLayout($prefix);}
}

Я проверил это решение: CakePHP 3: ошибка отсутствующего маршрута для существующего маршрута

1

Решение

Вы не можете кормить специальное plugin ключ с логическим значением, он должен быть nullили строка с названием плагина.

Также нет необходимости определять plugin или же prefix ключи при соединении маршрутов, Router::prefix() Метод позаботится о добавлении префикса. , подобным образом Router::plugin() добавит имя плагина, а когда не использует Router::plugin()по умолчанию null предполагается для plugin ключ.

Кроме того, определяя _ext с null имеет смысл, только если вы хотите запретить создание URL-адресов с расширениями. И указание его при генерации URL-адресов необходимо, только если он был определен как неnull значение, которое также верно для plugin ключ (если вам не нужно выйти из текущего контекста плагина).

Короче говоря, подключение маршрута требует только controller а также action ключи:

$routes->connect('/courses/', [
'controller' => 'Courses',
'action' => 'index'
]);

И для генерации URL нужно только дополнительное prefix ключ, plugin необязательно, если не используется в контексте плагина:

$this->Html->link('Courses', [
'controller' => 'Courses',
'action' => 'index',
'plugin' => null,
'prefix' => 'student'
]);

Смотрите также

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]