• Как понять принципы ООП?

    onqu
    @onqu
    weasy
    Чтобы понять принципы ООП, книги не требуются. Взгляните вокруг себя. Всмотритесь в любой объект в реальном мире, опишите его наиболее подробно (материал, размер, цвет, вес, плотность, составные части и т.д.), это будут его свойства. Опишите, что и каким образом этот объект умеет делать (включаться, складываться, кушать электроэнергию, взаимодействовать с другими объектами или окружающей средой и т.д.), это будут его методы. Подумайте, для чего используется этот объект, что ему нужно изменить или добавить, чтобы использовать в других условиях или целях, и на основе всех собранных знаний создать более удобный экземпляр, это будет наследование и полиморфизм. Теперь немедленно забудьте обо всем, используйте объект по назначению, это будет инкапсуляция. Дальше останутся только тонкости выбранного Вами языка, шаблоны, методологии и прочаяие ересь тренды.
    Ответ написан
    2 комментария
  • Запретить коммит файла, не удаляя его с репозитория (git)?

    onqu
    @onqu
    weasy
    Можно использовать стратегию слияния, указав её в файле .gitattributes:
    persistence.xml merge=ours
    Ответ написан
    Комментировать
  • Почему не работает preventDefault на submit?

    onqu
    @onqu
    weasy
    #cartForm - должен быть id формы. И, желательно, проверить консоль на наличие ошибок.

    <form id="cartForm" method="post">
        <input type="text" />
        <input type="submit" />
    </form>


    // Событие на id формы
    $("#cartForm").on('submit', function (e) {   
        e.preventDefault();
        
        // Сохраняем сслыку на форму
        var form = this;
        
        $.ajax({
            url: 'some url'
        }).done(function(data) {
            // Ajax выполнен, отправляем форму
            form.submit();
        });
    });
    Ответ написан
    3 комментария
  • Что делать с ошибкой [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;
    Ответ написан
    Комментировать
  • Как получить исходящее значение программы на PHP?

    onqu
    @onqu
    weasy
    Чтобы функция file_get_contents возвращала данные, запрашиваемые через url, нужно включить директиву "allow_url_fopen" в php.ini. Проверить можно через phpinfo().

    www.php.net/manual/ru/filesystem.configuration.php...

    Советую посмотреть документацию по использованию cURL: www.php.net/manual/ru/book.curl.php
    Ответ написан
  • Как правильно сохранить алиас тэга в самом сервисе в 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" ]
    Ответ написан