Я создал нового поставщика услуг, и мне нужно получить в нем все зарегистрированные маршруты. Но Route::getRoutes()->getIterator() возвращает null.
Это мой полный код,
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\Request;
class ApiVersionServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
public function register()
{
if (Request::instance()->is('api/v*')) {
$routes = [];
foreach (Route::getRoutes()->getIterator() as $route) {
if ((strpos($route->uri, 'api') !== FALSE) AND basename($route->uri) == basename(Request::instance()->path())) {
$routes[] = $route->uri;
}
}
dd($routes);
}
}
}
Есть ли здесь альтернативный способ добраться до маршрутов?
В app.php он загружается после RouteServiceProvider
К сожалению, это не то же самое, как вы можете видеть ответ int @matiit






Согласно документации: https://laravel.com/docs/5.6/providers#the-boot-method
Вы должны поместить свой код в метод boot().
This method is called after all other service providers have been registered
В настоящее время вы пытаетесь использовать службу Route до того, как она будет зарегистрирована.
Так должно получиться:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\Request;
class ApiVersionServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* Using boot method to ensure it is executed when the Route service is ready to be used
*/
public function boot()
{
if (Request::instance()->is('api/v*')) {
$routes = [];
foreach (Route::getRoutes()->getIterator() as $route) {
if ((strpos($route->uri, 'api') !== FALSE) AND basename($route->uri) == basename(Request::instance()->path())) {
$routes[] = $route->uri;
}
}
// Do anything you need with $routes array.
}
}
}
Ага, вот и все. Спасибо, бро :)
Может быть, вы вызываете этот код до загрузки
RouteServiceProvider?