2014-11-27 2 views
0

Я начал изучать мир Symfony 2 и сталкивался с некоторыми действительно странными проблемами, я бы не подумал, что они могут произойти в такой профессиональной среде. Я покажу вам проблемы, с которыми я сталкиваюсь один за другим:Как решить некоторые проблемы в symfony 2?

1) Как получить последнее действие? я нашел только это решение, которое 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: Маршрутизация: lawyersearch» является другой формат, чем когда я пришел прямо из маршрута. Вторая проблема заключается в том, что мне также нужно перенаправить GET-параметры (я думаю, POST тоже). Есть ли способ, которым я не должен заботиться об этом?

3) Как использовать шаблон по умолчанию без использования этой аннотации:

/** 
* @Template() 
*/ 
public function indexAction() 
{ 
    return array(); 
} 

Я не хочу иметь, прежде всего, мои методы эту аннотацию; Я знаю, что могу поместить его в верхнюю часть определения класса. Есть ли способ достичь этого? Единственное решение, которое я вижу, - это написать BaseController, который определяет по методу из модуля/контроллера/действия шаблон по умолчанию.

4) Я нашел классы, которые используют общедоступные атрибуты, например. Symfony \ Component \ Validator \ Constraints \ Length, например. public $ max;

Как это решить? Очень странно, потому что это не профессионально использовать публичные атрибуты.

Надеюсь, у кого-то есть простые решения для этого. Это было бы крайне неудобно, если бы у Symfony 2 было так странное поведение во многих случаях. 4 странных вещи, через 2 дня с тех пор, как я начал исследовать его. Это дает мне ощущение, что есть гораздо больше, когда я продолжаю.

Пожалуйста, подтвердите, что никакое другое решение от каркаса или решения не существует. Спасибо

+0

Symfony2 - это всего лишь фреймворк, и он не должен предоставлять ВСЕ и КАЖДУЮ функциональность, в которой вы нуждаетесь. Просто сделайте эту функциональность самостоятельно, если вы не можете ее найти. – xurshid29

ответ

1

1) При обращении к параметру запроса '_controller', вы углубляясь в внутренностей Symfony2. Они редко документируют что-либо, связанное с этим за пределами маршрутизации. Вы должны использовать действия контроллера более определенно, не пытайтесь автоматизировать слишком много на этом уровне.

2) Symfony2 не может учитывать динамические контроллеры.Вы знаете, что можно позвонить по номеру ->forward более одного раза и в рамках одного и того же действия контроллера. Это создает кошмар гнездования, с которым разработчики Symfony не были готовы справиться.

Это одна из причин, по которой $request = $this->container->get('request'); теперь устарел в пользу $stack = $this->container->get('request_stack');. Поскольку пересылка требует создания новых внутренних запросов.

3) Также устарела. Лучшие практики Symfony2 теперь препятствуют использованию @Template() с пустыми параметрами из-за потенциально нестабильной разработки действий/шаблонов. Вы должны явно определить, какой шаблон использовать, если вы используете его вообще. Это пригодится при работе с ответами только на данные. Вы не хотите, чтобы ваши ответы использовали шаблон автоматически, так как это привело бы к неожиданному поведению в вашем дизайне.

+0

Thx Flosculus, 1) печально, что так, я должен поддерживать старые URL-адреса и нуждаться в таком funtion, 2), чем это не работает eihter => Мне нужно сделать это на myown 3) нормально 4) просто плохое программирование, чем ... – Gizzmo

+0

@ Gizzmo Хотя 4) может быть немного несовместимым с общим дизайном symfony, это неплохая практика. Использование публичных свойств является парадигмой более старых языков ООП и включено в PHP. Если когда-либо истинные геттеры и сеттеры будут внедрены в PHP, вы больше не будете считать его плохим дизайном. – Flosculus

+0

wut ;-) Неплохая практика? уверен, что это плохо. Но что вы подразумеваете под «истинными геттерами и сеттерами»? – Gizzmo

1

1) Используйте Constant: __FUNCTION__ http://php.net/manual/en/language.constants.predefined.php

2) Попробуйте setMethod по $ запросу: $this->get('request')->setMethod('POST');

3) Я не знаю, вероятно, не представляется возможным.

4) Symfony\Component\Validator\Constraints\Length является одним из ограничений: http://symfony.com/doc/current/book/validation.html#constraints

Смежные вопросы