Routing
基本路由
最基本的 Laravel 路由接受一个 URI 和一个闭包,提供了一种非常简单且富有表现力的方法来定义路由和行为,而无需复杂的路由配置文件:
use Illuminate\Support\Facades\Route;
Route::get('/greeting', function () {
return 'Hello World';
});
默认路由文件
所有 Laravel 路由都在你的路由文件中定义,这些文件位于routes
目录。这些文件由您的应用程序自动加载App\Providers\RouteServiceProvider
.这routes/web.php
文件定义用于您的 Web 界面的路由。这些路线被分配了web
中间件组,提供会话状态和 CSRF 保护等功能。中的路线routes/api.php
是无国籍的,并被分配api
中间件组。
对于大多数应用程序,您将首先在您的routes/web.php
文件。中定义的路线routes/web.php
可以通过在浏览器中输入定义的路由的 URL 来访问。例如,您可以通过导航到以下路线http://example.com/user
在您的浏览器中:
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
中定义的路线routes/api.php
文件嵌套在路由组中RouteServiceProvider
.在这个群体中,/api
URI 前缀是自动应用的,所以你不需要手动将它应用到文件中的每个路由。您可以通过修改您的RouteServiceProvider
班级。
可用的路由器方法
路由器允许您注册响应任何 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
方法:
Route::match(['get', 'post'], '/', function () {
// ...
});
Route::any('/', function () {
// ...
});
Note
定义共享相同 URI 的多个路由时,使用get
,post
,put
,patch
,delete
, 和options
方法应该在路由之前定义any
,match
, 和redirect
方法。这确保传入请求与正确的路由匹配。
依赖注入
您可以在路由的回调签名中对路由所需的任何依赖项进行类型提示。声明的依赖项将被 Laravel 自动解析并注入到回调中服务容器.例如,您可以键入提示Illuminate\Http\Request
类将当前 HTTP 请求自动注入到您的路由回调中:
use Illuminate\Http\Request;
Route::get('/users', function (Request $request) {
// ...
});
CSRF保护
请记住,任何指向POST
,PUT
,PATCH
, 或者DELETE
中定义的路由web
routes 文件应该包含一个 CSRF 令牌字段。否则,请求将被拒绝。你可以阅读更多关于 CSRF 保护的信息CSRF文档:
<form method="POST" action="/profile">
@csrf
...
</form>
重定向路由
如果你正在定义一个重定向到另一个 URI 的路由,你可以使用Route::redirect
方法。此方法提供了一个方便的快捷方式,因此您不必定义完整的路由或控制器来执行简单的重定向:
Route::redirect('/here', '/there');
默认情况下,Route::redirect
返回一个302
状态码。您可以使用可选的第三个参数自定义状态代码:
Route::redirect('/here', '/there', 301);
或者,您可以使用Route::permanentRedirect
方法返回一个301
状态码:
Route::permanentRedirect('/here', '/there');
Warning
在重定向路由中使用路由参数时,以下参数是 Laravel 保留的,不能使用:destination
和status
.
查看路线
如果你的路线只需要返回一个view, 你可以使用Route::view
方法。像redirect
方法,此方法提供了一个简单的快捷方式,因此您不必定义完整的路由或控制器。这view
方法接受一个 URI 作为它的第一个参数,一个视图名称作为它的第二个参数。此外,您可以提供一个数据数组作为可选的第三个参数传递给视图:
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
Warning
在查看路由中使用路由参数时,以下参数是 Laravel 保留的,不能使用:view
,data
,status
, 和headers
.
路线清单
这route:list
Artisan 命令可以轻松提供应用程序定义的所有路由的概览:
php artisan route:list
默认情况下,分配给每个路由的路由中间件不会显示在route:list
输出;但是,你可以通过添加来指示 Laravel 显示路由中间件-v
命令选项:
php artisan route:list -v
你也可以指示 Laravel 只显示以给定 URI 开头的路由:
php artisan route:list --path=api
此外,你可以指示 Laravel 隐藏任何由第三方包定义的路由,方法是提供--except-vendor
执行时的选项route:list
命令:
php artisan route:list --except-vendor
同样,你也可以指示 Laravel 只显示由第三方包定义的路由,方法是提供--only-vendor
执行时的选项route:list
命令:
php artisan route:list --only-vendor
路由参数
必需参数
有时您需要捕获路由中的 URI 片段。例如,您可能需要从 URL 中捕获用户 ID。您可以通过定义路由参数来实现:
Route::get('/user/{id}', function (string $id) {
return 'User '.$id;
});
您可以根据路线的需要定义任意数量的路线参数:
Route::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
// ...
});
路由参数总是包含在{}
大括号,应由字母字符组成。下划线 (_
) 在路由参数名称中也是可以接受的。路由参数根据它们的顺序注入路由回调/控制器——路由回调/控制器参数的名称无关紧要。
参数和依赖注入
如果您的路由具有您希望 Laravel 服务容器自动注入到您的路由回调中的依赖项,您应该在依赖项之后列出您的路由参数:
use Illuminate\Http\Request;
Route::get('/user/{id}', function (Request $request, string $id) {
return 'User '.$id;
});
可选参数
有时您可能需要指定一个可能并不总是出现在 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']);
如果传入请求与路由模式约束不匹配,将返回 404 HTTP 响应。
全局约束
如果您希望路由参数始终受给定正则表达式的约束,您可以使用pattern
方法。您应该在boot
你的方法App\Providers\RouteServiceProvider
班级:
/**
* Define your route model bindings, pattern filters, etc.
*/
public function boot(): void
{
Route::pattern('id', '[0-9]+');
}
定义模式后,它会自动应用于使用该参数名称的所有路由:
Route::get('/user/{id}', function (string $id) {
// Only executed if {id} is numeric...
});
编码正斜杠
Laravel 路由组件允许除/
出现在路由参数值中。您必须明确允许/
成为你的占位符的一部分where
条件正则表达式:
Route::get('/search/{search}', function (string $search) {
return $search;
})->where('search', '.*');
Warning
编码的正斜杠仅在最后一个路由段中受支持。
命名路由
命名路由允许为特定路由方便地生成 URL 或重定向。您可以通过链接name
路由定义上的方法:
Route::get('/user/profile', function () {
// ...
})->name('profile');
您还可以为控制器操作指定路由名称:
Route::get(
'/user/profile',
[UserProfileController::class, 'show']
)->name('profile');
Warning
路由名称应该始终是唯一的。
生成命名路由的 URL
为给定路由分配名称后,您可以在生成 URL 或通过 Laravel 重定向时使用路由名称route
和redirect
辅助功能:
// Generating URLs...
$url = route('profile');
// Generating Redirects...
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
Note
有时,您可能希望为 URL 参数指定请求范围的默认值,例如当前语言环境。为此,您可以使用URL::defaults
方法.
检查当前路线
如果你想确定当前请求是否被路由到给定的命名路由,你可以使用named
Route 实例上的方法。例如,您可以从路由中间件检查当前路由名称:
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Handle an incoming request.
*
* @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
分派middleware 到一个组内的所有路线,你可以使用middleware
定义组之前的方法。中间件按照它们在数组中列出的顺序执行:
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second middleware...
});
Route::get('/user/profile', function () {
// Uses first & second middleware...
});
});
Controllers
如果一组路由都使用相同的controller, 你可以使用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) {
// ...
});
});
Warning
为了确保您的子域路由可达,您应该在注册根域路由之前先注册子域路由。这将防止根域路由覆盖具有相同 URI 路径的子域路由。
路由前缀
这prefix
方法可用于为组中的每个路由添加给定 URI 前缀。例如,您可能希望为组内的所有路由 URI 添加前缀admin
:
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// Matches The "/admin/users" URL
});
});
路由名称前缀
这name
方法可用于使用给定字符串为组中的每个路由名称添加前缀。例如,您可能希望在所有分组路由的名称前加上前缀admin
.给定的字符串完全按照指定的方式作为路由名称的前缀,因此我们一定会提供尾随.
前缀中的字符:
Route::name('admin.')->group(function () {
Route::get('/users', function () {
// Route assigned name "admin.users"...
})->name('users');
});
路由模型绑定
将模型 ID 注入路由或控制器操作时,您通常会查询数据库以检索与该 ID 对应的模型。 Laravel 路由模型绑定提供了一种方便的方法来自动将模型实例直接注入到你的路由中。例如,您可以注入整个用户 ID,而不是注入用户 IDUser
匹配给定 ID 的模型实例。
隐式绑定
Laravel 自动解析在路由或控制器操作中定义的 Eloquent 模型,其类型提示变量名称与路由段名称匹配。例如:
use App\Models\User;
Route::get('/users/{user}', function (User $user) {
return $user->email;
});
自从$user
变量被类型提示为App\Models\User
Eloquent模型和变量名匹配{user}
URI 段,Laravel 会自动注入 ID 与请求 URI 中对应值相匹配的模型实例。如果在数据库中未找到匹配的模型实例,将自动生成 404 HTTP 响应。
当然,当使用控制器方法时,隐式绑定也是可能的。再次注意{user}
URI段匹配$user
控制器中的变量包含一个App\Models\User
类型提示:
use App\Http\Controllers\UserController;
use App\Models\User;
// Route definition...
Route::get('/users/{user}', [UserController::class, 'show']);
// Controller method definition...
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();
自定义密钥
有时您可能希望使用除此之外的列来解析 Eloquent 模型id
.为此,您可以在路由参数定义中指定列:
use App\Models\Post;
Route::get('/posts/{post:slug}', function (Post $post) {
return $post;
});
如果您希望模型绑定始终使用数据库列而不是id
当检索给定的模型类时,您可以重写getRouteKeyName
Eloquent 模型上的方法:
/**
* Get the route key for the model.
*/
public function getRouteKeyName(): string
{
return 'slug';
}
自定义键和范围
当在单个路由定义中隐式绑定多个 Eloquent 模型时,您可能希望限定第二个 Eloquent 模型的范围,使其必须是前一个 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;
});
});
类似地,你可以通过调用withoutScopedBindings
方法:
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
})->withoutScopedBindings();
自定义缺失模型行为
通常,如果未找到隐式绑定模型,将生成 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 只会调用该路由。否则,将自动返回 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
为给定参数指定类的方法。您应该在boot
你的方法RouteServiceProvider
班级:
use App\Models\User;
use Illuminate\Support\Facades\Route;
/**
* Define your route model bindings, pattern filters, etc.
*/
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
模型,该类的一个实例将被注入到路由中。因此,例如,请求users/1
将注入User
来自数据库的实例,其 ID 为1
.
如果在数据库中未找到匹配的模型实例,将自动生成 404 HTTP 响应。
自定义解析逻辑
如果你想定义你自己的模型绑定解析逻辑,你可以使用Route::bind
方法。你传递给的闭包bind
方法将接收 URI 段的值,并应返回应注入路由的类的实例。同样,这种定制应该发生在boot
你的应用程序的方法RouteServiceProvider
:
use App\Models\User;
use Illuminate\Support\Facades\Route;
/**
* Define your route model bindings, pattern filters, etc.
*/
public function boot(): void
{
Route::bind('user', function (string $value) {
return User::where('name', $value)->firstOrFail();
});
// ...
}
或者,您可以覆盖resolveRouteBinding
Eloquent 模型上的方法。此方法将接收 URI 段的值,并应返回应注入路由的类的实例:
/**
* Retrieve the model for a bound value.
*
* @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
方法将用于解析父模型的子绑定:
/**
* Retrieve the child model for a bound value.
*
* @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”页面。但是,由于您通常会定义fallback
在你的路线routes/web.php
文件中的所有中间件web
中间件组将应用于路由。您可以根据需要向该路由自由添加额外的中间件:
Route::fallback(function () {
// ...
});
Warning
后备路由应始终是您的应用程序注册的最后一条路由。
速率限制
定义速率限制器
Laravel 包含强大且可自定义的速率限制服务,您可以使用这些服务来限制给定路由或一组路由的流量。首先,您应该定义满足应用程序需求的速率限制器配置。通常,这应该在configureRateLimiting
你的应用程序的方法App\Providers\RouteServiceProvider
类,它已经包含一个应用于应用程序中的路由的速率限制器定义routes/api.php
文件:
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
/**
* Configure the rate limiters for the application.
*/
protected function configureRateLimiting(): 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;
/**
* Configure the rate limiters for the application.
*/
protected function configureRateLimiting(): 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('Custom response...', 429, $headers);
});
});
由于速率限制器回调接收传入的 HTTP 请求实例,您可以根据传入请求或经过身份验证的用户动态构建适当的速率限制:
RateLimiter::for('uploads', function (Request $request) {
return $request->user()->vipCustomer()
? Limit::none()
: Limit::perMinute(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')),
];
});
将速率限制器附加到路由
速率限制器可以附加到路由或路由组使用throttle
middleware. throttle 中间件接受您希望分配给路由的速率限制器的名称:
Route::middleware(['throttle:uploads'])->group(function () {
Route::post('/audio', function () {
// ...
});
Route::post('/video', function () {
// ...
});
});
使用 Redis 节流
通常,throttle
中间件被映射到Illuminate\Routing\Middleware\ThrottleRequests
班级。此映射在您的应用程序的 HTTP 内核中定义(App\Http\Kernel
).但是,如果您使用 Redis 作为应用程序的缓存驱动程序,您可能希望更改此映射以使用Illuminate\Routing\Middleware\ThrottleRequestsWithRedis
班级。此类在使用 Redis 管理速率限制方面效率更高:
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
表单方法欺骗
不支持 HTML 表单PUT
,PATCH
, 或者DELETE
动作。所以,当定义PUT
,PATCH
, 或者DELETE
从 HTML 表单调用的路由,你需要添加一个隐藏的_method
字段到表单。发送的值_method
字段将用作 HTTP 请求方法:
<form action="/example" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
为了方便起见,您可以使用@method
刀片指令 生成_method
输入字段:
<form action="/example" method="POST">
@method('PUT')
@csrf
</form>
访问当前路由
您可以使用current
,currentRouteName
, 和currentRouteAction
上的方法Route
facade 以访问有关处理传入请求的路由的信息:
use Illuminate\Support\Facades\Route;
$route = Route::current(); // Illuminate\Routing\Route
$name = Route::currentRouteName(); // string
$action = Route::currentRouteAction(); // string
您可以参考 API 文档Route facade 的底层类 和路由实例 查看路由器和路由类上可用的所有方法。
跨源资源共享 (CORS)
Laravel 可以自动响应 CORSOPTIONS
具有您配置的值的 HTTP 请求。所有 CORS 设置都可以在您的应用程序中配置config/cors.php
配置文件。这OPTIONS
请求将自动由HandleCors
middleware 默认情况下包含在您的全局中间件堆栈中。您的全局中间件堆栈位于应用程序的 HTTP 内核中(App\Http\Kernel
).
Note
有关 CORS 和 CORS 标头的更多信息,请参阅关于 CORS 的 MDN 网络文档.
路由缓存
将应用程序部署到生产环境时,您应该利用 Laravel 的路由缓存。使用路由缓存将大大减少注册所有应用程序路由所需的时间。要生成路由缓存,请执行route:cache
工匠命令:
php artisan route:cache
运行此命令后,您的缓存路由文件将在每次请求时加载。请记住,如果您添加任何新路由,您将需要生成一个新的路由缓存。因此,您应该只运行route:cache
在项目部署期间执行命令。
您可以使用route:clear
命令清除路由缓存:
php artisan route:clear