【问题标题】:Laravel check if route for given url exists inside routesLaravel 检查给定 url 的路由是否存在于路由中
【发布时间】:2017-10-02 12:28:44
【问题描述】:

通过提供一个 URL,我想知道是否有任何方法可以确定我的 Laravel 应用程序中是否存在该 URL(与想要检查外部 URL 的“How can I check if a URL exists via Laravel?”相比)?

我试过了,但它总是告诉我 URL 不匹配:

$routes = \Route::getRoutes();
$request = \Request::create('/exists');
try {
    $routes->match($request);
    // route exists
} catch (\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e){
    // route doesn't exist
}

【问题讨论】:

  • 你能回显$request吗?
  • 是的,它为我提供了请求标头:GET /exists HTTP/1.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Accept-Language: en-us,en;q=0.5 Host: localhost User-Agent: Symfony/3.X
  • 这似乎是正确的,您确定路线已经存在吗?你能转储$routes 吗?

标签: php laravel routes laravel-5.4


【解决方案1】:

只使用 if Route::has('example')

【讨论】:

    【解决方案2】:

    Route::has('route_name') 检查路由是否存在(在路由文件上)。

    示例:测试一些应用路由

    <?php
    
    namespace Tests\Feature;
    
    use App\Models\Users\User;
    use Illuminate\Support\Facades\Route;
    use Tests\TestCase;
    
    class RouteTest extends TestCase
    {
        private $routes = [
            'home',
            'users.index',
            'employees.index',
            'logs.index',
        ];
    
    
        public function setUp(): void
        {
            parent::setUp();
    
            // Put an admin on session
            $adminUser = User::getFirstAdmin();
            $this->actingAs($adminUser);
        }
    
        public function testRoutes()
        {
            foreach ($this->routes as $route) {
                $this->assertTrue(Route::has($route));
    
                $response = $this->get(route($route));
                $response->assertStatus(200);
            }
        }
    }
    

    版本

    快速的方法,用 tinker 在终端上输入检查:

    php artisan tinker
    

    然后:

    Route::has('your_route')
    

    route('your_route')
    

    【讨论】:

      【解决方案3】:

      在我的一个 Laravel 应用程序中,我通过执行以下操作实现了它

      private function getRouteSlugs()
      {
          $slugs  = [];
          $routes = Route::getRoutes();
      
          foreach ($routes as $route)
          {
              $parts = explode('/', $route->uri());
              foreach ($parts as $part)
              {
                  $slug    = trim($part, '{}?');
                  $slugs[] = $slug;
              }
          }
      
          return array_unique($slugs);
      }
      

      这个函数将帮助获取在 Laravel 中注册的所有 slug,然后使用简单的in_array 可以检查该 slug 是否已被保留。

      编辑

      根据您的评论,您可以扩展以下功能

      private function getRouteSlugs()
      {
          $slugs  = [];
          $routes = Route::getRoutes();
      
          foreach ($routes as $route)
          {
              $slugs[] = $route->uri();
          }
      
          return array_unique($slugs);
      }
      

      这将为您提供一系列项目:

      0 => "dashboard/news"
      1 => "dashboard/post/news"
      2 => "dashboard/post/news/{id}"
      3 => "dashboard/post/news"
      

      从这里比较应该很容易。

      【讨论】:

      • 如果我将它与Illuminate\Support\Facades\Route; 一起使用,我会得到异常Call to undefined method Illuminate\Routing\Route::getPath()
      • 更新了 Laravel 5.4 兼容性。
      • 感谢您的更新。它现在向我展示了蛞蝓,但我有更复杂的路线,如 /foo/{id}-{name}/{foo}/{bar}-{foobar}/{foo}?param={bar}&amp;param2={bar2} 等。有什么想法吗?
      • 那么上面的代码将为您提供在您的 Routes 文件中定义的路由。我正在分解它并进行一些操作以获取 slug,但您可以改为检查 $route->uri 的实例。修改上面的代码应该很容易得到你想要的。
      猜你喜欢
      • 2017-07-06
      • 2019-12-09
      • 2016-07-08
      • 2021-11-14
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      相关资源
      最近更新 更多