• Принцип DIP из SOLID и Autowiring из DI-контейнеров?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Как это не будет? Может быть вы не правильно используете или не знаете как использовать?

    В DI контейнере мы «привязываем» класс, который реализует интерфейс. Таким образом везде, где есть этот интерфейс будет работать созданный и «привязанный» нами класс.

    Вроде бы там достаточно просто и понятно.
    Ответ написан
    9 комментариев
  • Как получить вложенные данные Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Ответ не такой, который вам нужен, но есть повод задуматься. Если вы умеете работать Query Builder от Yii, а так же умеете применять Join, и понимаете в SQL запросах, то используйте хоть голые SQL запросы или при помощи QB от Yii. Почему? Потому что данные выходят к вам в виде ассоциативных массивах и такой массив вы либо уже загоняете в своё DTO, либо работаете как с обычным массивом, либо переформатируйте этот массив в json. Если вы будете получать данные по связям, то у вас возникнет большая проблема с производительностью и код от этого станет плохим. Это больше касается когда вам нужны данные для вывода списка (index). Если вам данные нужны в (view), то там можно попробовать работу по связям или виджеты.
    Ответ написан
  • Какую сборку yii2 посоветуете?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Yii advanced. Либо возьмите из готового проекта. Можно взять у Елисеева Дмитрия на Github
    Ответ написан
    Комментировать
  • Как задать свой identity class для каждого модуля в Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Странный вы. Зачем вам такой огород?

    1. Если у вас 2 разных api и вы с ними не взаимодействуете по общим авторизационным данным - разделяйте их на 2 приложения.

    2. Если у вас 2 разных api использующие общие авторизационные данные - делайте либо их папками в одном приложении, либо два разных с межсайтовой авторизацией.
    Ответ написан
  • Как в yii2 при ошибке в form->field() выделять красным только блок с пояснением?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    /*css*/
    .has-error .control-label {
         color: none;
    }
    .has-error .form-control {
         color: none;
    }
    Ответ написан
    Комментировать
  • Как избавиться от дублирования кода в SeachModel Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Ваше видение наследования и приведёт к говно коду. В Yii2 и так много наследований и разногласий с SOLID.

    1 Форма-фильтр сайта = 1 SearchModel

    Сначала поймите что такое SearchModel и вы поймёте её ответственность. Это форма-фильтр, которая принимает данные от пользователя и делает выборку данных по переданным параметрам из базы. Вам будет казаться, что вы дублируете код, но это так. Вы разделяете поисковые модели под определённые задачи.

    Пример: На главной странице — вам нужна форма-фильтр по одному/двум полю/ям. В расширенном поиске — форма-фильтр по нескольким полям. Если у вас в разных местах одни и те же параметры фильтрации— вы используете одну форму в двух местах. Если данные разные — создаём новую SearchModel. Их может быть столько, сколько потребуется. Под каждые задачи.

    Важный момент, который чаще всего используют в Yii SearchModel - это наследование от основой модели Acrive Record. Этого делать категорически нельзя. Так делают только для быстрой разработки. При такой разработке все поля базы торчат «наружу». Рекомендую все SearchModel наследовать от простой модели (класс Model). Тогда Search Model будет безопаснее и она будет всего лишь формой, а не формой с дополнительными возможностями.
    Ответ написан
    Комментировать
  • Как синхронизировать записи в БД с массивом?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Это не имеет особого отношения к Yii. Это обычная работа с массивами и ООП. А как вы будете сохранять (через AR, Doctrine) и куда (mysql, postgresql) не имеет значения.

    Сначала удаляем все из базы. Потом присваиваем новые.

    Пример Сущности.

    Чтобы со связями можно было работать так же как с массивами-объектами, то лучше использовать yii2-save-relations-behavior
    Ответ написан
    Комментировать
  • Почему не работает миграция?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Команда yiic не найдена.использейте команду yii
    Ответ написан
    Комментировать
  • Почему не работает кэширование запросов?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1.
    // Кэширование запросов для DAO
    // Возвращает ассоциативный массив с именами столбцов и значений
    $categories = Yii::$app->db->cache(function () {
      return Yii::$app->db->createCommand('SELECT * FROM `category`')->queryAll();
    });
     
     
    // Кэширование запросов для ActiveRecord (на 1 час)
    // Возвращает объект
    $categories = Category::getDb()->cache(function (){
        return Category::find()->all();
    }, 3600);


    2. Кэширование производится при необходимости, а не ради кэширования. У вас проблемы с нагрузкой? Зачем кэшировать?)
    Ответ написан
    4 комментария
  • Как выставить HTTPS-протокол в виджете AuthChoice расширения AuthClient от Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    На ваш вопрос Александр ответил следующее:

    BaseOAuth::defaultReturnUrl() doesn't specify protocol. It means return URL generated matches protocol used at the website. If your website is served via HTTP it doesn't make sense to set return URL to HTTPS.


    Подробно можно прочитать тут

    Полностью с ним согласен. Но если вам нужен такой костыль, то вот
    Ответ написан
    Комментировать
  • Как правильно изменять теги или ключевые слова в yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вы правильно думаете. Сначала он удаляет, а потом добавляет заново. Это можно найти в коде тут. Если вам интересен этот урок, то он называется Дмитрий Елисеев— yii2 интернет магазин
    Ответ написан
    Комментировать
  • Почему не проходят данные datetime?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Можно ещё изменить формат виджета:
    <?= $form->field($model, 'category_at')->widget(DatePicker::class, [
            'options' => ['placeholder' => 'ДД.MM.ГГГГ'],
            'pluginOptions' => [
                'todayHighlight' => true,
                'todayBtn' => true,
                'autoclose' => true,
                'format' => 'dd.mm.yyyy',
                'startView' => 'months',//'startDate' => date('d.m.Y'),
            ],
        ]); ?>


    И тогда изменить валидацию:
    ['datetime', 'date', 'format' => 'php:d.m.Y']
    Ответ написан
    Комментировать
  • Как лучше добавлять дату добавления и редактирования в базу из yii2 для скорости, тригером БД или поведением?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Есть ли смысл использовать тригеры и есть ли прирост от этого, а может и наоборот?


    Зачем вам логику добавления даты куда-то перемещать?

    Если использовать поведения, то есть один из недостатков — у вас сохраняются данные всегда при создании и обновлении.

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

    Я бы рекомендовал выстраивать логику таким образом, чтобы вы управляли датами на уровне бизнес логики. Если это дата создания, то передаёте дату при создании сущности. Если это дата обновления, то при изменении контента.

    Небольшой пример. Есть блог. С полями: заголовок, дата обновления, просмотры. Вы обновляете счётчик посещения - обновляется дата. Это не логично. Дата изменяться должна при обновлении контента.
    Ответ написан
    Комментировать
  • Логика собственного роутинга?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!

    А теперь сижу и думаю, правильно ли у меня реализована логика?

    Не правильно
    Ответ написан
    5 комментариев
  • Как создать связь между 2 моделями без Has One/Many?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Есть очень удобное для этого расширение, которое позволяет использовать код более лаконично: yii2-save-relations-behavior
    Ответ написан
    Комментировать
  • Как переопределить метод виджета в yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вы напишите что меняли? Каждый должен сравнивать ваш код с оригиналом?

    Как по мне эта часть кода не правильная:
    $widgetClass = $widgetConfig['class'];
            if (!(is_subclass_of($widgetClass, AuthChoiceItem::AuthChoice))) {
                throw new InvalidConfigException('Item widget class must be subclass of "' . AuthChoiceItem::AuthChoice . '"');
            }


    Должно быть
    AuthChoiceItem::class
    Ответ написан
  • Какую проверку лучше использовать?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    class Controller 
    {
      private $repo;
    
      pulic function __construct(MissionRepository $repo) 
      {
        $this->repo = $repo;
      }
    
      pulic function excuteMission($id)
      {
        $mission = $this->repo->find($id);
        $mission->next();
        $mission->save();
      }
    }
    
    class Mission
    {
      private $progress;
    
      public function next(): void
      {
        $progress = $this->progress + 10;
    
        if($progress > 100) {
          throw new DomainExeption('Миссия не может быть выполнена.')
        }
        if($progress = 100) {
          throw new DomainExeption('Миссия уже выполнена.')
        }
      }
    }

    А вообще используйте тесты и вы сами поймёте что нужно, что не нужно.
    Ответ написан
    8 комментариев
  • Почему Yii2 ListView плодит новые элементы в списке?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Пропробуйте:
    $query = Product::find()
            ->joinWith('prices', true , 'LEFT JOIN')
            ->orderBy(['price.price' => SORT_DESC])
            ->distinct();
    Ответ написан
    Комментировать
  • Как лучше создать деревья для различных категорий?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Используйте NestedSets. Для YIi есть хорошее решение paulzi/yii2-nested-sets
    Ответ написан
    Комментировать
  • Как доставать текстовые сообщения из файла, чтобы не загромождать ими код в Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Конечно можно! В чем проблема?) Сделайте так же как в Mailer. Можете хоть HTML там передавать как в mailer. В mailer есть шаблон текста и шаблон HTML.

    Создайте php файл. В него вставьте необходимые переменные и доставайте данные из этого файла, заменяя переменные.

    Если вам этот вариант не подходит, то вы можете использовать переводы. Других вариантов нет. Да и не зачем)
    Ответ написан
    Комментировать