Laravel 检查给定 url 的路由是不是存在于路由中
Posted
技术标签:
【中文标题】Laravel 检查给定 url 的路由是不是存在于路由中【英文标题】: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
吗?
【参考方案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&param2=bar2
等。有什么想法吗?
那么上面的代码将为您提供在您的 Routes 文件中定义的路由。我正在分解它并进行一些操作以获取 slug,但您可以改为检查 $route->uri 的实例。修改上面的代码应该很容易得到你想要的。以上是关于Laravel 检查给定 url 的路由是不是存在于路由中的主要内容,如果未能解决你的问题,请参考以下文章