• Будет ли данный функционал избыточен для класса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    не будет ли это излишним?


    Вы будете внедрять в ваши сущности сервисы, а это уже показать плохого решения.

    В таких инструментах как Doctrine это решаетс за счет оборачивания объекта-сущности в прокси-класс, который при обращении к полю будет загружать нужные сущности. В этом случае наша сущность представляет собой простой PHP объект. а за магию отвечает прокси-объект. Максимально гибко. Ну и выходит так что когда мы создаем сущность - у нас это просто объект, когда мы ее достаем из базы - уже обернутое в прокси объект.

    Словом... да это нарушение принципа единой ответственности и сущность начинает делать неподобающие ей дела. Но с другой стороны простота реализации делает этот подход более чем удобным. Так что если вопрос стоит именно "как делать" и при этом вы не хотите использовать готовые инструменты вроде Doctrine, писать что-то подобное самостоятельно будет дико дорого а потому лучше пойти на компромис.
    Ответ написан
    Комментировать
  • Кто понял docker?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    для доступа к ФС свой


    Нет, для доступа к ФC используйте именованные волумы (named volumes). Контейнеры (data-only) для этог оне нужны.

    Между собой без проблем, а как отправить это дело на рабочий сервер, не ручками?


    docker registry, либо используем платный либо ставим у себя и там храним образы. То есть если кто-то решил обновиться до php7.0 мы должны заменить базовый контейнер, проверить что все работает, запушить... а у всх все подтянется.

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


    Именно, никакого отношения к докеру. Я обычно миграции накатываю прямо при старте контейнера. Так надежнее.

    Может кто поделиться ссылочкой на статью

    На статью - нет, их много. Могу поделиться тем как я использую docker на своих проектах. Там описан процесс сборки и деплоя в крадце. В идеале сборкой и деплоем должен заведовать CI-сервер а не руками локально:

    https://github.com/intellectsoft-uk/symfony-skeleton
    Ответ написан
    5 комментариев
  • Загрузка файлов в Symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Документация по этому поводу оставляет желать лучшего


    А что вы хотите от документации? В самом примитивном варианте вам уже сказали:

    public function uploadFile(File $file) {
         $file->move($this->uploadDir, $this->generateUniqName($file));
    }


    Не нравится хардкодит пут к файлу, хочу автоматизировать


    Путь иньектится из контейера в виде параметра.

    services:
    
        file_uploader:
            class: FileUploader
            arguments: ['%kernel.root_dir%/../web/uploads']


    а еще вместо этого можно заюзать FlySystem тот же как абстракцию над файловой системой. Тогда вообще все удобненько.

    мне также не нравится vich uploader bundle потому я юзаю свое решение. На днях же в симфони gitter-е выкладывали относительно приличный бандл для аплоада: https://github.com/atom-azimov/uploader-bundle но в бою я его не проверял, хотя идеологически он вроде бы правильный.
    Ответ написан
  • Есть ли способ полностью абстрагироваться от баз данных?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Например просто на сервере сохранять переменные как глобальные, а внутренний сервис уже как хочет так и хранит их.


    Глобальные переменные - это плохо. Можете использовать для них любое key-value хранилище.

    Есть ли способ полностью абстрагироваться от баз данных?


    Вам нужен Data Mapper + репозитории + unit of work. Увы я не знаю реализаций подобного в JS. Есть js-data но я не уверен что оно решит вашу проблему. В Java/.NET/PHP мире есть солюшены вроде Hibernate/nHibernate/Doctrine которые все это имеют из коробки но это отнюдь не простые решения.

    В целом достаточно "запереть" работу с базами данных в какие-то объекты-репозитории, которые уже будут разруливать все за вас, а вы из вне будете считать что все хранится в памяти.

    updated

    вспомнил про проектик: https://github.com/Breeze
    Ответ написан
    Комментировать
  • Как понять следующие строки(для знающих Zend)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    php.net/manual/ru/language.namespaces.importing.php

    Как я понимаю use Application\Controller\BaseAdminController заменяется теперь на BaseController


    Нет, мы просто создаем элиас на BaseAdminController с тем именем который нам хочется. Далее читаем документацию по PHP. Zend тут вообще не причем.
    Ответ написан
    Комментировать
  • Почему современный фрамеворки отказываются от recoverable error?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что создание ошибок вида E_USER_NOTICE/E_USER_WARNING уже вызовет завершение работы приложения.


    error reporting level вы все еще контролируете. Вообще в продакшен коде у нас не должно быть нотисов или варнингов, но иногда проще просто отключить.

    В целом все идет к более явной обработке ошибок. Осталось только оператор подавления ошибок убрать.

    Есть сервис в вакууме рассылки смс к которому подключено два шлюза (основной и запасной).


    Ваша ситуация прекрасно разруливается исключениями.

    я уже не могу так просто бросить себе recoverable error и приходиться городить огород


    Научитесь пользоваться исключениями. В php7 в принципе даже ошибки парсинга теперь вызывают исключения.
    Ответ написан
  • Что было не так с ArrayHelper::index до Yii2 2.0.8?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Это Yii.

    Ancient-Aliens.jpg

    В целом просто посмотрите историю коммитов. Вот с этого коммита появился третий параметр:

    https://github.com/yiisoft/yii2/commit/ef8b0a2be0f...
    Ответ написан
    8 комментариев
  • Как реализуется кэширование поиска?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как решаются подобные проблемы в серьёзных проектах?


    Никак. Оптимизируют сам поиск, используя денормализацию данных что бы максимально упростить поиск и сделать его как можно менее напряжным для сервера. Ну и что бы "сократить" количество запросов используют "приемы" вроде throttle/debounce на клиенте, что бы не на каждый кник мышкой слать запрос, а когда пользователь не проявлял активности, к примеру секунду.

    Частично эту проблему можно решить HTTP кешированием. То есть все парамеры поиска ходят в queryString а значит по одному URI мы можем иметь нужную страницу/данные. Однако вармат такого кэша будет занимать много времени, а сложность инвалидации будет так высока, что нужно 10 раз подумать прежде чем решаться на такое.
    Ответ написан
    1 комментарий
  • Как отсортировать массив по нескольким параметрам?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Давайте разбираться.

    У нас есть две сортировки. Сначала мы должны отсортировать по ключам, что бы добиться нужного порядка записи для случаев, когда у нас идет одинаковое количество вхождений строк для разных слов, а затем уже сортировать по количеству вхождений. Тут важно заметить что порядок сортировки обратный, от большего к меньшему. Учитывая это напишем такой вот простенький код:

    $arr = [
        'a1' => 2,
        'a2' => 1,
        'a4' => 5,
        'a3' => 5,
        'a5' => 7
    ];
    
    ksort($arr);
    arsort($arr);
    
    var_dump($arr == [
        'a5' => 7,
        'a3' => 5,
        'a4' => 5,
        'a1' => 2,
        'a2' => 1,
    ]); // true


    На вскидку не смог придумать ситуаций когда arsort сделает лишние перестановки.
    Ответ написан
  • Как начать работать с NodeJS?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    судя по ключевым словам (webgl, requirejs) а так же es6, у меня только один вопрос - при чем тут node.js?

    А так берете и начинаете.
    Ответ написан
    2 комментария
  • Что за формат хранения данных в mysql?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    просто серилизованные данные: php.net/manual/en/function.serialize.php
    Ответ написан
    Комментировать
  • Как через PHP выводить неограниченную вложенность элементов в массиве?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Проблема состоит в том, как всё это обрабатывать.


    Не совсем так. У вас сейчас проблема с формализацией задачи, что должно выходить в итоге.

    А вот если этих уровней может быть бесконечно много -- уже проблема.


    Курите в сторону графов и поиска в ширину.
    Ответ написан
  • Как из роутера передать данные дальше?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Читаем про инверсию контроля (Inversion of Control) что бы разобраться что кто и когда должен вызывать. Так же разберитесь где приложение а где его границы и что не входит непосредственно в это понятие (роутеры, контроллеры, шаблонизаторы и т.д.). Ну последнее это если вы хотите знать как правильно, для "бложиков" такое явное разделение не обязательно.

    После обработки его ответ можно передать уже в само приложение:


    Приложение ничего не должно знать о роутере, более того, оно должно иметь возможность существования без оного. Ваш роутер должен на основе своих правил вызвать метод приложения, обычно контроллера, который представляет собой прослойку между приложением и UI (в нашем случае HTTP).

    Но в этом случае если путей по сайту много довольно объемный код получается с перечислением всех вариантов роутинга.


    Просто не нужно использовать такой подход для задания конфигурации роутера. Используйте массивчики, декларативный способ задания конфигов. Тогда их можно инклудить, экстендить и крутить вертеть как угодно, давай гибкость управления всем этим добром.

    Но да, вы должны описать все маршруты явно, так потом будет удобнее работать, особенно на проектах где маршрутов этих реально много.
    Ответ написан
  • Как называется этот компонент?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Хм... роутер? В целом за "загрузку классов" отвечает автозагрузчик (например тот который генерит composer). Вам же нужно просто отдельный объект, который находит кого вызывать.

    p.s. посмотрите реализации популярных роутеров.
    Ответ написан
    Комментировать
  • Логирование при микросервисной архитектуре?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Каждый микросервис живет своей жизнью. Если мы отправили запрос от микросервиса A к микросервису B, а тот отправил запрос на C, микросервису A глубоко плевать что пошло не так. Он не знает ничего о C и знать ничего не должен.

    Логирование тут можно организовать точно так же как и в случае с исключениями. Каждый сервис в случае ошибки может отправить вызывающей стороне подробности что произошло, тот завернет это в свой ответ с указанием что было причиной ну и т.д.

    Но в логи сообщения будут ложиться каждым сервисом независимо. Возможность трекать цепочки ошибок есть, а далее можно агрегатором логов просто слать сообщения той команде, которая занимается тем или иным сервисом.
    Ответ написан
    Комментировать
  • Как правильно сравнить строки в JS?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я сравниваю строку с некоторыми константами


    Нет, вы сравниваете строку с одной константой, после чего просто прокиыдываете остальные константы как отдельные условия которые всегда истенны. А так как у нас там идет дизъюнкция то результат всегда будет истенным.

    -1 !== ['foo', 'bar', 'buz'].indexOf(str);
    Ответ написан
    1 комментарий
  • Как идёт взаимодействие между PHP/MySQL/Apache?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    то я вовсе не понимаю зачем нужен Apache (говорю именно о нём, т.к. ни о чем другом не слышал).


    Гуглим про HTTP

    Сейчас геморрой есть, чтобы поставить всё это и сконфигурировать, надо разбираться.


    Вам сейчас достаточно тупо php поставить. php.net/manual/ru/features.commandline.webserver.php Apache вам не нужен.
    Ответ написан
    3 комментария
  • Это и есть полиморфизм?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нет.

    Полиморфизм, как следует из названия, это когда что-то маскируется под что-то другое. Это свойство системы типов языка на котором вы пишите, он может позволять вам делать вещи, маскирующие свой внешний вид ("названия") но все же это не та же вещь. Ну и стоит заметить что у полиморфизма есть еще разные виды. Например:

    Параметрический полиморфизм. Это когда мы можем написать один код, с одним набором имен, которые работает с разными типами аргументов. Пример - шаблоны из C++ или дженерики в Java. То есть "имена" методов одинаковые, потому что они в одном экземпляре. Реализация одна, одно поведение. А вот аргументы могут отличаться.

    Ключевое отличие от ad-hoc полиморфизма, про который будет ниже в том, что наша реализация понятия не имеет что придет на вход. Может придти что угодно и с этим нужно будет работать, однако работать с любым типом мы будем абсолютно одинаково.

    Полиморфизм подтипов. При этом у нас как раз таки будет одни и те же имена и может быть совершенно разное поведение. Например мы можем создать какой-то базовый тип, который, к примеру, отправляет email-ы, и создать его подтип, который вместо отправки email-ов записывает в лог то что мы хотели отправить, после чего уже отправляет данные дальше другому объекту этого типа (шаблон проектирования декоратор).

    Многие путают полиморфизм подтипов с наследованием, подменяя эти понятия. Без наследования мы конечно же не сможем достичь иерархии типов, но это больше механизм а не принцип.

    Ну и еще есть одно серьезное ограничение. Если мы хотим заменить в системе объект какого-то типа на объект подтипа (грубо говоря наследника), то система не должна сломаться. То есть "другое" поведение нашего подтипа должно быть совместимо в плане интерфейса с базовым типом. Об этом можно почитать загуглил "Принцип подстановки Барбары Лисков".

    Ad-hoc полиморфизм - это пожалуй самый интересный вид полиморфизма с которым можно долго холиварить. По сути при этом виде полиморфизма, у нас одинаковые имена, а поведение зависит от входящих аргументов. Пример - перегрузка методов в C++. Интересен этот вид полиморфизма в основном тем, что он не является "настоящим".

    При динамической системе типов не требуется никаких дополнительных возможностей вроде той же перегрузки методов для достижения ad-hoc полиморфизма. Тупо кидаем что хотим в функцию, а там уже if-ами рагребаем или же приводим к какому-то одному варианту. Отдельные конструкции нужны в языках со статической системой типов. То есть нам нужно еще на этапе компиляции кода знать какие именно типы могут приходить в наши методы, и в зависимости от оных вызывать тот или иной код.

    Среди PHP-разработчиков немало тех, кто мечтает увидеть в этом языке с динамической системой типов честную перегрузку методов как например в Java или C++. Просто так, потому что if-ы это плохо и лучше уж пусть они будут неявные на уровне компилятора/рантайма.

    Полиморфизм с приведением типов - еще один вид "не настоящего" полиморфизма. Мы "эмулируем" полиморфизм за счет того, что на уровне рантайма языка происходят касты действительного в желаемое. Например в PHP мы можем выставить у функции тайпхинтинг string, и можем внутри иметь одно и то же поведение для всех входящих аргументов. Передать же в качестве аргумента мы можем все что можно скастить в строку.

    Собственно, это очень похоже на параметрический полиморфизм по смыслу, но далеко не так гибко и не дает того контроля за системой.
    Ответ написан
    Комментировать