• Не смог найти учебник по DDD с примерами на PHP - такой существует в природе?

    vitaly_74
    @vitaly_74
    может быт и нет, смотрите на примеры с java они придельно понятны, и синтаксис похож, во всяком свлучае не долго разобраться.
    Ответ написан
    3 комментария
  • Как решить проблему с открытием сайта на php на локальном сервере apache?

    vitaly_74
    @vitaly_74
    тоже пользуюсь OpenServer, сделайте у апача версию php такую же как и версию php в селекторе.
    Ответ написан
  • Почему Yii2 пагинация считает связанные модели?

    vitaly_74
    @vitaly_74
    вы говорите что используете carNumbers.car_number, но в методе гридвью у вас написана (скорей всего) связь по многим, и обработка идет связи по многим. вроде все логично.
    Ответ написан
  • Как сейчас скачивают сайт из веб архива?

    vitaly_74
    @vitaly_74
    используйте wget. всегда им выкачивал веб сайты
    Ответ написан
    3 комментария
  • Как парсить текст с вебстраницы в текстовик(или куда-то еще)?

    vitaly_74
    @vitaly_74
    Можно например использовать CURL и каждый раз обновлять страничку, если там не стоит защита от ботов. Если стоит то стоит использовать selenium - он иммитирует пользовательские дейстивия в браузере.
    Ответ написан
    2 комментария
  • Не работает Curl+Proxy на сервере?

    vitaly_74
    @vitaly_74
    https://success.outsystems.com/Support/Enterprise_...
    Код ответа HTTP 502 - неверный сервер шлюза указывает на то, что сервер, выступая в качестве шлюза или прокси, получил недопустимый ответ от вышестоящего сервера. В типичных производственных сценариях перед сервером (-ами) находятся обратный прокси-сервер или балансировщики нагрузки. Представьте, что клиент отправил запрос на Сервер. Однако клиент не может сделать это напрямую, поэтому он подключается к прокси, устанавливая соединение client> proxy. Затем прокси создает прокси-сервер подключения. Ошибка HTTP 502 - неверный шлюз возникает в следующих случаях:
    Время ожидания прокси-сервера истекло до завершения запроса.
    Если соединение прокси> сервер падает.
    Когда ответ от сервера недействителен

    я более склоняюсь к тому, либо сервер долго думает. т.е. обрабатывает долго какой то запрос. на локалке может работать, только потому что базы на локальном и проде отличаются и информация разная, и следовательно может произойти где то зацикливание, либо наоборот долгая обработка информации.
    Ответ написан
  • Почему не читаются / не отправляются заголовки?

    vitaly_74
    @vitaly_74 Автор вопроса
    проблема была в следующем, на сервере установлен CPanel, и Cpanel удалял заголовок Authorization для своей безопасности.
    решения было 2, что то сделать с Cpanel (это отдельный заказ у фрилансера).
    и изменить заголовок авторизации например на tokenApi и уже из него что то парсить.
    Ответ написан
    Комментировать
  • Как сделать проверку переменной?

    vitaly_74
    @vitaly_74
    if(!is_null($ytcode)){
    echo "
    <h2>Видео</h2>
    <iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/$ytcode\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>
    ";
    }
    Ответ написан
  • Паттерн "Фабричный метод": как получить конкретный продукт из конкретной фабрики?

    vitaly_74
    @vitaly_74
    (получаю название нужной фабрики и продукта из запроса — в контроллере)
    Например в yii2 есть такая штука как сценарии у моделей, вы можете использовать сценарий как имя продукта.
    либо вы можете написать валидатор, который из запроса будет определять, какой параметр использовать для конструктора фабрики.
    Например, если у вас много платежных систем, то пользователю можно дать на выбор 4 ссылки (4 платежные системы) в роутеры которых зашиты их названия, т.е. pay/yandex-money или pay/webmoney
    тогда в клиентском коде вы должны будете что то типо такого сделать:
    ... 
    Validator / Scenario / Router
    ...
    $payMethod = $validator->scenario() // yandex-money
    ...
    $paymentSystem = new PaymentFactory($payMethod);
    $paymentSystem->pay();//оплачиваем через яндекc деньги
    ...
    Ответ написан
    2 комментария
  • Как создать экземпляр класса в фабричном методе?

    vitaly_74
    @vitaly_74
    1. case сам по себе не есть плохо, и это не считается дурным тоном. т.е. использовать конструкцию case можно и нужно.
    2. Давайте подумает чем характеризуется объект экземпляра класса, а потом перейдем к фабрике.
    Объект прежде всего характеризуется данными хранящимися внутри него. Т.е. Фабрика должна внутри себя хранить то что она выпускает (строит) и всю информацию о нем.
    3. не используйте рефлекшен. это плохо это дурной код, без крайней необходимости не нужно. Обычно рефлекшены не используются в клиентском коде, только непосредственно в самих фреймворках. но раз вы задаете вопросы про фабрики, вы фреймворк не пишите, а значит и использование рефлекшенов вам не нужно.
    4. Взгляните на оператор new (например, new Factory()) по сути оператор new и есть фабрика, которая из класса создает объект с уникальными (а может и не всегда) наборами данных.
    5. в ссылке выше, вам дали информацию по рефакторингу switch но если прочитать там, написано,
    не стоит трогать если
    Зачастую оператор switch используется в фабричных паттернах проектирования (Фабричный метод, Абстрактная фабрика) для выбора создаваемого класса

    вот в данном случае не нужно трогать.
    Почему лучше использовать switch?
    - потому что когда через год, или два зайдете в эту фабрику, навряд ли вы захотите разбираться в рефлекшенах, и не интуитивных выражениях. А когда все есть в switch вы сразу увидите перед глазами какие объекты может выпускать фабрика + по аналогии создать подобный объект используя менее трудозатрат (почти копипаст).
    Вот тут хороший пример фабрики:
    https://refactoring.guru/ru/design-patterns/factor...
    или можно так:
    /**
     * Интерфейс Продукта объявляет операции, которые должны выполнять все
     * конкретные продукты.
     */
    interface Product
    {
        public function operation(): string;
    }
    
    /**
     * Конкретные Продукты предоставляют различные реализации интерфейса Продукта.
     */
    class ConcreteProduct1 implements Product
    {
        public function operation(): string
        {
            return "{Result of the ConcreteProduct1}";
        }
    }
    
    class ConcreteProduct2 implements Product
    {
        public function operation(): string
        {
            return "{Result of the ConcreteProduct2}";
        }
    }
    
    class Factory implements Product{
       private $product;
       function __construct(string $productClass){
           switch($productClass){
               case default:
               case ConcreteProduct1::class:
                          $product = new ConcreteProduct1();
               break;
               case ConcreateProduct2::class:
                          $product = new ConcreateProduct2();
               break;
           }
           $this->product = $product;
       }
    
       public function operation(): string
        {
            return $this->product->operation();
        }
    }
    
    $product = new Factory(ConcreateProduct1::class);
    echo $product->operation();


    В данном случае Разрешено менять старый код, но только в пределах switch.
    Ответ написан
    7 комментариев
  • Как оптимизировать контроллер на Yii2?

    vitaly_74
    @vitaly_74
    Про материал: https://elisdn.ru/blog/search?q=yii2
    или используйте паттерн DTO - и в него запихните все запросы которые вам необходимы в экшене и получится примерно так:
    $dto->similarQuestions()
    или можно пойти еще дальше и создать Active Query как сделано здесь https://github.com/ElisDN/yii2-demo-catalog/blob/m...
    и тогда можно будет сделать так:
    $dto->questions()->similar();
    $dto->questions()->last();
    $dto->questions()->count(); //или тут использовать связь и вызывать count как свойство.
    Ну а в будущем если понадобится просто оптимизируете запросы questions или в файле DTO или его составные части уже непосредственно в файле QuestionsSubQuery(или назвать просто QuestionsQuery)
    Ответ написан
    Комментировать
  • Как сделать зависимость более абстрактной?

    vitaly_74
    @vitaly_74
    Попробуйте использовать интерфейсы. Но из проекта в проект. с методами не угадаете, поэтому из проекта в проект вам придется использовать паттерн адаптер + интерфейс. адаптер чтобы угадать с именем метода, в новом проекте. но это всё геморно. но ответ на ваш вопрос я дал
    Ответ написан
  • Извлечь имя из текста на php возможно?

    vitaly_74
    @vitaly_74
    кроме регулярок и словаря ничего не поможет.
    Ответ написан
    Комментировать
  • Можно ли объявить параметры в yii2, так чтобы его получали все контроллеры?

    vitaly_74
    @vitaly_74
    первый вариант: Yii::$app->user->identity->organization->id
    Добавить в класс User (который ActiveRecord) связь с hasOne (или hasMany) и связать с таблицей организацией
    Насколько я понял это у вас уже реализовано, просто попрробуйте запустить
    второй вариант.
    Добавить как глобальную переменную т.е. Yii::$app->organization->id
    Объяснено тут
    третий вариант:
    добавить как параметр
    Yii::$app->params['organization_id'];
    для этого в конфиге приложения добавить графу
    'params' => [
            'organization_id' => User::findOne(Yii::$app->user->id)->organization->id,
        ],
    Ответ написан
    Комментировать
  • Как поменять одним запросом в таблице sql?

    vitaly_74
    @vitaly_74
    Попробуйте использовать ключевое слово IN и подставть туда массив
    например было:
    SELECT *
      FROM contacts
     WHERE last_name = 'Bernard'
        OR last_name = 'Boy'
        OR last_name = 'Tomas';

    стало
    MySQL
    SELECT *
      FROM contacts
     WHERE last_name IN ('Bernard', 'Boy', 'Tomas');

    По сути при переборе вы делаете тоже самое.
    Ответ написан
    1 комментарий
  • Как полностью закрыть админ панель для обычных пользователей в Yii2 со сквозной авторизацией?

    vitaly_74
    @vitaly_74
    Используя механизм начальной загрузки можно выполнить определенный код до запуска приложения и обработки входящего запроса.
    Просто создвйте модуль, например authModule и добавьте его в секцию bootstrap
    "bootstrap" => ["log", "authModule"]
    а в модуле уже ну как хотите и что хотите делайте.
    Он будет подгружаться перед выполнением вашего кода в контроллерах.
    Ответ написан
    Комментировать
  • Почему не срабатывает $application->run(); в YII2?

    vitaly_74
    @vitaly_74
    Похоже, что с вашей конфигурацией что-то не так, вот несколько вещей, которые вы можете проверить:

    Убедитесь, что PHP установлен и работает правильно. Это может показаться глупым, но никогда не знаешь наверняка. Простой способ проверить это-запустить php -v из командной строки и посмотреть, возвращает ли он информацию о версии или какие-либо ошибки.

    Убедитесь, что модуль PHP указан и раскомментирован внутри вашего Apache httpd.conf, это должно быть что-то вроде LoadModule php5_module "c:/php/php5apache2_2.dll" в файле. Найдите LoadModule php и убедитесь, что перед ним нет комментария ( ;).

    Убедитесь, что в файле Apache httpd.conf есть тип PHP MIME. Это должно быть что-то вроде AddType application/x-httpd-php .php . Это говорит Apache о запуске .php файлов как PHP. Найдите AddType, а затем убедитесь, что есть запись для PHP и что она раскомментирована .

    Убедитесь, что ваш файл имеет расширение .php или любое другое расширение, указанное в определении MIME в пункте #3,, иначе он не будет выполнен как PHP.

    Убедитесь, что вы не используете короткие теги в файле PHP ( <?), они по умолчанию включены не на всех серверах , и их использование не рекомендуется. Вместо этого используйте <?php (или включите короткие теги в вашем php.ini с short_open_tag=On , если у вас есть код, который полагается на них).

    Убедитесь, что вы получаете доступ к своему файлу через webserver, используя URL, как localhost/file.php , а не через локальный доступ к файлу file://localhost/www/file.php

    Убедитесь что присутствует файл конфигурации пхп
    /etc/apache2/mods-available/php7.conf:


    SetHandler application/x-httpd-php
    Ответ написан
    Комментировать
  • Как перевести сложный массив в таблицу?

    vitaly_74
    @vitaly_74
    array_map
    Ответ написан
    Комментировать