Что не так с маршрутом Symfony 2 с параметром и именем - PullRequest
1 голос
/ 07 декабря 2011

У меня есть маршрут Symfony 2, например:

/**
 * @Route("/thing/add/{id}", name="addThing")
 */
function addThing(Request $req) {

, когда я получаю доступ к /thing/add/1, Symfony 2 жалуется:

В маршруте addThing отсутствуют некоторые обязательные параметры("id").

Но в профилировщике я вижу в разделе "атрибуты запроса", "id" = 1. Но в GET (или POST) ничего нет.В чем проблема?

ОБНОВЛЕНИЕ

Если я удаляю name="addThing", это работает ... но как мне получить доступ к этому маршруту для моего действия формы?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Я просто дополню ответ, предоставленный @ scube.

Прежде всего, вы не должны передавать объект Request непосредственно в функцию действия вашего контроллера. Причина в том, что аргументы в функциях такого типа (функции, используемые в качестве действий в контроллере) используются исключительно с целью преобразования части URL в аргументы. Например, если у меня есть аннотация типа @Route(/blog/{year}/{month}/{day), то для заполнения аргументов вам нужна функция действия, подобная этой:

public function blogViewAction($year, $month, $day) {
    // ...
}

Таким образом, $year будет заполнен аргументом year из URL, $month - month и $day - day. Имя переменной в URL-адресе должно совпадать с именем вашего аргумента.

Если вы хотите использовать объект запроса и находитесь в контроллере, вы запрашиваете его из контейнера внедрения зависимостей следующим образом:

$request = $this->get('request');

Это способ определения действия в контроллере. Ваше определение вашего маршрута должно выглядеть так же, как @scube сказал:

/**
 * @Route("/thing/add/{id}", name="addThing")
 */
public function addThing($id) {
    // ...
}

Убедитесь, что ваш маршрут зарегистрирован в Symfony2, введя php app/console router:debug. Это напечатает все маршруты, известные фреймворку в вашем проекте. Убедитесь, что имя addThing там и что отображение URL-адреса хорошее.

Наконец, даже если модификаторы области видимости не являются обязательными (public, protected, private), поскольку public является значением по умолчанию, рекомендуется всегда указывать его.

Надеюсь, это поможет.

С уважением,
Matt

0 голосов
/ 07 декабря 2011

Первое: почему в сообщении об ошибке упоминается «addNote», а не «addThing»?Второе: чтобы использовать значение id в вашем URL, вам нужно определить свою функцию следующим образом:

function addThing($id) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...