• Почему я не могу выполнить миграцию, где есть строка ..?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    В ошибке всё написано. Используется foreign key. Если хотите сделать манипуляцию с этой колонкой нужно удалить FK, а затем снова добавить, если он нужен.
    Ответ написан
  • Как отфильтровать по пользователю все запросы?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Почему бессмысленно? Не бессмысленно. Контроллеры могут быть разными: API, Console. Web… везде может быть разная фильтрация. Поэтому, это точно не бессмысленно.

    По поводу логики - это правильно. В контроллере она быть не должна! Для этого создайте свой сервис фильтрации. Передавайте в него Query Builder и фильтруйте как нужно и где нужно.

    Подробнее можно почитать на примере EasyAdmin https://symfony.com/bundles/EasyAdminBundle/curren... или на Laravel пример для понимания https://habr.com/ru/post/485520/

    Пример на Laravel только для понимания, как это можно осуществить.
    Ответ написан
    2 комментария
  • Как привести дату к нужному формату?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    (new DateTimeImmutable($array["Date"]))->format('F d, Y');
    Ответ написан
    1 комментарий
  • Как правильно использовать вложенные бандлы?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Вопрос в заголовке про использование, а внутри про объединение…)

    Без кода сказать сложно что куда лучше перенести. Расширять один бандл тоже можно по-разному, где-то просто скопировать класс из одного и перенести в другой, затем подменить в DI контейнере, где-то влезть через события, а где-то решить вопрос наследованием.

    Если речь идёт о бандле, то по всем правилам это, вероятно, какая-то публичная библиотека. Так как в своём приложении не имеет смысла делать бандлы. Поэтому, как мне кажется, стоит сделать форк данной библиотеки, перенести все нужные зависимости из А в Б, подключить библиотеку из этого форка.

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

    Переносить из Б в А не вижу смысла, так как кода явно будет больше, раз Б работает самостоятельно, а А от него зависит.

    Также не вижу ничего плохого в том, что один бандл будет зависеть от другого. Вполне бандл А может жить и без объединения с бандлом Б. Главное следите за обновлением зависимостей.
    Ответ написан
    7 комментариев
  • Как делать интеграционные тесты в бандле symfony?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    В этой статье https://habr.com/ru/post/500044/ подробно рассказывается как тестировать бандл. Там же есть ссылки на создание бандла и его публикацию.
    Ответ написан
    Комментировать
  • Есть ли возможность создать migration per entity?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Миграция не группируется по изменению сущности. Единственный вариант - это разделить миграции по папкам(модулям), чтобы миграции одной сущности попадали в папку и свою таблицу вместо общей.

    Однако это требуется больше для модулей. Делать миграции под каждую сущность не вижу смысла. Задача миграций - следить за схемой данных и изменять её. Нет смысла здесь пытаться как-то одно отделить от другого. Никакой пользы это не даст.
    Ответ написан
    Комментировать
  • Как исправить ошибку в ElkarBackup?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Серверная ошибка. Смотрите логи или включайте debug панель.
    Ответ написан
  • Роутинг согласно пути файлам?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    config/routes/annotations.yaml
    api:
        resource: ../../src/Http/Controller/Api/
        prefix: /api
        name_prefix: api.
        trailing_slash_on_root: true
        type: annotation
        defaults:
            _format: json
    Ответ написан
    4 комментария
  • Как пофиксить ошибку "Call to a member function on null"?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Гдето в вашем вызове вызывается null, поэтому возникает данная ошибка.
    Ответ написан
    Комментировать
  • Как поставить интерпретатор php в PhpStorm нужной мне версии?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Чтобы интерпретатор PHPStorm работал правильно — нужно указать полный путь к интерпретатору. Это можно сделать двумя способами:
    1. Указать путь /usr/bin/php и изменить симлинк ($PATH) на новую версию PHP.
    2. Использовать полный путь к интерпретатору php8. Например /usr/bin/php8.0,/usr/local/Cellar/php@7.4/7.4.16/bin/php и т.д. Ваш путь может быть другим.

    Чтобы узнать путь текущего интерпретатора можно запустить команду :
    $ which php
    : /usr/bin/php
    Ответ написан
    Комментировать
  • "Умение профилировать и отлаживать свой код без использования функции dd/var_dump" - это как?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Это точно об X-debug.

    Умение им пользоваться будет полезным в использовании незнакомого вам кода. Большинство ошибок можно найти данным инструментом более быстро, чем расставлять везде dd(). Вам нужно поставить одну точку, а дальше полный набор отладки.

    Но мне не очень понятно зачем отлаживать свой код. Если код написан читаемо, то отлаживать его нет необходимости - достаточно покрыть его тестами. Даже если возникнет какая-то ошибка, то найти её можно быстро. Я ещё ни разу не пользовался X-debug для отладки именно своего кода. Код читаем и ошибка находится быстро. Более того, дошёл до того, что даже браузер не открываю, так как занимаюсь только backend частью. Мы недавно сдали проект с хорошим кодом и на демо-версии не было ни одной 500 ошибки, а покрытие тестов было всего 35%.

    Поэтому тесты+читаемый код может вообще избавить вас от необходимости настройки данного инструмента. Разве что нарвётесь на какой-то баг библиотеки. Вот тогда и придётся «расчехлять» данный инструмент.
    Ответ написан
    2 комментария
  • Как деплоить структуру БД?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Вся работа со структурой базы данных в Symfony осуществляется через Dortrine Migrations Bundle. Чтобы создать структуру данных вам нужно:
    1. Настроить маппинг ваших сущностей.
    2. Сгенерировать миграции командой
    php bin/console doctrine:migrations:diff
    3. Применить созданные миграции командой
    php bin/console doctrine:migrations:migrate
    Ответ написан
    Комментировать
  • Что принципиально отличает Symfony 5 от Laravel 8?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    1. Прежде всего нужно понимать, что любой Framework, в руках хорошего разработчика будет жить долго и хорошо.
    2. Framework — это инфраструктура. Framework не предоставляет Вам готовый код и не задаёт архитектуру, он предоставляет Вам низкоуровневые инструменты или их быструю интеграцию, в которых нет необходимости писать с нуля под каждый проект. Хотя, ради практики, было бы не плохо попробовать это сделать, чтобы разобраться в данном вопросе, но сейчас не об этом. Исходя из этого Ваш код должен быть независим от какого-либо Фреймворка. Устарел Yii2 framework —поменяли контроллеры, немного инфраструктуры и код работает уже на Symfony или Laravel. Это касается не только Фреймворков, любая сторонняя библиотека должна быть изолирована от прямого использования. Это позволит Вам быть более гибче и сделает Ваш код менее связанным и зависимым.
    3. Оба Фреймворка популярны и имеют право на существование. У всех разный порог входа, разное сообщество и разные решения. На Symfony код пишется чуть сложнее и дольше, так как нет привычных фасадов. Многие компоненты и Фреймворки используют компоненты Symfony в виде своих обёрток. Однако, нужно понимать, что Фреймворк задаёт немного стиля в разработке, у Symfony этот стиль более правильный и строгий. Поэтому, использование Symfony интуитивно подталкивает Вас к написанию более чистого кода, без погружения в различные паттерны.
    4. Doctrine — это НЕ тот же Eloquent. Это совершенно разные вещи!
      Eloquent —это анти паттерн Active Record, а Doctrine это паттерн Data Mapper. Если речь идёт о быстрой разработке и не долгоживущем или небольшом проекте, то можно взять и её, однако на долгий срок лучше использовать Data Maper типа Doctrine, Cycle. При таком подходе ваши поля «не торчат» напрямую из базы данных в код. При изменении столбца в БД — его не придётся менять по всему проекту. Для Data Mapper подход — Code First (Вначале код), а для Active Record — Table Fist (Вначале таблицы). При использовании Data Mapper мы не думаем как будут храниться наши данные в БД, не думаем какая будет БД, что не скажешь по AR.

    Тема фреймворков на Q&A поднимается очень часто. Лично мне приходилось много раз отвечать на подобные вопросы. Вы можете сами в этом убедится по моим ответам:

    Поэтому, серьёзно к таким вопросам здесь не относятся. Чтобы понять разницу — Вам, очевидно, нужно попробовать оба Фреймворка в разных ситуациях. Со временем Вы сами всё поймете. А если Вас устраивает Laravel и не предвидится какого-то большого развития — пользуйтесь. Пару строк кода можно написать и без какого-либо Фреймворка. Главное — результат и правильно подобранный инструмент.
    Ответ написан
  • Как создать компонент или модуль в yii ??

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Добавить модуль согласно документации.
    2. Настроить routing.
    '<_m:[\w\-]+>' => '<_m>/default/index',
        '<_m:[\w\-]+>/id<id:\d+>' => '<_m>/default/view',
        '<_m:[\w\-]+>/<id:\d+>/<_a:[\w-]+>' => '<_m>/default/<_a>',
        '<_m:[\w\-]+>/<_c:[\w\-]+>' => '<_m>/<_c>/index',
        '<_m:[\w\-]+>/<_c:[\w\-]+>/id<id:\d+>' => '<_m>/<_c>/view',
        '<_m:[\w\-]+>/<_c:[\w\-]+>/<id:\d+>/<_a:[\w\-]+>' => '<_m>/<_c>/<_a>',
        '<_m:[\w\-]+>/<_c:[\w\-]+>/<_a:[\w-]+>' => '<_m>/<_c>/<_a>',
    Ответ написан
    Комментировать
  • Как структурировать проект на Symfony по принципу package-by-feature?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Архитектура вообще не относится никак к фреймворку.

    Из примеров могу посоветовать пример проекта Дмитрия Елисеева на slim. И ещё есть доклад от Валентина Удальцова про архитектуру на Symfony.

    1. Kernel хранить в src, если он один.
    2. Миграции можно src/Data/Migration Или src/Migration
    3. Тесты, если общие (функциональные), то в /tests, а если unit, то в папку, где фича src/Feature/Test

    Из вашей структуры я бы вынес Console и Controllers в одну папку на уровне с Feature.

    Так же сервисы я бы тоже не делал всё в одном services.yaml, а выносил бы в config/services/feature.yaml Или в каждую фичу.
    Ответ написан
  • Где хранить интерфейсы и абстрактные классы?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Сложно понять о чём вы пытаетесь спросить, но попробую пояснить.

    Интерфейс должен всегда храниться в слое или модуле, где он используется. Интерфейс так же создаёт абстракцию и создан для уменьшения связанности.

    Например, вам нужно оправлять уведомления из модуля магазина в модуль уведомлений. В магазине вы делаете интерфейс (API) через который магазин будет отправлять уведомления. Саму реализацию можно оставить и в магазине, но лучше вынести в src/Infrastructure. В этой папке можно хранить все инфраструктурные вещи.

    Так же можно использовать пример из DDD где есть деление на слои Application, Domain, UI, Infrastructure. В этом случае в Domain может быть RepositoryInterface, а в Infrastructure реализация DoctrineRepository

    Что касается абстрактных классов, то храните их там, где вы их используете или реализуете. Это может быть где угодно. Абстрактный класс, в первую очередь, класс! Он создан для общей базовой логики в классах, но при этом его нельзя вызвать через new()
    Ответ написан
    Комментировать
  • Возможно ли в yii2 настроить Last-Modified?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    В документации даже есть пример из контроллера:
    public function behaviors()
    {
        return [
            [
                'class' => 'yii\filters\HttpCache',
                'only' => ['index'],
                'lastModified' => function ($action, $params) {
                    $q = new \yii\db\Query();
                    return $q->from('post')->max('updated_at');
                },
            ],
        ];
    }
    Ответ написан
  • Можно ли как-то ограничить количество одновременных сессий для пользователя в Symfony 5?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Мне кажется, что тут не совсем вопрос про симфони, но тем не менее отвечу.

    Храните каждый сеанс пользователя в базе. Данные храните такие как ID пользователя, IP, user agent, тайм зону и т д. А в приложении проверяйте, если в пользователь зашёл с другого устройства (браузера), то говорите ему о том, что нужно завершить прошлый сеанс или этот сеанс будет автоматически удалён через 5 минут, если пользователь не будет продолжать этот сеанс.

    Думаю, что это самое простое решение.
    Ответ написан
    Комментировать
  • Как удалить файл с помощью php?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    unlink() - удалить файл.
    Ответ написан
    Комментировать
  • Как получить правильный параметр в Repository?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Неправильно подставляете ID ниже в контроллере/сервисе/репозитории.
    Ответ написан
    Комментировать