Ответы пользователя по тегу PHP
  • Как работать с DI-контейнером?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    DI-контейнер это один из основных инструментов который должен быть в вашем приложении. Одно из правил SOLID это инверсия зависимостей, которая решается внедрением DI-контейнера с Автовайрингом для удобства.
    Уже много лет использую https://container.thephpleague.com/ и работа с зависимостями перестала был проблемой.
    Теперь по вашей задаче:
    У вас есть контроллер HomeController который должен иметь две зависимости, например UserRepository и Pagination.
    Какие зависимости должен иметь контроллер через абстракцию ? UserRepository потому что репозиторий это как правило класс который реализует слой хранения данных, который в свою очередь может меняться так как относится к слою инфраструктуры, поэтому у вас есть UserRepositoryInterface. Но вот к чему относится Pagination ? - к слою представления где у вас и находится контроллер, по сути использовать абстракции для него нет смысла, также как и для Response и Request и тд.
    Поэтому ваш код будет выглядеть так:
    class HomeCotroller{
    
       public function __construct(protected Request $request, protected UserRepositoryInterface $userRepository)
    
      }
      public function index(): Response { 
    
        $params = $this->request->getAll()
        //тут логика получения переменных
    
        $pagination = new Pagination($param1, $param2);
        $pagiationHtml = $pagitation->render();
    
        //тут логика построения html через шаблонизатор
    
        return new Response($html);
     }


    По поводу конфига с настройками: в DI контейнере есть возможность использовать singlitone объекты , создаете адаптер подключения к базе MysqlAdapter который в конструкторе берет настройки из вашего .env файла и создает соединение 1 раз. И дальше можете адаптер использовать его через инъекцию в ваши репозитории.
    Ответ написан
    Комментировать
  • Как должен выглядеть идеальный контроллер?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    Request и Response на входе? для чего?
    public function update(array $args): Response {
        $payload = $this->request->getParsedBody() ?? [];
    
      if(!isset($args['id'])){
         return $this->buildNotFoundResponce();
      }
    
        // validate $payload HERE
    
        // find user, method return DTO object or throw exception
        $user = $this->userManager->getUserById((int)$args['id']);
    
        $this->userManager->updateUser($user, $payload['name'], $payload['location']);
    
        return $this->buildNotContentResponce();
    }
    Ответ написан
  • Как правильно организовать класс сервис, который будет использовать множество последовательных функций в рамках выполнения задачи?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    Паттерн стратегия
    Ответ написан
    Комментировать
  • Обязательно ли писать собственную CMS если пишу сайт на фреймворке Yii 1.1?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    Свою писать можно, но это долго и муторно, но зато интересно. В любом случае вы будите базироваться на уже готовых библиотеках которые себя хорошо зарекомендовали, а также многие фреймворки их используют: fast route, league container, league fractal, twig, monolog, symfony debug, symfony request, symfony console и ORM.
    В основном, я по крайней мере обращаю внимание при работе с фреймворком это ORM. Так вот ни в одном нет нормальной ORM, более менее нормальная это doctrine orm, но она сложна. Мой выбор это Propel2 ORM.
    Я свою CMS начинал писать на основе этого репо https://github.com/mmeyer724/Frameworkless
    Ответ написан
  • 5 000 000 статей возможно на Джумле?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    в обще не думайте о преждевременной оптимизации, можно создать 5млн записей в бд и посмотреть как будет вести себя движок, как посоветовали выше, а можно оптимизировать движек. Но по статистике когда речь идет о таких объемах зачастую уходят с джумлы.
    Ответ написан
    4 комментария
  • Стоит ли использовать phpdoc для описания методов, если я использую тайпхинт и указываю возвращаемые значения?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    есть смысл если Вы используете генерацию документации
    Ответ написан
    Комментировать
  • Почему не работает XDebug, Waiting for incoming connection?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    проверьте xdebug.remote_host
    Ответ написан
  • Какой смысл mock объектов для юнит тестирования своего кода?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    Когда вы тестируете метод А вашего класса, вы проверяете его логику а не логику других (замоканых методов), может быть ситуация когда ваш метод А работает по логике корректно, а вот другой метод Б другого класса используемый в тестируемом методе выдает ошибку, возникает вопрос нужно ли считать что ваш метода А работает неправильно из за упавшего метода Б ?
    Ответ написан
  • Как вытащить логи PHP наружу из контейнера?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    а если так
    error_log = "/var/www/logs/php-fpm.log"
    Ответ написан
  • Какое окружение вы используете для разработки php?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    - openserver for Windows
    - docker for linux
    - phpStorm
    - dbForgeStudio
    - git + SourceTree Attlasian
    Ответ написан
    Комментировать
  • Docker-composer - рабочий пример запуска сервера с двумя версиями php?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    хорошая практика один проект - один докер конфиг
    поэтому проекты на php5.6 и php7.3 будет иметь каждый свою версию
    поэтому шаги простые
    1. переходишь в папку проекта
    2. $ docker-compose up -d && docker-compose exec app bash
    3. $ php some_script.php
    Ответ написан
    Комментировать
  • Актуальны ли админ панели на PHP?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    как мне очень трудозатратно, нужно разделение фронт и бек, или хороший фулстек программист.
    как правило если у вас SAAS сервис и требуется клиентоориентированный интерфейс то 90% индивидуальная админка + rest.
    если же cms которая теражируется клиентам, должна иметь возможность кастомизироваться то подойдет многостроничник на bootsrap, с twig и фреймворком.
    Ответ написан
    Комментировать
  • Что можно использовать от фреймворка в DDD?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    ваше направление и мысли полностью совпадают с моими, поэтому дополню то что уже писал k2lhu
    DDD это больше про агрегаты и контекст, может вам нужна гексогональная архитектура и все что связанно с clean architecture. Принцип простой, ваша бизнес логика не должна зависеть от деталей реализации, попробуйте написать код без фраймворка например сохранение , отображение простых сущностей, пользователей. У вас будет репозитории не работающие с базой а просто Mock-репозитоиии, но реализующие интерфейсы. Так у вас появится Domain layer и очень тонкий Infrastructure Layer. Далее попробуйте реализовать бизнес логику и сценариции для работы с вашими сущностями, например регистрация пользователя, у вас появится Application Layer. Далее вам нужно организовать контроллеры или модули который будут отображать элементы интерфейса, вы создадите контролеры, вьюхи, модули(виджеты) и тд. например форма регистрации пользователя, так у вас появиться Presentation Layer. Далее вы переведете на динамику ваши репозитории, адаптеры и реализуете сохранение ваших пользователей в базу с помощью Activerecord или DataMapper. Так появиться Infrastructure Layer.
    Плюсы, бизнес логика не зависит от фраймворка, на каждом этапе слоя вы можете подключать фраймворк на уровне как минимум в Infrastructure Layer, Presentation Layer. При смене фраймворка будите менять только их.
    Тесты можно внедрять без проблем особенно на уровне домена и бизнес логики.

    Золотые слова дядюшки Боба:
    Когда вы пишите приложение на фраймворке для заказчика вы гарантируете разработку приложения и его поддержку в течении жизненного цикла, но какую гарантию дает вам разработчик фраймворка?
    Ответ написан
    Комментировать
  • Корректно ли передавать объекты (с приватными свойствами и геттерами) во view только для чтения?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    вытягивать сущности базы данных в слой представления это такое себе, измените поле и все шаблоны использующие накроются, причем накроются что вы не заметите например уведомление будет приходить клиенту а там пропадет его имя.
    поэтому я в вьюху стараюсь передать нужную структуру массив/DTO
    Ответ написан
    8 комментариев
  • Вопрос по архитектуре, как реализовать класс коннектор для api стороннего сервиса?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    в луковой используется расслоение с минимум на три слоя:
    Domain - ваши Entity, RepositoryInterface, Service
    Application - бизнес логика приложения
    Infrastructure - реализация контрактов, драйверов,Repository

    Допустим есть необходимость коннектиться к стороннему api сервиса для обработки каких-то данных

    то-что вы описали это инфраструктура, где храните и как ваше дело, конфиги могут быть в ini файле могут быть в бд.
    Ответ написан
    Комментировать
  • Можно ли в DTO указывать методы isName, isLimit?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    уже не DTO
    Ответ написан
    Комментировать
  • Всегда ли нужно использовать фреймворки?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    я тебе скажу одно, можешь даже на чистом php писать
    Ответ написан
    Комментировать
  • Как сделать класс управления записями?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    второй более норм, но есть моменты:
    1. это репозиторий, класс который сохраняет сущности в хранилище
    поэтому
    BookRepository
    2. create update сделать приватными и можно заменить на save
    public function save(Model $model): void{
       if($model->getId()>0){
          $this->update($model);
       }
       else{
         $this->create($model);
       }
    }

    3. public function initDatabase(PDO $db) - это контруктор
    public function __construct(PDO $db)
    4. public function get(Book $book) - что это? public function findById($id): ?Book - более правильно
    5. public function getAll() - правильных ход, но если 1млн записей, все вытащите? нужна критерия выборки и коллекция на выходе а не массив
    public function getAll(Criteria $criteria): BookCollection

    п.с вообще то если ООП то у вас Book должна быть богатой моделью предметной области в данном случае это Rich Model где поведение модели размазано по слоям
    Ответ написан
  • Существуют ли CDN для PHP библиотек?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    JavaScript мне нужен какой-то плагин

    нужно отталкиваться от цели которую преследуете, Например, если на JavaScript мне нужен какой-то плагин - не аргумент, все таки не забывайте php - серверный язык а пример вы берете практики из клиентского ЯП.
    Ответ написан
    Комментировать