Литиевая связь

Я пытаюсь создать свое первое приложение для 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) {}
Другие вопросы по тегам