Ответы пользователя по тегу Symfony
  • Есть ли у кого примеры использования Beanstalkd в Symfony через bundle Pheanstalk?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Используйте https://github.com/bernardphp/BernardBundle

    Хотелось бы в идеале, чтобы можно было в очередь отправить job-у, в которой будет указано - название сервиса Symfony,


    Лучше какой-то идентификатор джобы, ибо как-то не логично что задача знает кто ей будет заниматься. Ну то есть вам приходит какая-то задача с каким-то типом, и какой-то роутер разрулит какой сервис будет ею заниматься.
    Ответ написан
    Комментировать
  • По какой причине при сохранении сущности с отношением one to many, не записывается id на связь?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Картинкам не надо знать о продуктах. Минимизируйте количество двусторонних ассоциаций.

    Так же почитайте про каскадные персисты.

    p.s. Подобные вопросы следует удалять так как "легко гуглится" или просто достаточно прочитать документацию. Не ленитесь иначе все будет и дальше плохо.
    Ответ написан
  • Правильный ли, подход к проектированию приложения в symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Не правильный. Читайте Эрика Эванса. Читайте про unit of work. Читайте про "save your repositories from save".
    Ответ написан
    Комментировать
  • Как правильно работать с объектами выборки doctrine в Symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    дополню ответ Юрий

    Во первых, это на столько здоровый объект реляции images, что отдебажить его можно только с помощью функции dump.


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

    По поводу коллекций, в Doctrine есть такая штука как Collection. Вы должны понимать что в доктрине вы оперируете не табличками в базе, а объектами. Строите именно объектную модель вашей системы. В этом ключе можете почитать что такое "агрегат сущностей". В вашем случае у вас агрегат будет состоять из двух сущностей. Product и его Image. Например если вы захотите сделать добавление картинок, вы можете сделать так:

    /**
     * usage: $product->addImage($image);
     */
    public function addImage(Image $image)
    {
        $this->images->add($image);
    }


    А коллекция сама выполнит persist новой сущности. Таким образом количество репозиториев уменьшается до количества корней агрегатов сущностей. В вашем примере "корнем", то есть вершиной графа взаимоотношений объектов в контексте продуктов, является сам продукт. А потому репозиторий мы будем делать только для продуктов. Все остальное внутри оного разруливается либо при помощи коллекций.

    При работе с доктриной вообще полезно представлять себе, что никакой базы данных у вас нет. Что данные просто живут между запросами где-то там, в памяти. Это должно помочь вам "абстрагироваться" и перестать смешивать "сущности" и "таблицы".

    К примеру "новички" в доктрине любят персисть сущность даже для обновления. Они путают `persist` и `save`. Так вот, если вы загрузили сущность из базы через доктрину, то сущность уже попадает в unit of work. И делать persist уже не нужно, этот метод только для того чтобы доктрина узнала о чем-то новом. А так она и так знает про эту сущность. В итоге вы можете просто что-то поменять и вызвать flush. То есть репозиторий - это тупо хранилище. Хранилище умеет хранить. Изменять то, что оно хранит оно не может.

    Так же рекомендую на тему репозиториев почитать это:

    www.whitewashing.de/2013/03/04/doctrine_repositori...

    Ну и в целом.

    https://www.youtube.com/watch?v=rzGeNYC3oz0 - доклад о том как готовить доктрину от авторов оной.

    От себя лишь добавлю простые правила:

    - Не используйте напрямую доктриновские репозитории. Пишите свои, а в них уже юзайте доктриновские. Не стоит размазывать доктрину по всему проекту, потом это будет нереально поддерживать.
    - Не наследуйтесь от EntityRepository. Это внутренний механизм доктрины общего назначения. Используйте их в своих репозиториях со своим интерфейсом, повышая специфичность и ужесточая контроль за тем кто что юзает.
    - Старайтесь использовать entity manager только в своих репозиториях и каких то небольших сервисах. Не размазывайте все по всюду.

    что очень сильно срет память.


    Доктрина гарантирует вам что в памяти будет всегда только один инстанс сущности. То есть если у вас есть 10 объектов одного типа и имеющих один объект, это все будут ссылки на одну сущность. В вашем случае у вас просто циклическая ссылка между продуктами и изображениями. dump циклические ссылки не особо умеет.

    Это логичное ограничение, дабы не возникало ситуаций что вы обновили что-то в одном экземпляре сущности и что-то в другом, и в базу попадут только часть изменений. За подробностями - читайте документацию к доктрине в отношении UnitOrWork и Identity Map.
    Ответ написан
  • Как правильно использовать Symfony form с ReactJs?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    никак. Вам не нужны формы. Вам нужно тупо замэпить json на объект (или массив) и тупо провалидировать.

    symfony/forms нужны тогда, когда симфони вам должен рендрить формы. у вас этим занимается реакт.
    Ответ написан
  • Репозиторий для поиска в БД?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вроде return new Post($searchResult) ?


    php.net/manual/en/reflectionclass.newinstancewitho...

    То что вам предстоит написать называется гидраторы. Они берут стэйт и запихивают его в объект минуя методы (напрямую по мэппингу). Альтернатива - сделать статический метод конструктор который будет делать все то же самое но уже почти без рефлексий. Третий вариант - прокси классы (то как это делает доктрина).
    Ответ написан
  • Если ли смысл в ОРМ для моего случая?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть ли порог когда использование ОРМ становится неоправданым/оправданым? Где он?


    ORM-ки нужня для одного конкретного типа систем - OLTP (On-line Transaction Processing)

    У меня в приложении есть модуль который работает с бд Solr


    У вас есть документы, в документно ориентированных базах данных нет связей. Потому вам нужен Object Document Manager а не Object Relational Mapper.

    Каждый документ может имеет поле parent в котором сохранен ид-родителя, дальше ид-прародителя, дальше прапрародителя итд.


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

    бд в режиме read-only


    Тогда точно не нужна ORM/ODM.

    Итд. Иногда какая-то дополнительная трансформация.


    Но это же трансформация на уровне формирования результата выборки, так? Если так - то это опять же не та проблема.
    Ответ написан
    3 комментария
  • Как добавить метод к классу если переопределить класс нельзя?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    завернуть работу с этими сервисами в еще один сервис который собственно будет выступать фасадом и скрывать всю грязь что вы делаете что бы было удобно.
    Ответ написан
    1 комментарий
  • Как использовать gulp-uncss на Symfony с шаблонизатором Twig?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    gulp-inject в симфони шаблоны делал когда-то.
    Ответ написан
    Комментировать
  • Как по максимуму использовать Bootstrap 3 на Symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1. в этом нет смысла. Можно выделить critical-path css и хватит.
    2. это делается не при помощи бандлов а при помощи всяких инструментов для сборки фронтэнда.
    3. тут тоже симфони не причем.

    Короч рецепт успеха - фронтэнд отдельно, бэкэнд отдельно.
    Ответ написан
    2 комментария
  • Как выбрать данные из таблицы для которой не создан класс ORM в symphony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    DBAL, NativeSQL
    Ответ написан
    Комментировать
  • DQL запрос в symfony (связь много ко многим)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А как получить список акций, которых нет у заданного пользователя?


    Перефразируя. Вам нужен список акций всех пользователей кроме конкретного, нет?

    SELECT s.stockname FROM Stocker\StockBundle\Entity\Userstock s
    WHERE s.user != :user


    где :user это id юзера.

    Вообще такая штука. Если вы хотите оперировать SQL и т.д. то оперируйте. Напишите свой native query и т.д. А еще лучше - откажитесь от доктрины. Она хороша тогда, когда вы погружаетесь в предметную область и больше тратите время не на SQL/базы данные а на грамотное выстраивание взаимоотношений ваших сущностей.

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

    p.s. StockBundle это плохая идея. По сути если у вас есть что-то типа CoreBundle (общий бандл) - то вы уже проиграли в плане разделения логики на "отдельные части". Границы проведены неверно.
    Ответ написан
  • Как правильно добавить метаданные к сущности Symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вариант первый (тупой) - docs.doctrine-project.org/projects/doctrine-orm/en...

    Вариант второй (чуть более сложный и возможно более правильный) - страницы, категории и т.д. ничего не знают о метаданных. Метаданных знают за каким ресурсом они закреплены (урл, идентификатор сущности + сущность) и т.д. Мэпится все это сервисами и т.д. Так как нам в любой момент времени нужно всегда только один набор метаданных - нагрузку это не добавит, а вы сможете расширять это дело как хотите, и все изменения относящиеся к метаданным будут изолированы.
    Ответ написан
    5 комментариев
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как их организуете (их тогда будут сотни)?


    Раскидываю по неймспейсам. Скажем все действия относящиеся к юзерам находятся в папке Users.

    Только вы учитывайте что CQRS это прикольно но особо не нужно. К примеру это сразу подразумевает что вы используете UUID вместо автоинкрементов и прочей чуши. Можете сделать хотя бы как Дядя Боб предлагает в своей Clean Architecture. Просто сервис на каждое действие.

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис


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

    Раньше для дополнительных действий мне достаточно было использовать что-то вроде beforeUpdate/afterCreate модели.


    ну а сейчас вы будете эти вещи в сервисы пихать. Причем возможно не в один сервис. Вообще старайтесь не делать "хуков" и не будет с ними проблем. Есть к примеру DomainEvents такая штука, ну и можно все эти "дополнительные действия" в хэндлерах команд делать.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?


    Просто забудьте об этих ивентах.

    ACL. Где храните указанную логику?


    Есть в симфони security vouters, а дальше все зависит от того что вы делаете.

    Как вы версионируете подобные проекты? А если нужна "N-1" рабочая версия на продакшене?


    git + docker теги в мастере. Ветки нужно плодить только тогда, когда у вас система деплоится кастомерам и нужно поддерживать сразу кучу версий. Называется это gitflow.

    На какие проекты (точнее, на код) можете посоветовать посмотреть для лучшего понимания? Ссылки на репозитории?

    На гитхабе катострофически мало примеров хороших приложений на симфони. Да и не только на симфони - в принципе найти в открытом доступе сложный проект - это нереально. NDA и все такое. Такие системы обычно очень дорогие и закрытые со всех сторон.

    p.s. почитайте книжки:

    - Эрик Эванс - Предметно ориентированное проектирование
    - Крэйг Ларман - Применение UML 2.0

    p.p.s. Все ваши загоны не имеют никакого смысла если вы не будете пользоваться практиками вроде Test-Driven-Development, ну или хотя бы покрывать систему интеграционными тестами. Без этого вы не сможете делать частный мелкий рефакторинг, а без этого ваша система быстро превратится в легаси.
    Ответ написан
  • Как исправить ошибку при установке пакета в composer?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    illuminate/filesystem v5.1.6 requires symfony/finder 2.7.*


    вот и весь ответ. Конфликт версий зависимостей.
    Ответ написан
    Комментировать
  • Как перенести проект с Codeigniter 2.2 на Laravel 5.2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    как его относительно безболезненно перенести на Laravel/Symfony.


    1) подключаем отдельные симфони компоненты и планомерно переводим на них проект. Ну и не только симфони компоненты, в целом компоненты которые не привязаны к конкретному фреймворку.
    2) выносим логику из контроллеров в сервисы (если они у вас есть), подключаем какой контейнер зависимостей. Делаем контроллеры тонкими. Сервисы потом чистим от зависимостей от CI сначала постепенно вынося их все в какие-то маленькие сервисы и потом просто избавляясь от них.
    3) лепим сверзу HTTP kernel который будет прокидывать запросы на новые или на старые контроллеры.
    4) ???
    5) profit.

    https://www.symfony.fi/entry/rewrite-your-legacy-p... - рекомендую ознакомиться.
    Ответ написан
    Комментировать
  • Где найти русскоязычную литературу / документацию symfony3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Пользуетесь ли таковыми русско-язычными источниками?


    Они имеют свойство очень быстро устаревать.
    Ответ написан
    Комментировать
  • Как в Symfony2 добавить переменную в base layout?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть блок кода, назовем его меню, который одинаковый на всех страницах


    если данные берутся из БД и как настроить получение этих данных в одном месте?


    https://symfony.com/doc/current/book/templating.ht...
    Ответ написан
    1 комментарий
  • Как организовать следующую логику?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    я не пойму смысла тогда от этого MVC если это почти тот же flat-php


    Symfony request/response фреймворк. MVC - web так не работает. То что на бэкэнде называют MVC на самом деле завется mediating controller MVC или MVA.

    Ну и опять же, где тут flat php? Это по сути возможность делать "под запросы" и реюзать код. Что-то типа виджетов.

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

    Не зацикливайтесь на MVC, потому что люди часто проигрывают, думая что модель это доктриновские сущности и только. А есть еще сервисы - это тоже часть модели. И суть вся в разделении ответственности (контроллеры конвертят HTTP запросы в вызовы методов модели и конвертят состояние модели в HTTP ответы и только).
    Ответ написан
    7 комментариев