Ответы пользователя по тегу Laravel
  • Laravel + Inertia. Как настроить формат JSON?

    neuotq
    @neuotq
    Прокрастинация
    Inertia конечно же не избавляет от процесса рендера на клиенте, эта библиотека убирает не нужную(там где она не нужна) возню и прослойку в виде api, позволяя строить номодный фронтенд в прямой связи с классическим бекендом. Если вам нужен серверный рендер, то такая опция есть, но нужно будет ставить и настраивать SSR и node на сервере. После этого частично рендер будет происходить на сервере(по аналогии как это в фреймвораках типа Nuxt/Next).
    Либо же взглянуть на совсем иной подход в виде Livewire, где мы получаем ту же "реактивность" и прочее, но обмен данными уже идет в виде блоков html. Что кстати более логично если мы строим приложение вокруг веба, без разделения на API/бэкенд - фронтенд. Как бы апгрейд классического подхода, зачастую имееющий МНОГО плюсов, если не собираетесь строить сильный API, кучу разных приложений для него и тп. А всё будет вокруг веба.
    Ответ написан
    Комментировать
  • Почему при работе с inertia на сервере идет обращение к локальным адресам?

    neuotq
    @neuotq
    Прокрастинация
    Судя по всему идёт обращение словно бы dev сервер vite запущен. Он как раз по умолчанию порт 5173.
    При выкатке приложения на продашн сервер нужно сделать npm run build, чтобы построить фронт.

    Либо альтернативно билдить на локалке, но тогда нужно изменить штатные .gitignore файлы, чтобы не игнорировалась папка public/assets/build (hot пусть игнорируется) и его тоже коммитить. И уже собранный фронт деплоить на сервер без сборки.

    Ну и не забываем проверять наш .env на установку всех нужных перемнных, а так же очистку кеша и тп
    Ответ написан
    3 комментария
  • Как сделать перевод динамических данных с БД laravel-vue-i18n?

    neuotq
    @neuotq
    Прокрастинация
    Советую не мучатся делая свой велосипед и использовать пакет типа https://github.com/spatie/laravel-translatable .
    Если не хочется прям привязываться к их реализации можно взять лайт версию этой идеи:
    • в базе поля что будут мультиязычными хранить в json
    • создать свой аналогичный трейт с мутаторами eloquent что будут брать и возвращать нужное значение на основе локали(можно акссесорами и другими способами, но будет не так "красиво")
    • добавить разных хелпер функций по вкусу.
    • Профит.

    Почитайте код пакета выше, там всё просто в целом.
    Ответ написан
    Комментировать
  • Laravel Relationships, не использовать left join, как заменить?

    neuotq
    @neuotq
    Прокрастинация
    Это классическая проблема N+1 запроса: при обращении к БД делаем лишних N запросов, хотя можно обойтись одним сразу.
    В Laravel она возникает из-за ленивой загрузки отношений по умолчанию, те при выборке данных модели из БД, отношения не выбираются. Чтобы этого избежать используется with (и его "друзья").
    //Выбрали все посты, данные только по ним
    $posts = Post::orderBy('created_at', 'desc')->limit(20)->get();
    foreach( $posts as $post )
    {
    //обращение к БД за данными по отношению user
      print_r($post->user);
    }
    
    //Два запроса
    // 1.Выбрали все посты, данные только по ним
    // 2. ПО айдишкам из данных таблицы постов, выбрали сразу все нужные из user
    $posts = Post::orderBy('created_at', 'desc')->with('user')->limit(20)->get();
    foreach( $posts as $post )
    {
    //обращение к БД за данными по отношению user НЕ происходит, данные уже есть и скомпонованы
      print_r($post->user);
    }

    Советую читать документацию,
    так же самые распространенные подводные камни с N+1 https://laravel-news.com/laravel-n1-query-problems
    Ответ написан
    1 комментарий
  • Почему появляется ошибка DELETE http://127.0.0.1:8000/api/anketa/1 405 (Method Not Allowed)?

    neuotq
    @neuotq
    Прокрастинация
    Такая ошибка, при верном коде в бекэнде, обычно появляется если запрос идёт из формы(не важно напрямую или аякс запрос) и методе в форме/аякс запросе вы указали метод "DELETE". Он не поддерживается, нужно ставить метод POST, а в данных при запросе передавать "_method:"DELETE"". Поэтому если из запрос из условного "HTML"/браузера то тип запроса POST, с пометкой в данных что это DELETE. (через добавления в форму поля _method со значением DELETE или добавление в объект в данные _method:"DELETE")

    axios.post(`/api/anketa/${id}`, {_method: 'delete'})
                    .then(res => {
                        this.getpoluhenie();

    А из сторонних клиентов, которые поддерживают метод DELETE (сам клиент) так делать не нужно, можно использовать метод DELETE напрямую.
    Ответ написан
  • Как отправить письмо с Ларавель из-под Опенсервер?

    neuotq
    @neuotq
    Прокрастинация
    Если я верно понимаю openserver использует sendmail и сам уже в своих настройках разруливает всё дальше. Значит вам нужно в настройках почты проекта на Laravel указать в качестве драйвера почты сендмейл в файле .env
    MAIL_DRIVER=sendmail
    Ну и произвести настройки почты уже в самом open server согласно их документации.
    Ответ написан
  • Как установить необязательный префикс?

    neuotq
    @neuotq
    Прокрастинация
    Способ есть, через динамическое возвращение в префиксе, ну грубо говоря:

    Route::middleware('default_locale')
    ->prefix(request()->segment(1) == 'ru' ? request()->segment(1) : null )
    ->group(function () {
        Route::get('/', function (){
          return view('playground', [
            'language' => app()->getLocale()
          ]);
        });
    });

    Можно ту штуку в префиксе вынести в отдельную функцию, я написал кратко чтобы была понятна сама идея доп штуки с проверкой на все локали я думаю вы сами допишете.
    Ну и изменить сам Миддлвар оставив там только логику установки локали не устанавливая переменную locale.
    Ответ написан
    3 комментария
  • Laravel Scout + Потоки Был ли у кого подобный опыт?

    neuotq
    @neuotq
    Прокрастинация
    Можно обойти и сделать через searchable(),
    таким образом распределив модели через условие:
    Model::where('something', $currentBatchQuery)->searchable();

    PS а что так часто обновляются ключи для индекса?
    Ответ написан
  • Как и где можно проверить, есть ли для изменения поля в laravel requests?

    neuotq
    @neuotq
    Прокрастинация
    Почему костыльно?
    Почитайте про sometimes - здесь мы говорим что валидировать если поле есть в теле запроса
    Ну и про усложнённую логику валидации.
    Скорее всего вам просто нужно вместо nullable, сделать sometimes и тогда вы будете валидировать поле, только если оно есть в запросе.
    Ответ написан
    4 комментария
  • Как удалить ключ из массива коллекций?

    neuotq
    @neuotq
    Прокрастинация
    Используйте pluck или only, что лучше подходит в вашем контексте
    Ответ написан
    Комментировать
  • Как в Laravel выполнить задачу время которой указано в БД?

    neuotq
    @neuotq
    Прокрастинация
    Самый простой способ это начать с планировщика https://laravel.com/docs/9.x/scheduling, там допустим сделать задание(уже вам виднее Job или ещё как), который будет в момент запуска проверять вашу БД на текущие задачи и делать их.
    Ну те сделали, например каждую минуту
    $schedule->call(new DoCurrentJobsFromDb)->everyMinute();

    А в DoCurrentJobsFromDb запрос к базе, выборка по времени текущих заданий и отправка их на немедленное выполнение(тут снова тем или иным способом, подходящим под вашу архитектуру).
    Параметры частоты уже выбираете из ваших соображений.
    Ответ написан
    2 комментария
  • Как сделать доп. поля для laravel с зависимостью от выбранной категории?

    neuotq
    @neuotq
    Прокрастинация
    У вас есть два пути, у которых есть общая часть это данные о языке оригинале (правда не без подводных камней, есть двуязычные, но пока опустим).
    Первый вариант, вы в Song храните id песни, язык оригинала(пусть сейчас условно строка, 'en' или 'ru', но возможно id языка и связь с другой таблицей), ну и другие мета данные, айди автора, группы и прочее.
    а в отдельной таблице SongTranslations вы храните уже id, id песни, язык(или его id), название, текст.
    Второй вариант, мне он немного больше нравится в самой таблице Song сделать больше текстовое/json поле где мы будем хранить переводы песни в виде json (снова таки возможно он будет сложнее)
    {
    [
    {'en': { 
    title: 'название на английском',
    lyric: 'текст на английском'
    }
    },
    {'ru': { 
    title: 'название на русском,
    lyric: 'текст на русском'
    }
    }
    ]
    }

    Ну идею вы поняли
    Ответ написан
  • Существуют ли какие-то устоявшиеся паттерны, если я хочу всё приложение сделать в виде Laravel-Composer-пакетов?

    neuotq
    @neuotq
    Прокрастинация
    Насчёт конкретно подхода о котором вы говорите не скажу, скорее всего это плохая идея. Видел пару примеров несколько лет назад, бОльшая часть этих модульных подходов было нечто среднее между недомикросервисного подохода, с примесью разработки composer пакетов и элементами (концептуальными) плагинов wordpress.
    Или другой подход где "модули" laravel разделялись пространством имен и особой структурой, с некоторыми костылями для поддержки разделения кода. Этот подход формально лучше, но по факту обычное не нужное усложнение проекта. Но если вам интересно, можете изучить https://github.com/nWidart/laravel-modules
    Но как по мне, если уж и заморачиваться в подобном плане, то скорее наоборот отвязкой максимальной ядра приложения от любого фреймворка framework-agnostic подход.
    А так... Главный принцип, в целом кстати во многом пересекается с принципами микро сервисной архитектуры:
    есть определенная часть/логика приложения, которая может выполнять свою функцию независимо, которую могут писать разработчики независимо, можно выделить в отдельный пакет. Например, вы придумали свой крутой прокси изображений, и он как-то явно выходит за рамки вашей бизнес-логики приложения, более того возможно он пригодится в ваших других приложениях (или вы хотите поделиться с миром) делайте отдельный пакет.
    Ну и конечно у таких пакетов, могут быть зависимости в виде других пакетов.
    А вот прям делать декомпозицию приложения на пакеты, ради декомпозиции не стоит. Только если есть конкретный смысл что-то выделить.
    Примеры вот хорошие у Spatie https://spatie.be/open-source?search=&sort=-downloads .
    Там же можно посмотреть, как пакеты зависят друг от друга, например image от image-optimizer.
    Все их, достаточно популярные, пакеты вышли из практики разработки приложений для клиентов.
    Ближе к вашему примеру это проект Nova https://nova.laravel.com/ и тоже имеет кучу пакетов https://novapackages.com/ .
    Но здесь тоже нужно учитывать, цели самой Nova и почему такая организация. Сама Nova это как бы расширяемый прототип панели управления для CRUD приложений, она универсальная by design, поэтому и нужны доп пакеты, которые закрывают конкретные цели.
    Если у вас целевое приложение, то незачем его корневую бизнес логику куда-то выводить.
    Ответ написан
    1 комментарий
  • Как правильно реализовать прогрузку части данных в БД на Laravel?

    neuotq
    @neuotq
    Прокрастинация
    Это обычный постраничный вывод, только здесь сами страницы подгружаются динамически: по мере скролла происходит запрос к серверу.
    Советую внимательно прочитать https://laravel.com/docs/9.x/pagination , там есть вся нужная вам информация
    Ответ написан
    Комментировать
  • Laravel sail как полностью удалить?

    neuotq
    @neuotq
    Прокрастинация
    Laravel Sail всего лишь обёртка с командами чтобы быстро развернуть удобное докер окружение вокруг Ларавел.
    Поэтому запускаете Docker Desktop и там можно посмотреть какие контейнеры и тп есть в системе. Там же можно быстро удалить.
    Ответ написан
    1 комментарий
  • Как сделать приватные поля в ларавеле?

    neuotq
    @neuotq
    Прокрастинация
    UPD Как правильно заметил товарищ vism я тут немного чуши написал по инерции. Не посмотрел куда дал ссылку. Там в примере главная проблема что человек из репозитория снова таки возвращает саму элокуент модель, а хорошо бы DTO - Data Transfer Object. Посмотрите пакет от Spatie https://github.com/spatie/data-transfer-object.

    А в целом ответить на ваш вопрос легче было, если был бы ясен контекст. Зачем приватные поля? Возможно все проще перевести в данные у вас, и это логику "защиты" перенести на уровень валидации. Тогда и ставить ничего не нужно, просто в валидации, где нужно, проверяйте входящие данные и выкидывайте ошибку. Здесь будет и гибкость(где нужно разные влаидаторы) и "магия" Ларавел в целом сохраняется коробочная.
    /---
    Это потому, что Laravel в качестве ORM использует Eloquent, который сделан по паттерну ActiveRecord. Многие считают его антипаттерном. Оставим срачи за рамками.
    Вам подойдёт внедрения подхода с паттерном репозитория .
    Вот простой пример, будет понятно куда копать и как действовать:
    https://www.twilio.com/blog/repository-pattern-in-...
    Ответ написан
  • Как отметить все выбранные флажки, если дано 2 массива?

    neuotq
    @neuotq
    Прокрастинация
    Два цикла точно не нужны.
    Где-то делаешь так, коллекцию из айдишников:
    $postCategoriesIds = $post->categories->pluck('id')->all();

    Ну и потом проверяешь входит ли айдишник в ту коллекцию.
    foreach($categories as $category)
     <option value="{{ $category->id }}" @if($postCategoriesIds->contains($category->id)) selected @endif>{{ $category->name }}</option>
    endforeach
    Ответ написан
    3 комментария
  • По какой причине Middleware TrimStrings включен по умолчанию в Laravel?

    neuotq
    @neuotq
    Прокрастинация
    Это вопрос старой боли с пробелами в конце и в начале(реже) вводимых пользователями в разных полях.
    Проблема настолько часто встречалась, что обрезка пробелов была почти всегда в коде. Поэтому добавили такой функционал по умолчанию, одновременно кстати с установкой в null пустых строк. Что тоже повысило удобство.
    Если нужно там можно писать исключения.
    Ответ написан
    6 комментариев
  • Как работать с сидами в Laravel?

    neuotq
    @neuotq
    Прокрастинация
    Сиды предназначены немного для другого, главная их цель это автоматизация тестирования, поэтому и набор методов соответствующий. Ну и на продакшене по умолчанию их нельзя запустить(только используя ключ --force). Но как тогда разделить сиды для данных и для теста? Короче не вариант.
    Вам же можно просто использовать миграции. В них можно писать и логику и тп, в том числе инициализацию и или загрузку каких-либо данных по умолчанию в БД.
    Ответ написан
    Комментировать
  • Как получить красивый url в Laravel?

    neuotq
    @neuotq
    Прокрастинация
    Вы используете getRouteKeyName(), вам тогда нужно изменить метод show, примерно так:
    public function show($ad)
    {   
        return view('ad', compact('ad'));
    }

    и в роутере тогда тоже для красоты
    Route::get('/{ad}', [App\Http\Controllers\AdController::class, 'show'])->name('show');

    Либо, убирайте getRouteKeyName, которым вы задаёте поле по которому вычисляется нужная модель(по дефолту это id)
    Ответ написан
    Комментировать