Как решить некоторые проблемы в Symfony 2?

0

Я начал изучать мир 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 дня с тех пор, как я начал исследовать его. Это дает мне ощущение, что есть гораздо больше, когда я продолжаю.

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

  • 0
    Symfony2 - это просто фреймворк, и он не должен предоставлять ВСЕ и КАЖДЫЙ функционал, который вам нужен. Просто сделайте эту функцию самостоятельно, если вы не можете ее найти.
Теги:
frameworks

2 ответа

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-адреса и нуждаются в такой функции, 2), чем это не работает eihter => я должен сделать это на моем собственном 3) в порядке 4) просто плохо программирование, чем ...
  • 0
    @Gizzmo Хотя 4) может быть немного несовместимо с общим дизайном Symfony, это не плохая практика. Использование открытых свойств - это парадигма старых языков ООП, которая была включена в PHP. Если в PHP реализованы настоящие методы получения и установки, вы бы больше не считали это плохим дизайном.
Показать ещё 2 комментария
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню