Ответы пользователя по тегу Symfony
  • Какую CMS выбрать?

    onqu
    @onqu
    weasy
    Посоветуйте целесообразно ли делать простые проекты на фреймворках типа Laravel, Symhony, Yii и т.д..

    Нет. Потратите времени и сил больше, за это Вам не доплатят. Исключение, если заказчик сам желает за базу брать фреймворк и готов платить.
    Ответ написан
    Комментировать
  • Симфони крэшится при отправке нескольких запросов одновременно. Это нормально?

    onqu
    @onqu
    weasy
    При отправке двух конкурентных запросов выкидывается ошибка уровня Warning при переименовании файла в кеше, то есть один из процессов делает это раньше другого. На деве уровень Warning по умолчанию критичен.

    На проде ошибки нет, потому что кеш не генерируется каждый запрос, как на деве. Либо ошибка все же присутствует, но уровень Warning не критичен - смотреть лог.
    Ответ написан
    5 комментариев
  • Что делать с ошибкой [Semantical Error] symfony 2?

    onqu
    @onqu
    weasy
    Класс MinLength был удален с версии 2.3, точно не помню. Вместо этого следует использовать класс Length с ключами min или max.

    /**
         * @ORM\Column(type="string", length=250)
         * @Assert\NotBlank()
         * @Assert\Length(min=5, max =250)
         */
        protected $answer;
    Ответ написан
    Комментировать
  • Как правильно сохранить алиас тэга в самом сервисе в Symfony2?

    onqu
    @onqu
    weasy
    Для передачи аргумента в сервис через конфигурацию есть три способа:
    1. В конструктор
    2. Через сеттер
    3. Напрямую в свойство

    Необходимо определить, что предстоит делать с сервисами в дальнейшем. Использование алиаса в данном случае выглядит избыточным, так как можно использовать уникальный id сервиса.

    Воспользуемся последним примером со страницы:
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
    use Symfony\Component\DependencyInjection\Reference;
    
    class TransportCompilerPass implements CompilerPassInterface
    {
        public function process(ContainerBuilder $container)
        {
            if (!$container->hasDefinition('acme_mailer.transport_chain')) {
                return;
            }
    
            // Получаем определение сервиса для хранения объектов транспорта
            $definition = $container->getDefinition(
                'acme_mailer.transport_chain'
            );
    
            // Получаем все сервисы транспорта то тегу
            $taggedServices = $container->findTaggedServiceIds(
                'acme_mailer.transport'
            );
    
           // Задаем инъекцию каждого транспорта в хранилище
            foreach ($taggedServices as $id => $tagAttributes) {
                // Вложенный цикл перебирает все теги каждого сервиса, здесь надо быть аккуратным
                foreach ($tagAttributes as $attributes) {
                    $definition->addMethodCall(
                        'addTransport',
                        array(new Reference($id), $attributes["alias"])
                    );
                }
            }
        }
    }


    Рассмотри два случая.

    1. Нужно обработать данные каждым транспортом:
    Из документации следует, что все экземпляры Transport окажутся в массиве у объекта TransportChain. Ключи массивов будут соответствовать алиасам. Данная схема вполне оправдана.

    2. Нужно обработать данные только одним экземпляром класса Transport:
    В этом случае выше приведенные затраты на создание пачки объектов класса Transport не оправданы, вместо этого проще всего изменить определение сервиса TransportChain, скармливая ему DI контейнер:

    <services>
        <service id="acme_mailer.transport_chain" class="TransportChain">
            <call method="setDI">
                 <argument type="service" id="service_container" />
            </call>
        </service>
    </services>


    Далее, используя CompilerPass передать в TransportChain массив с id сервисов Transport. Данные действия позволят получить нужный транспорт по id прямиком из сервис контейнера.

    $transports = array_keys($container->findTaggedServiceIds('acme_mailer.transport' ));
    $definition->addMethodCall('setTransports', [ $transports ]);
    Ответ написан
    Комментировать
  • Как передать сервис в слушатель формы EventListener Symfony 2?

    onqu
    @onqu
    weasy
    Раньше аргументы в yml были без кавычек.

    // services.yml
    services:
        kernel.listener.url:
            class: App\CoreBundle\Form\EventListener\Url
            arguments: [ "@router" ]
    Ответ написан