douyu0845
2018-07-20 11:13
浏览 145
已采纳

Laravel 5.5:获取服务提供商的所有注册路线

I have created a new Service provider and need to get all the registered routes in it. But Route::getRoutes()->getIterator() is returning null.

This is my full code,

<?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);
        }
    }
}

Is there an alternative way to attain routes here?

图片转代码服务由CSDN问答提供 功能建议

我创建了一个新的服务提供者,需要获取其中的所有已注册路由。 但是 Route :: getRoutes() - &gt; getIterator()正在返回 null

这是我的完整代码,

 &lt;?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扩展ServiceProvider 
 {
 /  ** 
 *此命名空间应用于控制器路由。
 * 
 *此外,它被设置为URL生成器的根命名空间。
 * 
 * @var string 
 * / 
 protected $  namespace ='App \ Http \ Controllers'; 
 
公共函数寄存器()
 {
 if if(request :: instance() - &gt;是('api / v *')){
 $ routes  = []; 
 foreach(Route :: getRoutes() - &gt; getIterator()as $ route){
 if((strpos($ route-&gt; uri,'api')!== FALSE)AND basename  ($ route-&gt; uri)== basename(Request :: instance() - &gt; path())){
 $ routes [] = $ route-&gt; uri; 
} 
  } 
 dd($ routes); 
} 
} 
} 
   
 
 

有没有其他方法可以在这里获得路线? \ n

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dougu1985 2018-07-20 11:18
    已采纳

    According to the Documentation: https://laravel.com/docs/5.6/providers#the-boot-method

    You should place your code inside of the boot() method.

    This method is called after all other service providers have been registered

    Currently you are trying to use Route service before it is registered itself.

    So it should look like:

    <?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.
            }
        }
    }
    
    点赞 打赏 评论

相关推荐 更多相似问题