Ответы пользователя по тегу Symfony
  • Книги для изучения symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Поработал некоторое время с Ruby on Rails и был в настоящем восторге после знакомства с MVC


    Symfony не MVC фреймворк если что.

    Решил ознакомиться с Symfony, но не нашел книг


    symfony.com/doc/current/book/index.html

    Отдельно хочу отметить что например Doctrine вообще никакого отношения к Symfony не имеет и ее нужно изучать отдельно по своей документации.

    Как вы изучали этот фреймворк?


    RTFM и все такое. Книжки про то как клепать контроллеры подходят только для "просто клепать контроллеры". В этом плане (как аналог RoR) лучше брать какой-нибудь Laravel.
    Ответ написан
    6 комментариев
  • В каком месте правильно писать запросы в symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В репозиториях.
    Ответ написан
    Комментировать
  • Как вызвать репозиторий в symfony 2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) Что-то мне подсказывает что валится оно на чем-нибудь вроде $product->find() а не на том что вы привели.

    2) Лучше делать так

    $this->get('doctrine.orm.entity_manager')->getRepository(Organization::class)


    3) А еще лучше регистрировать репозитории как сервисы

    4) А еще лучше, не наследоваться от доктриновский репозиториев и использовать свои, которым в конструктор передавать entity manager и там уже делать что душе вздумается. Пример (так как это должно быть, в реальных проектах можно упрощать)

    class DoctrineOrganizationRepository implements OrganizationRepository 
    {
        private $em;
        public function __construct(EntityManagerInterface $em) 
        {
              $this->em = $em;
        }
    
        public function getOrganization(int $id) : Organization
        {
               $organization = $this->em->find(Organization::class, $id);
               if (!$organization) {
                     throw new OrganizationNotFoundException();
               }
     
               return $organization;
        }
    }


    По сути наше приложение не должно слишком много знать о доктрине. Ну и еще удобнее регистрировать такие сервисы:

    services:
         organization_repository:
             class: MyApp\Service\Doctrine\DoctrineOrganizationRepository
             autowire: true


    5) Не дробите приложение на бандлы. Они для того что бы реюзать код. Если вы дробите систему на бандлы с мыслью "может потом реюзаю" - это пример преждевременной оптимизации. Вам нужен только AppBundle и то только ради маленьких шорткатов.

    Зависимостей между бандлами быть не должно. Они могут зависеть от библиотек. но не от бандлов.
    Ответ написан
    3 комментария
  • Загрузка файлов в 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 но в бою я его не проверял, хотя идеологически он вроде бы правильный.
    Ответ написан
  • Что за магия в symfony?

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


    1) Symfony - не MVC фреймворк, это request/response фреймворк. Более правильная терминология для HTTP фреймворка.

    2) Контроллеры - это не один класс, это в данном случае весь слой от точки входа, фронт контроллера, до непосредственно экшена контроллера. View в этом случае - это HTTP, пассивная вьюшка и только. Сама по себе она ничего не умеет, это тупо представление данных собранное контроллером.

    У этого подхода есть название - Model-View-Adapter или Mediating-controller MVC, но все это лишь бесполезные детали.

    3) ParamConverter-ы здорово уменьшают дублирование кода в контроллерах, однако работа с сущностями в контроллерах дело довольно опасное. Это своего рода компромис между "правильной архитектурой" и "стоимостью разработки.
    Ответ написан
    Комментировать
  • Разделение внутри бандла?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    когда бандл большой но не на столько чтоб делать 2 бандла


    Читаем symfony best practice - у вас должен быть всегда только один бандл. AppBundle. Все остальные варианты бандлов - только для самодостаточных вещей, которые вы хотите реюзать между проектами. Причем как правило "в бандл" заранее не стоит это заварачивать а уже когда будет видно что получилось что-то реюзабельное.

    Далее, разделение по функциональности - дело хорошее. Вот только не стоит забывать, что контроллеры к приложению имеют весьма посредственное отношение, это просто UI. Имеет смысл разделять по слоям/зонам ответственности + по функционалу. так у нас может быть такая структура:

    Controller
        User
           UserController
    Entity
       - User
           - UserProfile
           - UserCredentials
           - User
           - UserRepository (только интерфейс)
       - Downloads
           - какие-то сущности


    Словом, делайте так, как вам удобно. Но лучше пусть в одной директории будет 10 файлов, чем если бы у нас было 5 директорий и по 1-2 файла в каждом.
    Ответ написан
    Комментировать
  • Оправданно ли использование doctrine в хелпер классе symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    container-aware - знает про контейнер и может работать с ним, чего по хорошему оно не должно уметь делать.

    Хочу писать написать функцию которая достает записи из бд по id.


    Записи из БД или сущности? Это вопервых весьма большая разница, а во вторых уже же есть старый добрый $em->find(Entity::class, $id), парам конвертеры дефолтные и т.д

    функцию в хелпер классе который будет находиться тут AppBundle\Utils


    Вообще это весьма плохая идея. И про то что будет глобальная функция которая этим будет заниматься, и то что вы ее как статику в класс запихаете а не сервис сделаете, и то что Utils... это называется "мне было лень придумывать адекватное название".
    Ответ написан
    3 комментария
  • Немного про замыкания в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А каковы границы тут ?


    А тут никто никуда не ходит вообще. У вас есть скоуп функции и наружу вы ходить не можете. Вы можете снаружи прокидывать нужные переменные в скоуп вашего замыкания (use ($tax, &$total)). То есть вы просто даете вашему замыканию попользоваться этими переменными.

    Вернемся к "амперсанту". По умолчанию же все переменные передаются по значению, что означает что наша анонимная функция не может их изменить, туда просто скопируются значения. Амперсант же означает, что переменная $total будет передана внутрь замыкания по ссылке. В итоге вы меняеете эту переменную.

    p.s.
    Но в вашем случае в этом нет ровным счетом никакого смысла. Если вам надо просто сумму посчитать - вам стоит использовать функцию array_reduce, правда тогда придется изменить еще и способ, как вы храните ваши "продукты". А еще вот эта штука:

    $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                        strtoupper($product));


    Попахивает "дурными решениями". Пощадите тех, кто будет работать с вашим кодом через пол года (даже себя самого). Код должен быть не "коротким" а "понятным". Код чаще читают чем пишут. Все должно быть не двусмысленно, выражать что вы хотели сделать и не требовать комментариев (а все что требует комментариев выносится в приватные методы с адекватным названием).
    Ответ написан
    5 комментариев
  • Как решить проблему с роутингом в Symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Можно их как-то объединить?

    Вы можете указать у двух правил маршрутизации один экшен контроллера. Но не "объеденять правила". В целом не рекомендую "объеденять" эти штуки. С дублированием по другому борятся.

    По следующей проблеме - trailing slashes. читаем доку.
    Ответ написан
    Комментировать
  • Как правильно организовать и создать проект на Symfony 3?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Комментировать
  • Оптимизирует ли Symfony/Doctrine запросы к сущности?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    в смысле кеширует ли волшебным образом? нет. Единственная оговорка - если вы это делаете на коллекции и все данные из коллекции уже загружены в память - то тогда да, оно просто посчитает количество объектов, подходящих под критерию (метод matching для фильтрации коллекций). А так... только выборки по первичному ключу в случае если сущность уже загружена.
    Ответ написан
    2 комментария
  • Doctrine архитектура и построение связей, как правильно?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    философия доктрины - мы проекируем систему исходя из взаимодействия объектов, база данных лишь деталь реализации.

    То есть у нас есть объекты User, UserEmail и UserCode. У объекта User есть поля emails и codes. Иии все. При желании мы можем сделать bidirectional связь и тогда у UserEmail/UserCode появится поле user, которое будет содержать владельца, но как правило это не нужно.
    Ответ написан
    Комментировать
  • Какой профит от symfony forms?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    symfony forms нужны если у вас symfony формами заведует (формы любой сложности и тд. сделать на нем непроблема, но они будут с большег остатичными).

    Если же вам ангуляр тупо присылает json - у вас нет форм, у вас есть json. Для этого другие штуки.
    Ответ написан
  • Что отличает сущность вызванную Doctrine (методом find) от той которую мы сами создали?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ведь тот же метод $em->persist(...); мы используем и для обновления записи.


    Вообще-то нет. По умолчанию persist используется для того, что бы добавить сущность в UnitOfWork. Вызывая его доктрина начинает разбираться, нам надо просто замерджить сущность в текущий UoW или добавить ее в очередь на вставку.

    Вызывать persist при обновлении не нужно вовсе, можно обойтись merge, и только если у нас используется политика отслеживания изменений deferred-explicit, но это нужно в очень редких случаях. Например когда в рамках одного запроса мы должны загрузить из базы сотню-другую сущностей а обновить одну. В этом плане данная политика отслеживания изменений сильно ускоряет работу UoW, так как мы явно указываем за какими сущностями нам следить (сложность алгоритма UoW - O(N), так что чем меньше N тем быстрее работает). Единственное НО - это сильно усложняет работу с entity manager (по хорошему em должен быть только в репозитории), и в принципе ломает красивую концепцию persistence ignorance, так что использовать ее нужно только тогда, когда есть проблемы с производительностью UoW.

    через каждые 30 насколько изменится скорость переноса?

    Да, это ускорит работу. Единственное что, если вы занимаетесь вставкой большого количества объектов, имеет смысл после каждого flush делать clear, отчищать unit-of-work, поскольку вставленные сущности будут крутиться в нем, и после каждого flush их количество будет увеличиваться и скорость будет падать.
    Ответ написан
  • Как лучше организовать рассылку html писем в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    mailchimp, sendgrid

    Сделать нормально почту, что бы не попасть в спам базу, что бы все было ок - это очень дорогое удовольствие. стандартый mail не катит. Ну либо вам придется потратить много времени что бы нормально настроить postfix.

    А верстка писем - это уже отдельное развлечение.
    Ответ написан
    Комментировать
  • SPA на и AngularJS и Symfony 2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Мешать логику js c логикой шаблонизатора Twig, Blade и т.д. Или же фронтенд отделить целиком от бекенда, сделав бекенд чисто REST ?


    Да, клиент отдельно, сервер отдельно, между ними HTTP API.

    Если у вас будут проблемы связанные со скоростью бутстраппинга и т.д. то вместо того что бы "смешивать" шаблонизатор и angularjs (это вообще тупо), можно просто при запросе на сервак подготовить данные и вшить их в страницу (пробрасывая все через JS).
    Ответ написан
    2 комментария
  • Как организовать логику в Symfony с использованием наследования?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Какие есть более правильные варианты?


    проектируем нормально сущности в терминах бизнес логики (NewOrder как-то сильно звездными войнами попахивает).

    Между формами и сущностями ходят DTO. Делаем сервисный слой и оставляем контроллеры тонкими. А еще можно CQRS и EventSourcing но чувствую ранова-то, хотя возможно так было бы даже проще.

    Собственно никакой конкретики в вопросе нет. Вас смущает дублирование кода в контроллерах? выносите дублирование в приватные методы. Логики в контроллерах быть не должно, там только работа с формами и получание из них данных (по хорошему).
    Ответ написан
  • Как в Doctrine 2.5 указать связь на non-ID стобец?

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

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