Джуниор PHP разработчик, C/Go трейни
и руководитель небольшого интернет-магазина.

Помогаю чем могу новичкам.

Пишу в блог:
Абстракции и как они текут
Как джуниор-разработчику найти работу (vc.ru)
Тестовые задания для джуниоров PHP
Контакты

Достижения

Все достижения (51)

Наибольший вклад в теги

Все теги (76)

Лучшие ответы пользователя

Все ответы (717)
  • Зачем нужен ActiveQuery в Yii2?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Если быть более, конкретным, зачем нужна эта опция, при генерации модели через Gii?

    Чтобы вы могли добавить свои кастомные методы или переопределить родные (all(), one() и другие, короче переопределить родной ActiveQuery и изменить на свои абстракции)

    Вот пример контроллера:
    actual() -- такого метода нет в ORM, а мне нужен, ну вот хочу так пользоваться:
    $trainings = Training::find()->actual($date);

    ActiveQuery

    Ну раз нужен -- добавляем такой метод
    class TrainingQuery extends \yii\db\ActiveQuery
    {
        public function actual($date)
        {
            return
                $this->alias('t')
                ->joinWith(['lesson l' => function($q){
                    $q->joinWith('studio s');
                }])
                ->andWhere(['l.active' => 1])
                ->andWhere(['s.active' => 1])
                ->andWhere(['t.date' => $date])
                ->all();
        }
    }

    Сущность

    В сущности перенацеливаем родной find() на мой кастомный
    class Training extends \yii\db\ActiveRecord
    {
    ...
    public static function find()
        {
            return new \mynamespace\entities\query\TrainingQuery(get_called_class());
        }

    Ответ написан
  • Может ли модель работать с массивом _POST и записывать данные в сессию?

    Maksclub
    @Maksclub
    maksfedorov.ru
    • в модель должны попадать чистые данные (то есть таки да - -в контроллере)
    • вообще с голым _POST не нужно в 2018 году работать, посмотрите это видео: https://vk.cc/8dAijK
    • валидацией может заниматься модель, но в данном случае МОДЕЛЬ ВАЛИДАЦИИ, а не модель сущности,
      модель -- это целый слой, а не конкретный класс или вид классов, это и сущности и сервисы и валидация и т.д....

    POST в моделе
    Не правильно работать с _POST в моделе, тк модель -- по сути синоним вашего бизнеса, бизнес модель, мне кажется странным было бы, если в магазине были бы продавцы, товары, операции дать денег и взять сдачу, данные (купюра, скидка)
    и тут же некий _POST запрос (ну или некая звуковая информация для операций (с битрейтом и частотой:):) мне кажется в бизнес-процесс должно попадать число или купюра, которое обработает некий контроллер (глаз, ухо и продавец в целом как валидатор)

    Валидация в сеттере
    По поводу сеттеров и валидации -- тоже плохо
    Купюра должны быть проверена в момент ее передачи, а не когда вы уже дали товар, посчитали сдачу, напечатали чек).. аналогия может быть немного не точной, но понятен принцип -- не в сеттере :)

    Ну или как пример -- договор между юрлицами, когда вы договорились и заполняете договор, для подписей (по сути сеттер ваш абстрактный) вы УЖЕ ДОЛЖНЫ были проверить контрагента и условия этого самого договора

    Польза абстракций
    Мне кажется так получается гораздо сложнее чем просто в каждом сеттере прописать валидацию. В общем, объясните, пожалуйста, как это реализовать и в чём плюс такого подхода

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

    Смотрите как валидация делается в Ларавел:
    public function rules()
        {
            return [
                'name' => 'required|string|max:255',
                'email' => 'required|string|email|max:255|unique:users',
                'password' => 'required|string|min:6|confirmed',
            ];
        }
    Ответ написан
  • Передаю через AJAX клиенту с помощью ф-ии "file_get_content" содержимое php файла (для вывода в popup). В popup пишется также php код. Как исправить?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Кто знает, может, это можно по-короче написать?

    ob_start();
    include(VIEWSPATH . 'pages/login' . '.php');
    return $this->render_ajax(ob_get_clean();


    ob_get_clean() по сути выполняет ob_get_contents() и ob_end_clean().
    php.net/manual/ru/function.ob-get-clean.php
    Ответ написан
  • Для чего нужно использовать Dependency injection?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Если вы свой метод захотите протестировать через юнит-тест, то будет удивление -- ваш метод завязан на некий объект (ведь его создание в этом методе происходит) или даже пару объектов...
    А ведь можно было в конструкторе его пробросить через интерфейс и замокать некой упрощенной реализацией (просто этот объект может сам тянуть миллион всего, а нужен то нам всего один его метод)

    Правильно ли я понял что каждый класс, в который мне нужно внедрить зависимость, мне придётся прописывать вручную в DI контейнере?

    У современных DIC (DI контейнеров) есть такая фича как автовайринг -- парсинг конструкторов через рефлексию, то есть вы просто прописываете в конструкторе тип объекта, а контейнер парсит класс и находя тип в конструкторе создает и пробрасывает туда созданный объект (и для него также подтягивает зависимости из его конструктора :)
    Ответ -- нет, не нужно прописывать в сервисах каждый класс руками, it's magic, только индивидуальные вещи прописывать нужно... как пример -- хотите анонимку пробросить в объект.
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (40)