• Почему symfony такой медленный?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Это нормально, что оно ест 18 мб оперативки и запрос обрабатывается 1,5 секунды?

    Вы запустили фреймворк в отладочном режиме, где каждый чих записывается и это можно после обработки запроса посмотреть в профайлере. И удивляетесь, почему расходуются ресурсы. Запустите в среде prod, прогрейте кеш и посмотрите, как изменится ситуация.
    Для сравнения: yii - 7 мб оперативки и 0.2 секунды.

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

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Передавать EntityManager в опции:
    /**
         * @inheritDoc
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setRequired('manager');
            $resolver->setAllowedTypes('manager', array(
                ObjectManager::class
            ));
        }

    $form = $this->createForm(FooType::class, $object, array(
        'manager' => $this->getDoctrine()->getManager(),
    ));

    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->get('image')
                ->addModelTransformer(new EntityToNumberTransformer($options['manager'],  'AppBundle:File'));
        }

    либо зарегистрировать форму как сервис:
    app.type.foo:
            class: %app.type.foo%
            arguments:
                - "@doctrine.orm.entity_manager"
            tags:
                - { name: form.type }
    Ответ написан
    3 комментария
  • Как изменить определенный vendor в symfony?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Форкнуть вендор, в своём форке сделать, что хочется, и дальше использовать ваш форк (указав ваш форк в composer.json в раздел repositories).
    Ответ написан
  • Как выводить данные в шаблонизаторе Twig?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    У вас переменная id_book, а геттер getBookId.
    Ответ написан
    4 комментария
  • Как шифрует пароль Symfony?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Алгоритм указан в файле app/config/security.yml:
    security:
        encoders:
            AppBundle\Entity\User:
                algorithm: bcrypt
                cost: 12

    Вам надо реализовать этот алгоритм в MODX.
    Реализацию этих алгоритмов в Symfony можно посмотрить тут:
    vendor/symfony/symfony/src/Symfony/Component/Security/Core/Encoder/
    Ответ написан
    3 комментария
  • Как в Symfony 2 реализовать единую форму регистрации и авторизации?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Я бы копал в сторону кастомного UserProvider: symfony.com/doc/current/cookbook/security/custom_p...

    public function loadUserByUsername($username)
        {
            // make a call to your webservice here
            $userData = ...
            // pretend it returns an array on success, false if there is no user
    
            if ($userData) {
                $password = '...';
    
                // ...
    
                return new WebserviceUser($username, $password, $salt, $roles);
            }
    
            // Тут создаем пользователя
        }


    Т.е. если пользователь ошибка в логине, его автоматически зарегистрирует без спроса? -_-
    Ответ написан
    Комментировать
  • Почему не правильно работает расширение twig?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    $twig->addFunction(new Twig_SimpleTest(...));
    В ошибке написано - нужно создать объект, реализующий интерфейс Twig_FunctionInterface или объект Twig_SimpleFunction. А вы передали объект класса Twig_SimpleTest().
    Может, у вас синтаксическая ошибка? Twig_SimpleTest -> Twig_SimpleFunction
    Ответ написан
    2 комментария
  • Как продолжать развивать open source проект, если мэйнтейнер забросил этот проект?

    nazarpc
    @nazarpc
    Open Source enthusiast
    1) Написать автору проекта на почту, готов ли он добавить вас к разработчикам (collaborators) проекта чтобы вы продолжили его дело, иногда они очень даже не против
    2) Если нет ответа/против - делаете форк, мержите сами пул реквесты в свой форк (и уведомляете об этом авторов пул реквестов, они могут быть заинтересованы)

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

    P.S. Имею аналогичный опыт:)
    Ответ написан
    1 комментарий
  • Какую ОС изучать PHP программисту?

    dima9595
    @dima9595
    Junior PHP
    Если вы хотите цениться как PHP-программист, то стоит изучать технологии и просто развиваться. ОС не влияет на ваши знания и умения ими управлять. ОС - это всего лишь оболочка программы, где вы работаете.
    А если вы делаете приложения один, то стоит по-изучать Linux. Могу посоветовать Ubuntu, как по мне, она здорово подходит для развёртывания LAMP и подобных типов серверов.
    Ответ написан
    Комментировать
  • Как лучше построить модуль Транзакции в symfony?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    0) Никаких TransactionBundle. Вы эту логику не сможете реюзать, а значит нет смысла делать бандл. Почитайте symfony best practice. У вас должен быть один AppBundle и все, больше ничего. Вы можете пытаться выносить какие-то части инфраструктуры, которая не привязана к бизнес логике в отдельные бандлы для последующего реюза, но бизнес логику приложения реюзать не выйдет.

    1) почитайте про event sourcing. Этот способ хранения данных идеален для платежных транзакций, собственно в банках и т.д. этот подход и используют десятилетиями, да даже та же база данных хранит лог транзакций.

    2) уберите flush их сервиса и вынесите его в контроллер. flush коммитит транзакцию в базу, и нам надо это делать когда мы завершили работу с оными а не "где-то посередине".

    3) оборачивать это добро в еще одну транзакцию глупо, потому что... доктрина и так сделает транзакцию. В любом случае по хорошему это надо делать в декораторе.

    4) call_user_func_array в вашем случае - пример плохого решения.

    5) по умолчанию persist использовать нужно только для тех сущностей, которые мы только что создали (в нашем случае - транзакция), либо тех которые мы явно вынули из unit of work (а у нас нет вызова $em->detach).

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

    7) сервисы менеджеры - отстой. Называйте сервисы нормально.

    8) вместо кучи сервисов можно ввести разные объекты транзакций. Например FundTransaction, IncomTransaction и т.д. У вас же в сервисах почти весь код дублируется. А так можно было бы всю логику с этими операциями сложить прямо в сущности.

    9) НИКАКИХ DIE! даже для дебага.

    public function transactionAction(Request $request)
    {
        $data = $request->request;
        $transactionDTO = new TransactionDTO(
             // вообще я бы тут просто ID пользователя возвращал... но я упорот по изоляции приложения от UI
             $this->get('security.token_storage')->getToken()->getUser(), 
             $data->get('sender_account_type'),
             $data->get('recipient_account_type'),
             $data->get('amount')
        );
        // с исключениями разберется фронт контроллер
        $this->get('app.transaction_processor')->process($transactionDTO);
        // вот теперь сохраняем изменения
        $this->get('doctrine.orm.entity_manager')->flush();
    
        return new Response(null, 201); // создали новую запись в журнале транзакций
    }


    class TransactionProcessor
    {
          private $transactionsRepository;      
    
          public function __construct(TransactionRepository $repository)
          {
               $this->transactionsRepository = $repository;
          }
    
          public function process(TransactionDTO $dto)
          {
                // create это статический метод фабрика у абстрактного класса Transaction
                // читать шаблон проектирования "абстрактная фабрика".
                $transaction = Transaction::create($dto->getSender(), $dto->getRecipient(), $dto->getAmount());
                
                $this->transactionsRepository->add($transaction);
          }
    }


    дальше мне по логике не понятно, почему у вас одна транзакция на двух человек, полюбому у sender-а будет один тип транзакции а у ресивера другой. Можно запомнить кому мы чего передавали и только.
    Ответ написан
    7 комментариев
  • Ошибка при отправке коммита, как исправить?

    BuriK666
    @BuriK666
    Компьютерный псих
    наверное вы хотели
    git commit -a -m "Добавил файл фильтрации"
    -a, --all
    Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.
    -m , --message=
    Use the given as the commit message. If multiple -m options are given, their values are concatenated as separate paragraphs.
    Ответ написан
    Комментировать
  • Symfony 2. Как красиво организовать конфигурацию бандлов в базе данных?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    да, сделайте сервис аля ParamsProvider или что-то в этом духе. И все. Либо инджектите его либо через выражения подставляйте.
    Ответ написан
    5 комментариев
  • С чего начинается CI?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    CI - это автоматизированная сборка проекта на основе версионного контроля и прогон тестов.

    Собственно, начинать надо с задачи реализации деплоя.
    Деплой сделать - задача нетривиальная. Есть для этого разные инструменты и универсального решения нет. Отладить процедуру деплоя нужно для сборок в CI и для продакшена/стейджа.
    Лично я для своего последнего маленького проекта для выкладки в продакшн выбрал deploybot.com - в принципе всё, что нужно есть, в том числе и хорошая интеграция с DigitalOcean.

    Что касается инструмента для CI, то из бесплатных обычно пользуются Jenkins. Я пробовал в последнем проекте PHP CI - тоже годно, но не настолько гибкий инструмент.

    Выкладку на продакшн/стейдж можно настроить по-разному. Например по коммиту в специальную ветку, по ключевым словам в коммите или вообще вручную. На прод однозначно стоит делать выкладку вручную.

    А, еще один немаловажный момент. Для успешного функционирования этого всего дела нужно внедрить версионирование схемы БД и фикстуры (для CI).

    Жизненный цикл у нас был такой. Тимлид определяет некий не большой, но и не очень маленький набор фич, которые должны попасть в новую версию приложения. Все тикеты связаны с версиями. И поэтому может случится так, что даже готовую фичу он определит в другую версию продукта.
    Каждая готовящаяся к релизу версия получает свою ветку в git и там делается мердж нужных коммитов с фичами. Каждый коммит автоматически тестируется в CI.
    Когда все фичи сделаны и коммиты слиты, то можно залить на стейдж сервер и погонять вживую версию в условиях близких к боевым. И наконец, если всё хорошо, то делается деплой на продакшн.
    Ответ написан
    Комментировать
  • Где большие чаты рускоговорящих web-разработчиков?

    web_user
    @web_user Автор вопроса
    Django, HTML + CSS, JS, Photoshop, Illustartor
    Раздобыл, список русскоязычных ИТ-чатов:
    https://github.com/mr-mig/ru-it-chats

    Спасибо, Illia Segeda из чата gitter.im/dev-ua/frontend-ua.
    Ответ написан
    Комментировать