Задать вопрос
  • Как ограничить очередь на выполнение только 200 задач в час?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Подключите нормальный почтовик без ограничений и не выдумывайте.

    Уведомления, чаще всего, должны быть практически синхронными иначе в некоторых из них теряется смысл. Используя ограничение 200 сообщений вы лишаете возможности человека получать актуальные уведомления при превышении лимита. Рано или поздно этот лимит будет много раз перекрыт и ваши уведомления никогда не дойдут до пользователя.

    Кроме того, через почтовик могут быть и другие важные сообщения, например, восстановления пароля. Имея лимит — Ваши пользователи могут оказаться в той ситуации когда восстановить пароль не получится. И это будет не самым хорошим впечатлением отвалку системе, а так же не нужными сообщениями в службе поддержке.

    Я уже не говорю о том, что у вас могут быть более важные бизнес сообщения, которые высылают код подтверждения для проведения какой-либо операции в вашей системе, например, платежи. Такие сообщения не только будут негативно восприняты пользователями, но и лишит бизнес денег.

    Это всё не целесообразные вещи, в которые даже углубляться не надо. Почтовик без лимитов всё решит.
    Ответ написан
    9 комментариев
  • Почему laravel не видит мой класс UserService?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Может быть потому, что namespace должны иметь обратный слэш...

    App\Services
    Ответ написан
    1 комментарий
  • Переход к PHP-фреймворку. Какому?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Порядок:
    1. Yii2
    2. Laravel
    3. Symfony

    Yii2 слишком старый, но очень хорош для старта. Можно подождать Yii3, либо сразу начинать с Symfony. Это вам обеспечит много сложностей, но при этом даст хорошее будущее. Так как в хороших компаниях практически все используют Symfony. Если покажется сложным и не подъёмным - вернитесь к Yii2.

    Рекомендую к прочтению:
    Ответ написан
    2 комментария
  • Как получить Id по username телеграм бот?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Через какого-то бота, либо через oauth2 https://core.telegram.org/widgets/login Пример на PHP есть в конце доки.
    Ответ написан
    1 комментарий
  • Как добавить гет параметр в контроллере Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Через Request
    if(!\Yii::$app->request->get('sort')) {
       Yii::$app->request->setQueryParams(['sort' => 'name']);
    }

    2. Через редирект
    if(!\Yii::$app->request->get('sort')) {
        $this->redirect(['view', 'sort' => 'name']);
    }

    3. В DataProvider
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => [
            'defaultOrder' => [
                'name' => SORT_ASC
            ]
        ],
    ]);
    Ответ написан
    1 комментарий
  • Audit log (История действий), лучший вариант?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Все события агрегата должны помещаться в самом корне агрегата, как в варианте 1, но при этом метод который будет применять эти события должен вызываться после того как данные будут сохранить.

    Другими словами в $eventsвы складываете все события при работе с сущностью-агрегатом, а в Handler проходите по этому массиву и отправляете в EventDispatcher каждое событие. Ну а там уже делаете подписчиков событий лога, если нужно. Главное, чтобы все события попадали в диспетчер после того, как данные будут сохранены в базу. Иначе может получится так, что возникла ошибка и сработала роллбек транзакции, откатив все изменения, а события при этом уже ушли.
    Ответ написан
    3 комментария
  • Как сделать скрипт обратного отсчета времени разный для всех пользователей сайта?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    1. Сохраняйте все возможные уникальные данные о данном визите (визитах) госте в таблицу типа: ip, user agent и т д. Всё, что вам нужно.

    2. Далее выбирайте дату последнего визита из базы данных на основе ip. Но учтите, что один IP может быть у нескольких гостей, например, роутер с которого все сидят. Поэтому можно еще и проверять устройство пользователя.

    Дальше, думаю, разберётесь) В куках не удобно. Очистив куки человек может иметь новый таймер на вашем сайте. Более продвинутые будут этим пользоваться. А история визитов вам понадобится может и не только для этих целей. Даже для посещений своих клиентов с аккаунтом на вашем сайье. Например, если человек имеет аккаунт на вашем сайте и авторизован, то в таблице визитов может быть колонка user_id, которая для гостей будет null.
    Ответ написан
    Комментировать
  • Есть ли Календарь для Yii2 с пикером дней чтобы задавать дополнительные выходные и рабочие дни?

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

    Вопрос. Пример из ответов:
    $(document).ready(function (){
      var holiDays = (function () {
        var val = null;
        $.ajax({
            'async': false,
            'global': false,
            'url': 'getdate',
            'success': function (data) {
                val = data;
            }
        });
        return val;
        })();
      var natDays = holiDays.split('');
    
      function nationalDays(date) {
        var m = date.getMonth();
        var d = date.getDate();
        var y = date.getFullYear();
    
        for (var i = 0; i ‘ natDays.length-1; i++) {
        var myDate = new Date(natDays[i]);
          if ((m == (myDate.getMonth())) && (d == (myDate.getDate())) && (y == (myDate.getFullYear())))
          {
            return [false];
          }
        }
        return [true];
      }
    
      function noWeekendsOrHolidays(date) {
        var noWeekend = $.datepicker.noWeekends(date);
          if (noWeekend[0]) {
            return nationalDays(date);
          } else {
            return noWeekend;
        }
      }
      $(function() { 
        $("#shipdate").datepicker({
          minDate: 0,
          dateFormat: 'DD, d MM, yy',
          beforeShowDay: noWeekendsOrHolidays,
          showOn: 'button',
          buttonImage: 'images/calendar.gif', 
          buttonImageOnly: true
         });
      });
    });
    Ответ написан
    Комментировать
  • Как установить php-intl?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    yum install php-intl
    Ответ написан
    1 комментарий
  • Symfony. Как сделать валидацию с зависимостью от значений св-в сущности?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    На все такие бизнес требования невозможно написать валидаторы, можно исхитриться, но тогда уйдёт бизнес правило, которое еще и протестировать сложно.

    Поэтому, что я вам посоветую. Поместить эту бизнес логику внутрь сущности в специальный метод. Например published(): void. Пример из кода.
    Ответ написан
  • Работа с несколькими БД Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Для начала Вам необходимо создать по компоненту для каждого подключения:
    return [
    'components' => [
    'db1' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db1name',
        'username' => 'db1username',
        'password' => 'db1password',
    ],
    'db2' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=localhost;dbname=db2name',
        'username' => 'db2username',
        'password' => 'db2password',
        ],
    ],
    ];


    Потом в коде своего приложения в моделях ActiveRecord Вам необходимо переопределить метод getDb().
    public function getDb() {
        return Yii::$app->db1;
    }
    
    //db2
    public function getDb() {
        return Yii::$app->db2;
    }

    Модели, в которых Вы переопределили метод getDb(), указав db1 как соединение с базой, будут получать данные из базы db1, и наоборот:
    ModelName::find()->select('*')->all();
    Ответ написан
  • Как сменить регистр, только у первой буквы в строке?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Используйте функцию ucfirst
    $foo = 'hello world!';
    $foo = ucfirst($foo);             // Hello world!
    Ответ написан
    Комментировать
  • Какой подход программирования на PHP выбрать в 2020 году?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Как вы поняли, на этот вопрос сложно ответить кратко. В программировании, на любом языке большой список материалов изучения, который постоянно пополняется. Всё зависит от Ваших задач и задач Ваших клиентов. Для кого-то главный фактор - быстрота разработки. Для кого-то — простота. Для кого-то стоимость разработки. Для кого-то важна развиваемость проекта написаного кода. Например, есть люди, зарабатывающие настройкой и поддержкой проектов на Wordpress. Поэтому я бы выделил такой путь программиста на PHP:
    1. Самописный код
    2. CMS (Wordpress, Joomla)
    3. Разработка на фреймворке
    4. Разработка на микрофреймворке

    Так как Вы раньше использовали подходы CMS Wordpress, то Вам стоит пойти на следующий этап — разработка на фреймворке. В этом Вы совершенно правильно мыслите.

    Фреймворк (framework, «каркас», «конструкция») — это динамически пополняемая библиотека языка программирования, в которой собраны его базовые модули. Фреймворки создаются для упрощения процессов разработки приложений, сайтов, сервисов. Чтобы не писать модуль в приложении с нуля, гораздо проще обратиться к готовым шаблонам фреймворков, которые и формируют рабочую среду разработчика.

    Достоинства PHP-фреймворков:

    • Производительность. Фреймворки ускоряют разработку. Например, PHP-фреймворк избавляет вас от необходимости писать запросы к базам данных. В фреймворках реализованы базовые функции CRUD, которые необходимы для работы с базами данных.
    • Масштабируемость. Написанные на фреймворках приложения легко масштабируются.
    • Удобство. Код фреймворков лаконичный, поэтому с ним просто работать. Поддерживать легче проект на фреймворке, чем на нативном PHP.
    • Простота. В PHP-фреймворках используются шаблоны проектирования (например, MVC). Это значительно упрощает разработку, делая процесс быстрее.
    • Безопасность. Приложения на фреймворках лучше защищены, чем приложения на чистом PHP.
    • Экономичность. В фреймворках реализован принцип DRY. Это позволяет разработчикам писать меньше кода.

    Какие есть PHP фреймворки для новичков?

    Конечно, PHP фреймворков больше, но не все подходят новичкам. Поэтому, можно выделить два популярных фреймворка у новичков:
    1. Laravel
    2. Yii2

    Путь к изучению фреймворка:

    1. Почитать документацию PHP. Начиная изучение с прочтение документации у вас отложится в подсознании какие-то «якоря», которые будут у вас всплывать в процессе изучения и которые помогут быстро находить в документации нужную информацию. Как минимум вы будете знать, что такое есть, а то некоторые узнают о функциях php спустя многие года. Это позволит вам использовать полноценно функционал, а не ограничиваться пару функциями из примеров.
    2. Изучить ООП. Программировать на PHP можно двумя подходами: функциональным и объектно ориентированным. Последний более популярный и распространенный. Фреймворки написаны используя этот паттерн. Поэтому, перед изучением фреймворка нужно иметь понимание этого подхода. Посмотрите «Неделя ООП» от Дмитрия Елисеева и попробуйте написать свой ООП-код
    3. Установить фреймворк. Начните с установки фреймворка и попробуйте разработать что-то простое, например, Блог или Новости. Yii2 совсем не сложный. Читая документацию, даже без знаний программирования можно сделать что-то простое.
    4. Задаваться вопросами и находить на них ответы. Дальше у вас будет возникать много вопросов. Постарайтесь сначала самостоятельно находить на них ответы: гуглите, смотрите документацию, а уже потом спрашивайте у сообщества.
    5. Перепишите сайт на другой фреймворк. Попробуйте созданный на Yii2 проект переписать на другой современный фреймворк: Laravel или Symfony. Вы получите хорошую практику и навык, который Вам так же поможет в будущем.

    Почему Yii2 подойдёт новичку?

    • Потому что в Yii2, за последние 5 лет, ничего не поменялось. С одной стороны — минус, для изучения — плюс. Ответов и решений полно и они не устарелые, а значит рабочие. Вы хоть что-то сделаете без особых знаний и навыков. Для учебы Yii2 хватит, но не для нового проекта. Как подрастете — возьмёте современный фреймворк или перепишите на Yii3 который будет в конце 2020 или начале 2021.
    • Потому что Yii2 — это RAD фреймворк (для быстрой разработки). Это значит, что в этом фреймворке заложены принципы простоты и быстроты разработки. Для сложных проектов это проблема, а для Вас же — плюс.
    • Потому что он монолитный. Вам не придётся устанавливать кучу дополнительных пакетов, включая библиотеку UI на Bootstrap, jQuery . Вы сможете быстро установить и начать пользоваться Yii фреймворком
    • Потому что Yii2 может сгенерировать код по базе данных используя UI. В Yii2 есть Gii генератор, который прямо по схеме базе данных генерирует вам код в визуальном режиме, поэтому программисты работают быстрее, что не только экономит время, но и уменьшает стоимость разработки.
    • Потому что Yii2 имеет большое русскоговорящее сообщество и целую толпу ярых фанатов.
    • Потому что Yii2 быстрый и безопасный. В этом инструменте также заложен принцип Don't repeat yourself, т.е. неповторения кода. А с помощью Ajax и JQuery фреймворк облегчает создание высокомасштабируемых веб-приложений. Хотя и jQuery в 2020 году устарела.

    Критика в сторону Yii2:

    • Тенденции 2020 года — писать чистый код на голом PHP с переносимыми компонентами, не привязываясь к канонам какого-то конкретного фреймворка. Чтобы в итоге не стать заложником одного фреймворка. Yii2 не следует этим канонам. Фреймворк внутри на 99% противоречит SOLID.
    • Yii2 вышел в 2014-ом году как немного переписанная версия Yii1.1 из 2011-го. Он до сих пор ориентируется на PHP 5.4. Все шесть лет он архитектурно не развивался. С 2018-ого его разработка заморожена. Так что сейчас Вы начнёте практиковаться на заброшенном два года назад фреймворке шестилетней давности, написанном по канонам Yii1 девятилетней давности. Если выйдет Yii3, то там многих из этих канонов уже не будет. Если это одноразовый проект, который один раз написали и забыли, то делать можно на чём угодно и как угодно. Но если проект делают надолго, то чтобы обезопасить себя от сложности таких постоянных переписываний выбирают сразу более свободные и независимые подходы.
    • Для классического frontend — фреймворк всюду тащит свои встроенные ассеты с jQuery. И чтобы перейти на WebPack надо это из всех мест вычищать. А если делать отдельный JS-фронт, то для построения API половина фреймворка оказывается не нужна.
    • Если вам хватает технологий Yii, JQuery и PHP 5.4 шестилетней давности, то получайте удовольствие. Если нравится свежий подход с настоящим DI-контейнером, типами PHP 7.4, PSR и свежим JS/TS с WebPack.
    • Версии Yii 2.1 фреймворка не планируется. Всё обратно несовместимое в 2.0 не проходит. Переход на Yii будет очен затруднён или вовсе невозможен.

    Подитожим. Ваши знания находятся примерно на уровне 2015-2016 годов, как мне кажется. И тут Вам придется решать самому: либо пойти по плавному развитию, пробуя сначала Yii2, со старыми подходами, но ближе к вашим знаниям, а потом перейти на Laravel или Symfony, либо сразу пойти в 2020 год и использовать Laravel или Symfony, которые соответствуют современным подходам, но дальше от Ваших знаний. Можете попробовать установить все и решить для себя на каком фреймворке будете проходить изучение.

    Рекомендую к прочтению:
    Ответ написан
    3 комментария
  • Как работать с json полями в yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    После считывания из базы декодируем
    Перед сохранением в базу закодируем

    Работа с формой: https://github.com/Myks92/vmc-event/tree/master/sr...
    Ответ написан
    Комментировать
  • Как вынести настройки Swiftmailer из конфига?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Можете использовать готовый модуль или по примеру сделать свой.
    Ответ написан
    Комментировать
  • Как правильно выводить информацию из масива?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    foreach ($datas as $value) {
       echo $value['tg_id'];
    }
    Ответ написан
    1 комментарий
  • Почему заполняется только id?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    public $title уберите
    Ответ написан
  • Как вывести timestamp из MySQL + PHP?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    if($existingInfo["RegisterDate"])) {
        echo (new DateTimeImmutable($existingInfo["RegisterDate"]))->format('d.m.Y H:i:s');
    }
    Ответ написан
    5 комментариев
  • Как отправить pdf файл на почту?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Формируете PDF во время отправки, сохраняете PDF на сервере, затем прикрепляете к сообщению, как вложение. Альтернативой может быть доступ PDF по какой-то ссылке, которую высылаете в сообщении.
    Ответ написан
  • Как сравнить две даты?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    $now = new DateTimeImmutable();
    $date = (new DateTimeImmutable())->setTimestamp(1598300173);
    
    if ($now === $date->modify('+30 days')) {
      ...
    }
    Ответ написан
    Комментировать