Передача параметров в настраиваемый URL-адрес

Я создал собственный маршрут URL-адреса следующим образом:

Router::connect('/subjects.details', array(
    'plugin' => 'subjects',
    'controller' => 'subjects',
    'action' => 'details'
));

Однако для этого действия / просмотра нужен параметр.

Поэтому, когда я перехожу по ссылке типа localhost/foo/subjects.details/12, у меня появляется ошибка отсутствующего контроллера.

Отсутствует контроллер

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

Ошибка: создайте класс Subjects.detailsController ниже в файле: app / Controller / Subjects.detailsController.php

Как мне добавить параметр id для этого URL?


person Kunok    schedule 12.07.2016    source источник
comment
Вы также можете использовать subject-details вместо subject.details и использовать имя контроллера CamelCased в маршруте 'controller' => 'Subjects'.   -  person user3082321    schedule 12.07.2016
comment
@ user3082321 ничего не меняет   -  person Kunok    schedule 12.07.2016
comment
Должно быть изменено сообщение об ошибке. Что за сообщение об ошибке.   -  person user3082321    schedule 12.07.2016
comment
@ user3082321 он вообще ничего не изменил. Так или иначе, решение найдено.   -  person Kunok    schedule 12.07.2016


Ответы (3)


Вы должны определить параметр в URL-адресе и в своем действии:

  Router::connect('/subjects.details/:id', array(
        'plugin' => 'subjects',
        'controller' => 'subjects',
        'action' => 'details'
    ));
person peterchaula    schedule 12.07.2016
comment
http://localhost/tmc/subjects/subjects/details/1 возвращает страницу с данными, а http://localhost/tmc/subjects.details/1 возвращает страницу с ошибкой: `Ошибка: запрошенный адрес '/tmc/subjects.details/1' не был найден на этом сервере. ' - person Kunok; 12.07.2016
comment
похоже, что cakephp интерпретирует subject.details как плагин / контроллер - person peterchaula; 12.07.2016

Ответ лазеров вернул еще одну ошибку. По сути, он добавил новый ключ 'id' => '1' в массив $this->params, а не в массив ключей 'passed' $this->params. Изменив его на это, он работает:

Router::connect('/subjects.details/*', array(
  'plugin' => 'subjects',
  'controller' => 'subjects',
  'action' => 'details'
));
person Kunok    schedule 12.07.2016
comment
Это маршрут параметра переменной длины, который соответствует /subjects.details/12/12/1/24/4/45/45/5/ ...... Это не тот, который вам нужен, если вы собираетесь получить один документ. - person peterchaula; 12.07.2016
comment
Тогда что еще вы посоветуете, если :id не работает? - person Kunok; 12.07.2016

Вот рабочее решение. Вы должны передать параметры, и тогда он начнет работать. Вот способ-

  Router::connect('/subjects.details/:id', [
    'plugin' => 'subjects',
    'controller' => 'subjects',
    'action' => 'details'
   ],
   [
    'pass' => ['id']
   ]
  );

И ваш метод должен выглядеть так:

public function details($id){
  //....
}

Надеюсь, это может быть полезно. Спасибо.

person Kalyan Halder Raaz    schedule 09.06.2020