Ответы пользователя по тегу Laravel
  • Вопрос по Laravel queue, как сделать чтоб очереди выполнялись друг за другом и не пересекались?

    agoalofalife
    @agoalofalife
    Team Lead
    Поделюсь опытом, готового решения в Laravel из коробки нет.
    Если надо остаться в рамках Laravel то есть несколько вариантов. Можно допилить функционал в самом Laravel, но код внутри не готов к такой кастомизации. (говорю заранее это будет жесткий костыль, он будет мешать нормальной работе очередей). Второй вариант, сделать еще одну базовую очередь.
    Что я имею в виду?
    Вариант №1
    Мы берем простой кэш или redis(сразу) с его очередью(вроде это lists) , и добавляем туда наши jobs, каждый раз когда когда job выполняется, она смотрит должна ли именно она сейчас выполниться и если нет, то скрипт ее возвращает обратно в обычную очередь.
    Соответственно запуск job регулируется другой очередью(то есть вы организуете добавление jobs в обычную очередь), из минусов, ваши jobs будут туда сюда гоняться скриптом и полезной работы не какой. Если например один уйдет в fail jobs - worker будет гонять туда сюда пока вы не выполните его и не восстановиться работа.

    Вариант №2
    Второй вариант сделать уже нормальную базовую очередь. К примеру, делаете таблицу в базе данных. Когда job в нормальном flow должен отправляться в очередь, вы отправляете его в эту таблицу. Дальше вы пишите своего демона(worker) который просматривает вашу таблицу на предмет выполнения.
    Если что то готово выполняться, он отправляет его в обычную очередь. Добавляете в эту таблицу статусы и вперед.
    Job добавилась в таблицу - "ready"
    Job ушла - "в процессе"
    Job выполнилась - "удалилась из таблицы или approved"
    Возможно еще есть колонки для группировки(например принадлежность какой нибудь группе), теперь ваш демон может запускать их по очереди даже в рамках групп.
    Соответственно все идут друг за другом, пока один "в процессе" остальные не берутся.
    Ответ написан
  • Как структурировать миграции Laravel, чтобы при миграции не указывать каждую папку отдельно?

    agoalofalife
    @agoalofalife
    Team Lead
    Я видел такую библиотеку но сам не пробывал
    Может быть у нее и нет тех проблем что вы описали
    Ответ написан
  • Валидация номера телефона?

    agoalofalife
    @agoalofalife
    Team Lead
    Попробуйте эту библиотеку она не раз меня выручала уже
    Ответ написан
    Комментировать
  • Как в данном случае написать Unit тест?

    agoalofalife
    @agoalofalife
    Team Lead
    На сколько я вижу это инфраструктурный код - поэтому проще его тестировать функциональными тестами (которые в папке Laravel называются Feature)
    1) Решается функциональным тестом, будет использоваться тот который укажете - подойдет просто оперативная память
    Имеется в виду - что вы просто отправляете запрос и ждете определенный результат
    2) Можно задать в тесте - а лучше в файле окружение env.testing
    3) Почему у вас ищет метод environment в Container без контекста сказать сложно, этот метод в классе Application
    Ответ написан
    Комментировать
  • Что думаете о Livewire и Inertia.js?

    agoalofalife
    @agoalofalife
    Team Lead
    И тот и другой инструмент под свой круг задач вполне подходит.
    Livewire - как вам ответили выше, хорошо подходит mvp, небольших сайтов, где нет большой нагрузки и грандиозных планов.
    Хотя кто-то берет на себя риски и делает все на нем. Из подводных камней, это у вас связаны руки в js, так же на каждое действие, он будет слать запрос на сервер. То есть написали букву в input, запрос на сервер(хотя можно оптимизировать, но тем не менее), в итоге получается такой оверхед на все.
    Стоит иметь в виду о смеси ответственностей, точнее livewire будет вас постоянно склонять к этому, так как в классах php у вас постоянно логика фронта.
    Еще могут быть не очевидные проблемы, при синхронизации данных, и вам надо будет подставлять задержки.
    У меня была проблема с загрузкой файла, в кратце есть две настройки в вашем php.ini и отдельно в файле livewire, в каждом стоит свое максимальное значение размера файла.
    Так вот- грузил я картинку по событию change, после загрузки была написана валидация, в кратце файл не грузился и в блок с валидации было пусто.
    Проблема заключалось в том, что livewire не как об этом не сообщал и не намекал, просто не грузил файл и валидация не проходила.
    Так что будьте готовы решать такие нюансы.
    Мой субъективный опыт получился двоякий, с одной стороны мне понравилась скорость, с другой стороны что-то не работает, возможно это временно пока все шишки не набьешь.

    С Inertia опыт пока только теоретический, но он уже ближе к нормальному стеку. Просто вам не надо думать о роутинге, api, вывода ошибок.
    Врать не буду, ибо фраза:
    В теории нет разницы между теорией и практикой. А на практике есть

    Поэтому я дополню свой ответ позже - если посчастливиться его попробывать

    Вывод
    Рекомендую попробовать оба варианта несколько раз, тогда вы составите для себя полноценное мнение об этих инструментах.
    Любой продукт который поддерживается и используется сообществом - уже лучше N фреймворка который знаете вы и еще двое людей.
    Повторюсь еще раз, имеет место быть, так как для всех копеечных проектов которые живет два понедельника - писать spa - очень дорогое и бессмысленное удовольствие.
    Ответ написан
    Комментировать
  • Как лучше всего организовать маршруты?

    agoalofalife
    @agoalofalife
    Team Lead
    Касательно routes
    Для начала вы можете их разместить в папке routes, а подключить в RouteServiceProvider
    Route::middleware('который нужен')
                 ->namespace($this->namespace)
                 ->group(base_path('routes/ваш путь до файла'));
    Ответ написан
    1 комментарий
  • Где можно посмотреть практики написания хороших тестов для laravel?

    agoalofalife
    @agoalofalife
    Team Lead
    В общем можно посмотреть у Jeffrey Way на https://laracasts.com
    Еще мне нравилась его книга правда наверное она не много устарела.

    Начал копаться и вот здесь не понимаю каким образом в шаблон эндпоинта подставляется конкретный id. https://github.com/austintoddj/canvas/blob/master/...к

    Покопался и открыл для себя тоже кое что новое..
    В ссылке есть ниже метод и у него сверху мета тэг @dataProvider
    Что это такое почитать об этом можно здесь

    Что касательно true way or laravel way - это все относительно.
    Например в этом проекте от тестирует отношения в моделях, это скажем прям такое..
    Потом он тестирует консольные команды..интересно зачем?
    Конечно можно все протестировать, но какой в этом собственно смысл?
    Организация папок - это тоже дело щепетильное, как и название методов и переменных.

    Мне больше нравиться подход DDD. Как правило в проекте чаще всего меняются бизнес требования а не инфраструктура.
    Что может произойти вероятнее - поменять базу данных или поменять алгоритм начисление денежных средств?
    Так вот тестирование доменной области намного оправдание чем тестирование отношений модели в Eloquent.
    Ладно, что - то я разошелся, короче говоря, пишите тесты -> набирайтесь опыта -> рефакторинг -> пишите тесты.
    Ответ написан
    2 комментария
  • Как правильно выносить логику из моделей?

    agoalofalife
    @agoalofalife
    Team Lead
    Во-перых репозитории не бесполезны.
    Во-вторых все что придумали или придумывают имеет смысл, но не везде и не всегда.

    Если у ваc простое CRUD приложение, зачем вам нужны сервисы?
    Скорее всего вы хотели разгрузить контроллеры и фактически перенесли просто код из одного местов в другое.
    И какой код может быть общий, если это просто CRUD.
    В Eloquent уже есть вся магия для создание crud
    User::create()
    User::update()
    User::find()

    Если у вас что-то больше, до значит какая то бизнес - логика все же есть.
    Я вижу два пути:
    - Это читать статьи и книги по архитектуре, подойдет Фаулер, Эванс Эрик, Вернон Вон..Раз вас тянет туда по можете параллельно этим заниматься
    - Просто писать дальше в духе Laravel, но первое второму не мешает.
    Для начала еще эту прочитать.
    Если все прочтете много раз, вопросов станет еще больше, дерзайте!
    Ответ написан
    2 комментария
  • Обязательно ли нужен токен в ларавель?

    agoalofalife
    @agoalofalife
    Team Lead
    Исходить надо из того какая у вас стоит задача:
    - Обычный сайт с серверным рендором
    Это старая схема, где в Laravel для этого все есть. И базовая аутентификация через cookie и хранением сессий в разных местах.
    - Сайт с отдельным клиентом
    Тут бэкэнд обычно разделен от фронтенда. От бэкэнда нужно api(restful, graphql), клиент уже реализовывается как правило на js.
    Тут уже может потребываться токен.
    - Сайт с не одним клиентом
    Тут может быть и сам сайт, и может мобильное приложение и любой другой, которой использует API бэкэнда.
    Тут Passport более востребован но не обязателен.
    - Сайт с требованием выдавать доступ сторонним клиентам
    Тут Passport необходим

    Проще говоря Passport берет на себя работу по организации аутентификации и авторизации внешних клиентов в ваш бэкэнд и вытекающие из этого последствия:
    - хранение
    - шифрование
    - авторизация
    - управление
    - реализация Auth2.0

    Для просто API laravel рекомендует sanctum
    Ответ написан
  • Как использовать artisan команды при создании пакета Laravel 7?

    agoalofalife
    @agoalofalife
    Team Lead
    Рассмотрим пример когда вы разрабатываете свой пакет локально.
    В корне проекта создается папка и добавляется запись в composer.json вроде такой
    "repositories": [
        {
          "type": "path",
          "url": "author/package"
        }
      ]

    Подробнее можно прочитать здесь в документации
    При такой настройке, пакет создаст ссылку в vendor.

    По поводу стандартных команд в Laravel(artisan) тут все индивидуально, к примеру, миграцию можно добавить ваш пакет такой командой
    php artisan make:migration name_migration --path=author/package

    В команде по созданию factories, за корень берется databasePath, выйти из ситуации след образом.
    - В зависимости от контекста менять базовый путь
    - Отнаследоваться или создать свою команду для формирования пути при создании фабрики

    Сам я в таких случаях просто создавал файлы руками.
    Посмотрев несколько готовых пакетов для разработки пакетов под Laravel, такой фичи не обнаружил, а в одном из них предлагают создавать через обычный artisan и просто копировать в свой пакет.

    Еще можно воспользоваться консолью:
    php artisan make:controller OurController && mv app/Http/Controllers/OurController.php author/package/pathWhereControllerStore

    Соответственно можно создать алиас и писать меньше, а можно скрипт, где будет еще изменяться namespace в соответствии с вашим пакетом.
    Ответ написан
    Комментировать
  • Какую админ-панель в Laravel выбрать?

    agoalofalife
    @agoalofalife
    Team Lead
    Из бесплатных могу вам порекомендовать orchid
    Перечислю плюсы:
    - Хорошо поддается кастомизации
    - Бесплатен
    - Документация на русском + разработчик тоже русский(я не приверженец только русского, наоборот за все английское) но часто напрямую обращался к разрабу решал какие то вопросы, на русском было конечно проще.
    - Отличная поддержка, регулярно обновляется и telegram постоянная движуха.
    - Из коробки есть сортировка, фильтры
    - Из коробки некий свой UI Kit которой сводит к минимуму трату времени на отрисовку интерфейса
    Минусы:
    - Свой подход к разработке и термины, надо потратить время для изучения, но это такое, любое решение требует время для изучения.

    Остальное можете прочитать в документации.
    Ответ написан
    2 комментария
  • Можно ли использовать один метод для 2-х роутов?

    agoalofalife
    @agoalofalife
    Team Lead
    С точки зрение работы кода, у вас по двум маршрутам, обрабатывается request в одном контроллере и в одном методе, работать конечно будет.
    Но с точки зрения кода - это конечно не perfect. Тут как в классике, "Все смешалось в доме Облонских".
    - Контроллер кончено ж должен быть другой, и в данный момент не потому что просто так должно быть, а просто название route и контроллера вызывают диссонанс в первую очередь.
    - Во вторых есть такой термин как REST API, и в духе Laravel больше подходит метод show, документация

    Еще мне не нравиться ваш namespace Front, и есть ощущение что он больше не нужен, чем нужен.
    И наверное category всегда лучше чем cat или c.
    Еще можете прочитать про resources

    Ну и главное, про сокращение кода:
    - "Чтобы не создавать еще метод"(где-либо)
    - Чтобы не создавать еще класс
    - Чтобы не создавать еще таблицу в базе
    - Чтобы не создавать еще ...
    Более вероятно будет приводить к плохому коду и путаницы. Мало кода это не равно хороший код. В коммерческой разработке часто очень большая предметная область, с этим надо работать, поддерживать и тому подобное - это порождает больше кода, потому что:
    - Лучше (иногда) создать еще метод
    - Лучше (иногда) вынести в отдельный класс
    - Лучше (иногда) нормализовать и вынести в отдельную таблицу
    Advice - Прочтите документацию Laravel✌️
    Ответ написан
    Комментировать
  • Laravel 5.2 - как отправить письма через очередь, через отдельный коннектор?

    agoalofalife
    @agoalofalife
    Team Lead
    Все же написано в докуменатции

    Можно через helper dispatch(new App\Jobs\SendEmail);
    В контроллере
    $job = (new SendEmail($user))->onQueue('emails');
    $this->dispatch($job);

    Если надо указываете connection.
    Если надо указываете очередь onQueue, оформляя все это в цепочку.

    ну далее например настраиваете supervisor
    Ответ написан
    Комментировать
  • Есть ли метод в Laravel, который устанавливает начальную дату для поиска информации в базе без первоначального её нахождения?

    agoalofalife
    @agoalofalife
    Team Lead
    Если просто запрос можно сделать так
    $from = date('2018-11-01');
    $to = date('2020-11-01');
    // или Carbon
    
    $from = Carbon::parse('2018-11-01')->toDateTimeString();
    
    Model::whereBetween('created_at', [$from, $to])->get();
    Ответ написан
    Комментировать
  • Для laravel есть готовое решение, чтоб по команде php artisan ..... делать бекап базы, и разворачивать ее с бекапа?

    agoalofalife
    @agoalofalife
    Team Lead
    Тут зависит от ваших хотелок. Но самый простой "велосипед" можно в течении минут 10 сделать.
    К примеру у вас mysql и есть утилита mysqldump.
    Соответственно добавляете команды, к примеру:
    php artisan backup:run
    php artisan backup:refresh

    В них заворачиваете ваш mysqldump, название возьмете из файла конфигурации database.php.
    Ответ написан
    Комментировать
  • Как на Laravel подключить контроллер header в другом контроллере, например как это реализовано в OpenCart?

    agoalofalife
    @agoalofalife
    Team Lead
    C opencart не работал, но в Laravel подключить один контроллер в другом звучит дико.
    Можно создать родительский и отнаследовать его.
    Но.. Крайне не рекомендую подходы из opencart тащить в Laravel.
    Прочтите документацию Laravel(на английском), потом еще раз.
    После расширение кругозора, вам придут решение на ваши задачи, но через инструменты Laravel.
    Ответ написан
  • Как хранить информацию о полях, используемых в формах?

    agoalofalife
    @agoalofalife
    Team Lead
    В документации есть некоторые решение этой проблемы.
    Вы можете использовать components, subview, sections. Соответственно - можете нарезать свой макет как вам удобно и переиспользовать его.
    А касательно динамической подстановки полей в формах, какой профит вы получите?
    Наверное это будет по DRY, (Don't Repeat Yourself) только есть и обратная сторона:
    - форма - это так же и валидация, придется как то и это решать
    - внесете в проект своих наработок, которые только усложнят его поддержку другими людьми и вами.
    - потратите дополнительное время на разработку
    Взвесте все - лучшее враг хорошего.
    Ответ написан
    Комментировать
  • Как защитить API laravel + nuxt.js?

    agoalofalife
    @agoalofalife
    Team Lead
    Не до конца понял задачу, можно же выдать клиенту токен а в нем будут права для авторизации.
    Ответ написан
    Комментировать
  • Как осуществить авторизацию пользователя с другого сайта?

    agoalofalife
    @agoalofalife
    Team Lead
    Ошибка может быть в разных местах, тут мы не располагаем всей информации, получается можно высказать только предположения.
    - Ошибка в конфигурационных файлах. Проверьте что в ваших файлах .env или в config/database.php соответствует все параметры.
    - Проверьте что база(на которую вы возлагаете надежды) существует, и доступна любым другим способом(через терминал) по тем параметрам которые указываете в конфиг файлах.

    На счет кода
    Не знаю какой версии Laravel вы пользуетесь но trim есть уже с версии 5.4 документация

    Guzzle можно для начала получить из контейнера в методе login и настроить в service provider.
    Переменные можно не создавать а сразу передать куда надо, раз нет нужды в этом.
    $email = $request->email;
        $pass = $request->password;

    Здесь такая же история, snakecase это плохая практика, и создавать дополнительную вложенность в св-ах тоже нет необходимости.
    $emailUser = trim($request->data_form['email']);
     $passUser =trim($request->data_form['password']);


    Касательно задачи
    На сайте 1, который у вас клиент, надо будет дополнительно организовать middleware, для проверки session или можно написать свои кастомный user provider, документация
    Так же подумайте а будут ли у вас еще клиенты и возможно потребуется организовать какой-нибудь центральный сервис аутентификации.
    Ответ написан
  • Laravel, как передать значение рейтинга в контроллер?

    agoalofalife
    @agoalofalife
    Team Lead
    Советую переформулировать вопрос, добавьте больше подробностей а лучше написать основу самой задачи.
    Значение с клиентской стороны вводиться пользователем или динамически конфигурируется?
    Ответ написан
    Комментировать