路由
基础路由
最基本的 Laravel 路由接受一个 URI 和一个闭包,提供了一种非常简单且富有表现力的方法来定义路由和行为,而无需复杂的路由配置文件:
use Illuminate\Support\Facades\Route;
Route::get('/greeting', function () {
return 'Hello World';
});
默认路由文件
所有的 Laravel 路由都定义在你的路由文件中,这些文件位于 routes
目录下。Laravel 会根据你在应用的 bootstrap/app.php
文件中指定的配置自动加载这些文件。routes/web.php
文件定义的是用于 Web 界面的路由。这些路由被分配到了 web
【中间件组】,其中提供了像会话状态和 CSRF 保护等功能。
对于大多数应用程序,你会从在 routes/web.php
文件中定义路由开始。在浏览器中输入定义的路由 URL,就可以访问 routes/web.php
中定义的路由。例如,你可以通过访问 http://example.com/user 来访问以下路由:
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
API 路由
如果你的应用程序还提供无状态的 API,可以通过运行 install:api
Artisan 命令来启用 API 路由:
php artisan install:api
install:api
命令会安装 Laravel Sanctum,这是一个强大且简单的 API 令牌认证守卫,可用于认证第三方 API 消费者、单页面应用(SPA)或移动应用。此外,install:api
命令还会创建 routes/api.php
文件:
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
routes/api.php
中的路由是无状态的,并且会被分配到 api
【中间件组】。此外,/api
URI 前缀会自动应用于这些路由,因此你无需手动为文件中的每个路由添加前缀。你可以通过修改应用的 bootstrap/app.php
文件来更改前缀:
->withRouting(
api: __DIR__.'/../routes/api.php',
apiPrefix: 'api/admin',
// ...
)
可用的路由方法
路由器允许你注册响应任何 HTTP 动词的路由:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
有时你可能需要注册一个响应多个 HTTP 动词的路由。你可以使用 match
方法来实现。或者,你甚至可以使用 any
方法注册一个响应所有 HTTP 动词的路由:
Route::match(['get', 'post'], '/', function () {
// ...
});
Route::any('/', function () {
// ...
});
当定义多个具有相同 URI 的路由时,使用 |
重定向路由
如果你定义的路由是用于重定向到另一个 URI,你可以使用 Route::redirect
方法。这个方法提供了一个方便的快捷方式,这样你就不需要为简单的重定向定义完整的路由或控制器:
Route::redirect('/here', '/there');
默认情况下,Route::redirect
会返回 302
状态码。你可以通过可选的第三个参数来定制状态码:
Route::redirect('/here', '/there', 301);
或者,你可以使用 Route::permanentRedirect
方法来返回 301
状态码:
Route::permanentRedirect('/here', '/there');
在重定向路由中使用路由参数时,以下参数是 Laravel 保留的,不能使用: |
视图路由
如果你的路由只需要返回一个【视图】,你可以使用 Route::view
方法。与 redirect
方法一样,这个方法提供了一个简单的快捷方式,这样你就不需要为返回视图定义完整的路由或控制器。view
方法接受一个 URI 作为第一个参数,一个视图名称作为第二个参数。此外,你可以提供一个数据数组作为可选的第三个参数,用于传递数据到视图:
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
在视图路由中使用路由参数时,以下参数是 Laravel 保留的,不能使用: |
列出路由
route:list
Artisan 命令可以轻松地提供应用程序中所有定义的路由概览:
php artisan route:list
默认情况下,route:list
输出中不会显示每个路由分配的中间件;然而,你可以通过添加 -v
选项来指示 Laravel 显示路由的中间件和中间件组名称:
php artisan route:list -v
# Expand middleware groups...
php artisan route:list -vv
你还可以指示 Laravel 只显示以特定 URI 开头的路由:
php artisan route:list --path=api
此外,你可以通过在执行 route:list
命令时提供 --except-vendor
选项,指示 Laravel 隐藏由第三方包定义的任何路由:
php artisan route:list --except-vendor
此外,你可以通过在执行 route:list
命令时提供 --except-vendor
选项,指示 Laravel 隐藏由第三方包定义的任何路由:
php artisan route:list --only-vendor
路由自定义
默认情况下,应用程序的路由由 bootstrap/app.php
文件配置和加载:
<?php
use Illuminate\Foundation\Application;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)->create();
然而,有时你可能希望定义一个全新的文件来包含应用程序的一部分路由。为了实现这一点,你可以向 withRouting
方法提供一个 then
闭包。在这个闭包中,你可以注册任何额外的路由,这些路由对于你的应用程序是必要的:
use Illuminate\Support\Facades\Route;
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function () {
Route::middleware('api')
->prefix('webhooks')
->name('webhooks.')
->group(base_path('routes/webhooks.php'));
},
)
或者,你也可以通过向 withRouting
方法提供一个 using
闭包来完全控制路由的注册。当传递此参数时,框架将不会注册任何 HTTP 路由,你需要手动注册所有路由:
use Illuminate\Support\Facades\Route;
->withRouting(
commands: __DIR__.'/../routes/console.php',
using: function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
},
)
路由参数
必需参数
有时你需要在路由中捕获 URI 的一部分。例如,你可能需要从 URL 中捕获用户的 ID。你可以通过定义路由参数来实现这一点:
Route::get('/user/{id}', function (string $id) {
return 'User '.$id;
});
你可以根据需要定义任意数量的路由参数:
Route::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
// ...
});
路由参数总是被包含在 {}
大括号内,并且应该由字母字符组成。下划线 (_
) 在路由参数名称中也是可以接受的。路由参数根据它们在回调或控制器中的顺序注入 - 路由回调或控制器参数的名称不重要。
可选参数
有时你可能需要指定一个在 URI 中并不总是存在的路由参数。你可以通过在参数名称后面加上 ?
来实现这一点。确保为路由对应的变量提供一个默认值:
Route::get('/user/{name?}', function (?string $name = null) {
return $name;
});
Route::get('/user/{name?}', function (?string $name = 'John') {
return $name;
});
正则表达式约束
你可以使用路由实例上的 where
方法来约束路由参数的格式。where
方法接受参数的名称和定义该参数约束条件的正则表达式:
Route::get('/user/{name}', function (string $name) {
// ...
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function (string $id) {
// ...
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
为了方便,某些常用的正则表达式模式有辅助方法,允许你快速为路由添加模式约束:
Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->whereNumber('id')->whereAlpha('name');
Route::get('/user/{name}', function (string $name) {
// ...
})->whereAlphaNumeric('name');
Route::get('/user/{id}', function (string $id) {
// ...
})->whereUuid('id');
Route::get('/user/{id}', function (string $id) {
// ...
})->whereUlid('id');
Route::get('/category/{category}', function (string $category) {
// ...
})->whereIn('category', ['movie', 'song', 'painting']);
Route::get('/category/{category}', function (string $category) {
// ...
})->whereIn('category', CategoryEnum::cases());
如果传入的请求不符合路由模式约束,将返回一个 404 HTTP 响应。
全局约束
如果你希望某个路由参数始终受特定正则表达式的约束,可以使用 pattern
方法。你应该在应用程序的 App\Providers\AppServiceProvider
类的 boot
方法中定义这些模式:
use Illuminate\Support\Facades\Route;
/**
* 引导应用程序服务。
*/
public function boot(): void
{
Route::pattern('id', '[0-9]+');
}
一旦定义了该模式,它会自动应用到所有使用该参数名称的路由:
Route::get('/user/{id}', function (string $id) {
// 只有当 {id} 是数字时才会执行...
});
命名路由
命名路由允许方便地为特定路由生成 URL 或重定向。你可以通过在路由定义后链式调用 name
方法来指定路由的名称:
Route::get('/user/profile', function () {
// ...
})->name('profile');
你也可以为控制器动作指定路由名称:
Route::get(
'/user/profile',
[UserProfileController::class, 'show']
)->name('profile');
路由名称应始终是唯一的。 |
生成命名路由的 URL
一旦为某个路由指定了名称,你可以在生成 URL 或重定向时使用该路由的名称,通过 Laravel 的 route
和 redirect
辅助函数:
// 生成 URL...
$url = route('profile');
// 生成重定向...
return redirect()->route('profile');
return to_route('profile');
如果命名路由定义了参数,你可以通过将参数作为第二个参数传递给 route
函数。给定的参数将自动插入到生成的 URL 中的正确位置:
Route::get('/user/{id}/profile', function (string $id) {
// ...
})->name('profile');
$url = route('profile', ['id' => 1]);
如果你在数组中传递额外的参数,这些键/值对将自动添加到生成的 URL 的查询字符串中:
Route::get('/user/{id}/profile', function (string $id) {
// ...
})->name('profile');
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
// /user/1/profile?photos=yes
有时,你可能希望为 URL 参数指定请求范围的默认值,例如当前语言环境。为此,你可以使用 |
检查当前路由
如果你想确定当前请求是否路由到指定的命名路由,你可以使用路由实例上的 named
方法。例如,你可以在路由中间件中检查当前路由的名称:
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* 处理传入的请求。
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if ($request->route()->named('profile')) {
// ...
}
return $next($request);
}
路由组
路由组允许你在大量路由之间共享路由属性,例如中间件,而不需要在每个单独的路由上定义这些属性。
嵌套路由组会尝试智能地 “合并” 属性到其父组中。中间件和 where
条件会被合并,而名称和前缀则会被附加。命名空间分隔符和 URI 前缀中的斜杠会在适当的地方自动添加。
中间件
要将【中间件】分配给组内的所有路由,可以在定义组之前使用 middleware
方法。中间件会按照它们在数组中的顺序执行:
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// 使用 first 和 second 中间件...
});
Route::get('/user/profile', function () {
// 使用 first 和 second 中间件...
});
});
控制器
如果一组路由都使用相同的【控制器】,可以使用 controller
方法为该组定义公共的控制器。然后,在定义路由时,只需要提供它们调用的控制器方法:
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
子域名路由
路由组还可以用于处理子域名路由。子域名可以像路由 URI 一样分配路由参数,允许你捕获子域名的一部分,用于路由或控制器中。可以在定义路由组之前,通过调用 domain
方法来指定子域名:
Route::domain('{account}.example.com')->group(function () {
Route::get('/user/{id}', function (string $account, string $id) {
// ...
});
});
为了确保你的子域名路由可达,应该在注册根域名路由之前先注册子域名路由。这样可以防止具有相同 URI 路径的根域名路由覆盖子域名路由。 |
路由模型绑定
在将模型 ID 注入到路由或控制器方法时,通常需要查询数据库以获取与该 ID 对应的模型。Laravel 的路由模型绑定提供了一种便捷的方式,可以直接将模型实例自动注入到你的路由中。例如,代替注入用户的 ID,你可以直接注入与给定 ID 匹配的整个 User
模型实例。
隐式绑定
Laravel 会自动解析在路由或控制器方法中定义的 Eloquent 模型,当路由中类型提示的变量名与路由段名称匹配时。例如:
use App\Models\User;
Route::get('/users/{user}', function (User $user) {
return $user->email;
});
由于 $user
变量的类型提示是 App\Models\User
Eloquent 模型,并且变量名与 {user}
路由段匹配,Laravel 会自动注入与请求 URI 中相应值匹配的模型实例。如果在数据库中未找到匹配的模型实例,Laravel 会自动生成一个 404 HTTP 响应。
当然,当使用控制器方法时,隐式绑定也是可能的。同样地,注意 {user}
路由段与控制器中 $user
变量(类型提示为 App\Models\User
)匹配:
use App\Http\Controllers\UserController;
use App\Models\User;
// 路由定义...
Route::get('/users/{user}', [UserController::class, 'show']);
// 控制器方法定义...
public function show(User $user)
{
return view('user.profile', ['user' => $user]);
}
软删除模型
通常情况下,隐式模型绑定不会检索【软删除】的模型。不过,你可以通过在路由定义中链式调用 withTrashed
方法来指示隐式绑定检索这些模型:
use App\Models\User;
Route::get('/users/{user}', function (User $user) {
return $user->email;
})->withTrashed();
自定义键
有时你可能希望使用除 id
之外的其它列来解析 Eloquent 模型。你可以在路由参数定义中指定该列:
use App\Models\Post;
Route::get('/posts/{post:slug}', function (Post $post) {
return $post;
});
如果你希望模型绑定始终使用数据库中的某个列(而非 id
)来检索给定的模型类,你可以在 Eloquent 模型中重写 getRouteKeyName
方法:
/**
* 获取模型的路由键。
*/
public function getRouteKeyName(): string
{
return 'slug';
}
自定义键与作用域
当在单一路由定义中隐式绑定多个 Eloquent 模型时,你可能希望对子模型进行作用域限制,确保它是父模型的子集。例如,考虑以下路由定义,它为特定用户按 slug 获取一篇博文:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
在使用自定义键隐式绑定作为嵌套路由参数时,Laravel 会自动将查询限制为通过父模型获取子模型,并根据惯例猜测父模型的关系名称。在此例中,假设 User
模型具有名为 posts
的关系(即路由参数名称的复数形式),该关系可用于获取 Post
模型。
如果你希望 Laravel 在没有提供自定义键的情况下仍能作用域 “子” 绑定,可以在路由定义时调用 scopeBindings
方法:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
或者,你可以指示一个路由组使用作用域绑定:
Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});
同样,你也可以显式指示 Laravel 不要作用域绑定,通过调用 withoutScopedBindings
方法:
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
})->withoutScopedBindings();
自定义缺失模型行为
通常,如果未找到隐式绑定的模型,Laravel 会生成 404 HTTP 响应。然而,你可以通过在路由定义中调用 missing
方法来定制这种行为。missing
方法接受一个闭包,如果未找到隐式绑定的模型时,将会调用该闭包:
use App\Http\Controllers\LocationsController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
Route::get('/locations/{location:slug}', [LocationsController::class, 'show'])
->name('locations.view')
->missing(function (Request $request) {
return Redirect::route('locations.index');
});
隐式枚举绑定
PHP 8.1 引入了对枚举(【Enums】)的支持。为了配合这一特性,Laravel 允许你在路由定义中使用【枚举】类型提示,并且只有当路由段与枚举值匹配时,Laravel 才会触发该路由。否则,Laravel 会自动返回 404 HTTP 响应。例如,给定以下枚举:
<?php
namespace App\Enums;
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}
你可以定义一个路由,只有当 {category}
路由段为 fruits
或 people
时才会被调用。否则,Laravel 会返回一个 404 HTTP 响应:
use App\Enums\Category;
use Illuminate\Support\Facades\Route;
Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});
显式绑定
你并不需要使用 Laravel 的隐式约定模型解析来使用模型绑定。你也可以显式地定义路由参数如何与模型对应。要注册显式绑定,可以使用路由器的 model
方法为给定参数指定类。你应该在 AppServiceProvider
类的 boot
方法的开始部分定义显式的模型绑定:
use App\Models\User;
use Illuminate\Support\Facades\Route;
/**
* 启动任何应用服务。
*/
public function boot(): void
{
Route::model('user', User::class);
}
接下来,定义一个包含 {user}
参数的路由:
use App\Models\User;
Route::get('/users/{user}', function (User $user) {
// ...
});
由于我们已经将所有 {user}
参数绑定到了 App\Models\User
模型,当路由被调用时,User
类的实例将被注入。因此,例如,对 users/1
的请求将会从数据库中注入 ID 为 1
的 User
实例。
如果在数据库中找不到匹配的模型实例,Laravel 将自动返回一个 404 HTTP 响应。
自定义解析逻辑
如果你希望定义自己的模型绑定解析逻辑,可以使用 Route::bind
方法。你传递给 bind
方法的闭包将接收 URI 段的值,并应返回应该注入到路由中的类的实例。同样,这个自定义逻辑应该在你应用程序的 AppServiceProvider
类的 boot
方法中进行:
use App\Models\User;
use Illuminate\Support\Facades\Route;
/**
* 启动任何应用服务。
*/
public function boot(): void
{
Route::bind('user', function (string $value) {
return User::where('name', $value)->firstOrFail();
});
}
另外,你也可以在 Eloquent 模型中覆盖 resolveRouteBinding
方法。此方法将接收 URI 段的值,并应返回应该注入到路由中的类的实例:
/**
* 获取绑定值对应的模型。
*
* @param mixed $value
* @param string|null $field
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value, $field = null)
{
return $this->where('name', $value)->firstOrFail();
}
如果路由使用了【隐式绑定作用域】,resolveChildRouteBinding
方法将用于解析父模型的子绑定:
/**
* 获取绑定值对应的子模型。
*
* @param string $childType
* @param mixed $value
* @param string|null $field
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveChildRouteBinding($childType, $value, $field)
{
return parent::resolveChildRouteBinding($childType, $value, $field);
}
回退路由
使用 Route::fallback
方法,你可以定义一个路由,当没有其它路由匹配传入的请求时,该路由将被执行。通常,未处理的请求会通过应用程序的异常处理器自动渲染一个 "404" 页面。然而,由于你通常会在 routes/web.php
文件中定义回退路由,因此该路由将应用于 web
中间件组中的所有中间件。你可以根据需要为此路由添加额外的中间件:
Route::fallback(function () {
// ...
});
速率限制
定义速率限制器
Laravel 提供了强大且可定制的速率限制服务,您可以利用这些服务来限制给定路由或路由组的流量。要开始使用速率限制,您应该定义适合您应用程序需求的速率限制器配置。
速率限制器可以在应用程序的 App\Providers\AppServiceProvider
类的 boot
方法中定义:
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
/**
* 启动任何应用程序服务。
*/
protected function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
速率限制器是使用 RateLimiter
门面的 for
方法定义的。for
方法接受速率限制器名称和一个闭包,该闭包返回应适用于分配给该速率限制器的路由的限制配置。限制配置是 Illuminate\Cache\RateLimiting\Limit
类的实例。此类包含一些有用的 “构建器” 方法,可以快速定义您的限制。速率限制器名称可以是您希望的任何字符串:
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
/**
* 启动任何应用程序服务。
*/
protected function boot(): void
{
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000);
});
}
如果传入的请求超过了指定的速率限制,Laravel 将自动返回一个 429 HTTP 状态码的响应。如果您希望定义自己的响应,您可以使用 response
方法:
RateLimiter::for('global', function (Request $request) {
return Limit::perMinute(1000)->response(function (Request $request, array $headers) {
return response('自定义响应...', 429, $headers);
});
});
由于速率限制器回调接收传入的 HTTP 请求实例,您可以基于传入的请求或已认证的用户动态构建适当的速率限制:
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100);
});
分段速率限制
有时,您可能希望按某个任意值来分段速率限制。例如,您可能希望允许用户每分钟最多访问某个路由 100 次,每个 IP 地址限制访问 100 次。为此,您可以在构建速率限制时使用 by
方法:
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(100)->by($request->ip());
});
通过另一个示例来说明这个功能,我们可以将路由的访问限制为每个已认证用户 ID 每分钟 100 次,或者每个 IP 地址每分钟 10 次,针对未认证的用户:
RateLimiter::for('uploads', function (Request $request) {
return $request->user()
? Limit::perMinute(100)->by($request->user()->id)
: Limit::perMinute(10)->by($request->ip());
});
多个速率限制
如果需要,您可以为给定的速率限制器配置返回一个速率限制数组。每个速率限制将根据它们在数组中的位置顺序进行评估:
RateLimiter::for('login', function (Request $request) {
return [
Limit::perMinute(500),
Limit::perMinute(3)->by($request->input('email')),
];
});
如果您为按相同 by
值分段的多个速率限制分配,您应该确保每个 by
值是唯一的。最简单的方法是为 by
方法给定的值添加前缀:
RateLimiter::for('uploads', function (Request $request) {
return [
Limit::perMinute(10)->by('minute:'.$request->user()->id),
Limit::perDay(1000)->by('day:'.$request->user()->id),
];
});
将速率限制器附加到路由
速率限制器可以通过 throttle
【中间件】附加到路由或路由组上。throttle
中间件接受您希望分配给路由的速率限制器名称:
Route::middleware(['throttle:uploads'])->group(function () {
Route::post('/audio', function () {
// ...
});
Route::post('/video', function () {
// ...
});
});
使用 Redis 进行限流
默认情况下,throttle
中间件映射到 Illuminate\Routing\Middleware\ThrottleRequests
类。如果您使用 Redis 作为应用程序的缓存驱动,您可能希望让 Laravel 使用 Redis 来管理速率限制。为此,您应该在应用程序的 bootstrap/app.php
文件中使用 throttleWithRedis
方法。此方法将 throttle
中间件映射到 Illuminate\Routing\Middleware\ThrottleRequestsWithRedis
中间件类:
->withMiddleware(function (Middleware $middleware) {
$middleware->throttleWithRedis();
// ...
})
表单方法伪装
HTML 表单不支持 PUT
、PATCH
或 DELETE
动作。因此,当从 HTML 表单调用 PUT
、PATCH
或 DELETE
路由时,您需要向表单中添加一个隐藏的 _method
字段。字段中发送的值将作为 HTTP 请求方法:
<form action="/example" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
为了方便,您可以使用 @method
【Blade 指令】来生成 _method
输入字段:
<form action="/example" method="POST">
@method('PUT')
@csrf
</form>
访问当前路由
您可以使用 current
、currentRouteName
和 currentRouteAction
方法,通过 Route
门面来访问当前处理传入请求的路由信息:
use Illuminate\Support\Facades\Route;
$route = Route::current(); // Illuminate\Routing\Route
$name = Route::currentRouteName(); // string
$action = Route::currentRouteAction(); // string
您可以参考 API 文档,查看 Route
门面和 Route
实例的底层类,以查看路由和路由实例上所有可用的方法。
跨域资源共享(CORS)
Laravel 可以自动响应 CORS OPTIONS
HTTP 请求,并使用您配置的值。这些 OPTIONS
请求将由 HandleCors
【中间件】自动处理,该中间件已自动包含在您应用程序的全局中间件堆栈中。
有时,您可能需要自定义应用程序的 CORS 配置值。您可以通过运行 config:publish
Artisan 命令来发布 CORS 配置文件:
php artisan config:publish cors
此命令会将一个 cors.php
配置文件放置在您应用程序的 config
目录中。
有关 CORS 和 CORS 头的更多信息,请查阅 【MDN 关于 CORS 的文档】。 |