Ответы пользователя по тегу Symfony
  • Как происходит передача события в вебсокет канал с сервер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1. Поскольку я сомневаюсь что вы написали свое приложение на reactphp (ну то есть это не то же приложение что сокеты слушает), то вам нужно будет организовать общение этих процессов. Тут подойдет какая-нибудь штука вроде zeromq.

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

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

    p.s. Я не рекомендую вам связываться с websockets на php, проще развернуть примитивный сервер на socket-io и через тот же zeromq передавать нужные сообщения между node и php. Проблем меньше будет как для клиента (socket-io намного проще с точки зрения клиента) так и сервера (socket-io намного более надежное решение).
    Ответ написан
  • Есть ли у кого примеры использования 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...

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Хочу сделать большой проект для себя,


    Шутки ради - ответ вы указали в тегах - Symfony. Но это холивара ради. Идем дальше.

    сначала решил изучить laravel, затем надеюсь взяться за Symfony.


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

    То есть по сути фундаменальная разница между Symfony и Laravel на данный момент - это то что Laravel полагается на конвеншены а симфони на явную конфигурацию. Все остальное упирается в ORM по умолчанию.

    Как проектировать работу моделей, роутинга и т.д.

    для начала постарайтесь убрать в голове термин "модель" поскольку это очень абстрактная штука, которая ничего не говорит о том как это реализуется. Модель пользователя вполне может быть представлена одним объектом в виде active record сущности и все такое но модель подсистемы платежей никак не может быть представлена только одним классом. Скорее всего это будет граф объектов и это все еще модель.

    Если вы можете полностью спроэцировать нормализованную базу данных на объекты и это идеально вписывается в вашу бизнес логику - то делаейте так. Если же нет и вам близка идея OO-first то рекомендую просто взять Doctrine для Laravel (в плане интеграции все замечательно).

    Где писать всю основную логику? Я так понимаю в контроллере, но есть люди которые мне советовали писать её в модели, а также в представлении.


    Представление - штука пассивная. Шаблоны != представление. и "основную логику" они уж точно содержать не должны, они должны содержать логику относящуюся к представлению и только (например форматирование денег, дат и т.д.)

    Контроллеры - это штука которая работает с HTTP. То есть занимается тем что берет HTTP запрос, выдирает из этого данные, валидирует (FormRequest в laravel) и просит модель сделать что-то с этими данными. Никакой "основной логики" в контроллерах быть не может и не должно.

    Если хотите пример когда "логика в контроллерах" вылазит боком - если вам нужно поддерживать несколько версий API такой подход вылазит либо дикими сложностями на уровне мидлвэров, либо кучей дублированной логики. А в Laravel все же неплохой контейнер зависимостей и повыносить логику в сервисы более чем легко.

    "выносить логику в модель" не значит выносить ее в модельки элоквента. Иногда это значит выносить в сервисы. У меня к примеру вся логика (не выборки) вынесены в сервисы. По сервису на каждое действие. Надо добавить заказ - у меня для этого есть сервис. Зарегистрировать юзера - сервис. Я иногда ленюсь и для вещей вроде "добавить коммент" у меня сервисов бывает что и нет, просто потому что у меня это происходит одним методом в сущности того, что я комменчу. Но по хорошему я все выношу в сервисы так как так мне будет проще потом менять то что я сделал раньше.

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

    Не могли бы в целом подсказать, как это всё "кушается" с нуля, если брать большой проект, к примеру интернет-магазин, CRM, CMS и т.д. Может есть мануалы какие. Спасибо.


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

    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.

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


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

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

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

    Короч рецепт успеха - фронтэнд отдельно, бэкэнд отдельно.
    Ответ написан
  • 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...

    Вариант второй (чуть более сложный и возможно более правильный) - страницы, категории и т.д. ничего не знают о метаданных. Метаданных знают за каким ресурсом они закреплены (урл, идентификатор сущности + сущность) и т.д. Мэпится все это сервисами и т.д. Так как нам в любой момент времени нужно всегда только один набор метаданных - нагрузку это не добавит, а вы сможете расширять это дело как хотите, и все изменения относящиеся к метаданным будут изолированы.
    Ответ написан
  • Проект со сложной логикой на 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...
    Ответ написан