Задать вопрос

Почему маршруты определенные в пользовательском сервис-провайдере в Laraval недоступны?

Приложение на Laravel 10/Vue 3

Создал модуль и в нем пользовательский сервис провайдер. В пройвайдере в соответствии с документацией добавил загрузку маршрутов:

<?php

namespace App\Modules\Orders;

use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;

class OrdersServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
       $this->loadRoutesFrom(realpath(__DIR__ . '/routes/api/orders.php'));
    }
}


Файла с маршрутами:

<?php


use App\Modules\Orders\Http\Controllers\OrdersController;

$routingConfig = [
    'namespace' => 'App\Modules\Orders\Http\Controllers',
    'prefix' => 'api/orders',
    'domain' => '',
    'middleware' => ['api', 'api.auth', 'api.log', 'api.access', 'api.is_activated'],
];

Route::group($routingConfig, function () {

    Route::get('/', [OrdersController::class, 'index'])->name('orders.index');
    Route::post('status', [OrdersController::class, 'changeStatus'])->name('orders.change-status');
});


Провайдер зарегистрирован в массиве providers файла конфигурации config/app.php.
Команда php artisan route:list показывает маршруты модуля. Кеш приложения, маршрутов и конфигурации очищен.

Несмотря на все это, не работает - при попытке протестировать маршрут на доступность - возвращается главный шаблон:

Route::any('/{all}', function () {
    return view('welcome');
})
    ->where('all', '^(?!api).*$')
    ->where('all', '^(?!storage).*$');


Причем, если маршрут определить в файле routes/api.php - маршрутизация отрабатывает как следует.
  • Вопрос задан
  • 117 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@KiazimKhutaba Автор вопроса
В общем, решение оказалось абсолютно тривиальным - просто поместить пользовательские сервис-провайдеры перед провайдерами самого фреймворка Laravel:

'providers' => ServiceProvider::defaultProviders()->merge([
        /*
         * Package Service Providers...
         */
        \App\Modules\Authentication\OrdersServiceProvider::class,


        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

    ])->toArray(),
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
pickHabr
@pickHabr
Костыльных дел мастер
<?php

namespace App\Modules\Orders;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class OrdersServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
       $this->routes(function () {
            Route::prefix('api/orders')
                ->group(base_path('routes/api/orders.php'));
        });
    }
}


Также, рекомендую сравнить неймспейс в провайдере и в конфиге где его подключаешь, и путь к новому файлу с роутами, что в папке routes действительно есть подпапка апи и в ней файл
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы