Литиевая связь
Я пытаюсь создать свое первое приложение для Lithium и получаю очень странную ошибку.
У меня есть строка в моем представлении индекса,
<td><?php echo $this->html->link($question->title, array('controller'=>'questions','action'=>'view','id'=>$question->id)); ?></td>
То, что я хотел бы представить, будет ссылаться на это представление записей и использование 'questions/view'.$question->id'
однако, используя URL-адрес массива, я получаю фатальный результат.
Fatal error: Uncaught exception 'lithium\net\http\RoutingException' with message 'No parameter match found for URL
('controller' => 'questions', 'action' => 'view', 'id' => '1').' in /Applications/MAMP/htdocs/learning-lithium/libraries/lithium/net/http/Router.php on line 306
Что для меня похоже на то, что маршрутизатор пытается сопоставить URL в помощнике, и, поскольку по какой-то причине он не может, он выбрасывает исключение. У кого-нибудь есть идеи, почему это так? Я атакую Литий с точки зрения CakePHP, так что мне это кажется странным.
2 ответа
'args'
Параметр обрабатывается маршрутами по умолчанию и передается в качестве аргументов вашему методу действия.
Попробуй это:
<?=$this->html->link($question->title, array('Questions::view', 'args' => array($question->id))); ?>
Чтобы направить его с id
параметр, вам нужно указать маршрут, который ищет идентификатор параметра через {:id}
, Посмотрите в файле route.php по умолчанию раздел "Маршруты объектов базы данных". Вот несколько примеров, которые я напишу ниже для полноты:
/**
* ### Database object routes
*
* The routes below are used primarily for accessing database objects, where `{:id}` corresponds to
* the primary key of the database object, and can be accessed in the controller as
* `$this->request->id`.
*
* If you're using a relational database, such as MySQL, SQLite or Postgres, where the primary key
* is an integer, uncomment the routes below to enable URLs like `/posts/edit/1138`,
* `/posts/view/1138.json`, etc.
*/
// Router::connect('/{:controller}/{:action}/{:id:\d+}.{:type}', array('id' => null));
// Router::connect('/{:controller}/{:action}/{:id:\d+}');
/**
* If you're using a document-oriented database, such as CouchDB or MongoDB, or another type of
* database which uses 24-character hexidecimal values as primary keys, uncomment the routes below.
*/
// Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}.{:type}', array('id' => null));
// Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}');
Поэтому вам нужно раскомментировать один из этих двух разделов в зависимости от формата ваших идентификаторов. Они используют регулярные выражения с параметром id, чтобы убедиться, что они не соответствуют аргументам URL, которые не являются идентификаторами. Кстати, первый маршрут устанавливает значение по умолчанию для идентификатора в null
что не совсем понятно для меня, потому что я не думаю, что маршрут когда-либо будет совпадать с нулевым значением, но в любом случае, именно так вы устанавливаете значения по умолчанию для своих параметров.
Обратите внимание, что если вы сделаете это, ваш метод действия контроллера должен выглядеть следующим образом:
public function view() {
$id = $this->request->id;
// or an alternative that does the same thing
// $id = $this->request->get("params::id");
// ... etc ...
}
Единственный способ передать части URL в качестве аргументов в метод действия вашего контроллера - это использовать 'args'
пары.
Вы не используете именованные параметры в вашем маршруте, поэтому просто выведите следующее в вашем представлении:
<?php echo $this->html->link($question->title, array('controller'=>'questions', 'action'=>'view', $question->id));?>
Ваша подпись функции в QuestionsController должна быть просто:
public function view($id) {}