Я начал изучать мир Symfony 2 сейчас и сталкиваюсь с некоторыми действительно странными проблемами, я бы не думал, что они могут произойти в такой профессиональной среде. Я покажу вам проблемы, с которыми я сталкиваюсь один за другим:
1) Как получить последнее actionName? Я нашел только это решение, которое является imho полупрофессиональным:
$request->attributes->get('_controller');
// will get yourBundle\Controller\yourController::CreateAction
$params = explode('::',$request->attributes->get('_controller'));
// $params[1] = 'createAction';
$actionName = substr($params[1],0,-6);
Является ли это серьезным, я должен сделать некоторые дополнительные работы, чтобы получить его, почему.. Есть ли лучшее решение? Создание базового класса контроллера с помощью метода, например getActionName(), но почему я должен реализовать такие базовые функции в рамках. Есть ли другой способ?
2) Когда я пересылаю запрос, код в 1) не будет работать.
$request = $this->container->get('request');
$getParameterList = $request->query->all();
if (!empty($getParameterList['mode'])
&& $getParameterList['mode'] == 1) {
return $this->forward('AcmeDemoBundle:Routing:lawyersearch', array(), $getParameterList);
}
Причина, по которой он не будет работать, заключается в том, что "AcmeDemoBundle: Routing: lawyersearch" - это другой формат, чем когда я пришел непосредственно с маршрута. Вторая проблема заключается в том, что мне также нужно перенаправить GET-параметры (я думаю, POST тоже). Есть ли способ, которым я не должен заботиться об этом?
3) Как использовать шаблон по умолчанию без использования этой аннотации:
/**
* @Template()
*/
public function indexAction()
{
return array();
}
Я не хочу, чтобы выше всех моих методов была эта аннотация; Я знаю, что могу поместить его в верхнюю часть определения класса. Есть ли способ достичь этого? Единственное решение, которое я вижу, - это написать BaseController, который определяет по методу из модуля/контроллера/действия шаблон по умолчанию.
4) Я нашел классы, которые используют публичные атрибуты, например Symfony\Component\Validator\Constraints\Length, например public $ max;
Как это решить? Очень странно, потому что это не профессионально использовать публичные атрибуты.
Надеюсь, у кого-то есть легкие решения для этого. Это было бы крайне неудобно, если бы у Symfony 2 было так странное поведение во многих случаях. 4 странных вещи, через 2 дня с тех пор, как я начал исследовать его. Это дает мне ощущение, что есть гораздо больше, когда я продолжаю.
Пожалуйста, подтвердите, что нет другого решения в рамках платформы или решения. спасибо
1) Получая доступ к параметру '_controller'
запроса, вы вникаете в внутренние компоненты Symfony2. Они редко документируют что-либо, связанное с этим за пределами маршрутизации. Вы должны использовать действия контроллера более определенно, не пытайтесь автоматизировать слишком много на этом уровне.
2) Symfony2 не может учитывать высокодинамичные контроллеры. Вы знаете, что можно вызывать ->forward
более одного раза и в рамках одного и того же действия контроллера. Это создает кошмар гнездования, с которым разработчики Symfony не были готовы справиться.
Это одна из причин $request = $this->container->get('request');
теперь устарел в пользу $stack = $this->container->get('request_stack');
, Поскольку пересылка требует создания новых внутренних запросов.
3) Также устарел. Лучшие практики Symfony2 теперь препятствуют использованию @Template()
с пустыми параметрами из-за потенциально неустойчивой разработки действий/шаблонов. Вы должны явно определить, какой шаблон использовать, если вы используете его вообще. Это пригодится при работе с ответами только на данные. Вы не хотите, чтобы ваши ответы использовали шаблон автоматически, так как это привело бы к неожиданному поведению в вашем дизайне.
1) Использовать константу: __FUNCTION__
http://php.net/manual/en/language.constants.predefined.php
2) Попробуйте setMethod на $ request: $this->get('request')->setMethod('POST');
3) Не знаю, возможно, невозможно.
4) Symfony\Component\Validator\Constraints\Length
является одним из ограничений: http://symfony.com/doc/current/book/validation.html#constraints