路由


基本路由

最基本的 Laravel 路由接受一个 URI 和一个闭包,提供了一种非常简单和表达力强的方法来定义路由和行为,而不需要复杂的路由配置文件:

use Illuminate\Support\Facades\Route;
 
Route::get('/greeting', function () {
    return 'Hello World';
});

默认的路由文件

所有的 Laravel 路由都定义在您的路由文件中,这些文件位于 routes 目录中。这些文件会被您的应用的 App\Providers\RouteServiceProvider 自动加载。 routes/web.php 文件定义了您的网页界面的路由。这些路由被分配了 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 方法注册响应所有 HTTP 动词的路由:

Route::match(['get', 'post'], '/', function () {
    // ...
});
 
Route::any('/', function () {
    // ...
});

在定义多个共享相同 URI 的路由时,使用 getpostputpatchdeleteoptions 方法的路由应该在使用 anymatchredirect 方法的路由之前定义。这可以确保传入请求与正确的路由匹配。

依赖注入

您可以在路由的回调函数签名中注入所需的依赖项。声明的依赖关系将由 Laravel 服务容器自动解析和注入到回调函数中。例如,您可以在路由回调中使用类型提示 Illuminate\Http\Request 类来自动注入当前的 HTTP 请求:

use Illuminate\Http\Request;
 
Route::get('/users', function (Request $request) {
    // ...
});

CSRF 保护

请记住,任何 HTML 表单,如果它指向 web 路由文件中定义的 POSTPUTPATCHDELETE 路由,则应包括 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');

当在重定向路由中使用路由参数时,以下参数由 Laravel 保留,不能使用:destinationstatus

视图路由

View Routes 是一种简单的路由,它可以直接返回一个视图而不需要使用控制器。你可以使用 Route::view 方法来定义 View Route。该方法接受一个 URI 和一个视图名称作为参数。同时,你可以提供一个可选的数组参数,该数组中包含传递给视图的数据。

下面是使用 Route::view 方法来定义 View Route 的示例:

Route::view('/welcome', 'welcome');

Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

在 View Route 中使用路由参数时,不能使用以下参数名称:viewdatastatusheaders

路由列表

route:list是Artisan命令之一,可以轻松查看应用程序中定义的所有路由:

php artisan route:list

默认情况下,route:list命令不会显示分配给每个路由的路由中间件; 但是,您可以通过向命令添加-v选项来指示Laravel显示路由中间件:

php artisan route:list -v

您还可以指示Laravel仅显示以给定URI开头的路由:

php artisan route:list --path=api

此外,您还可以通过在执行route:list命令时提供--except-vendor选项来隐藏由第三方包定义的任何路由:

php artisan route:list --except-vendor

同样,您还可以通过在执行route:list命令时提供--only-vendor选项来仅显示由第三方包定义的路由:

php artisan route:list --only-vendor

路由参数 有时您需要在路由中捕获 URI 的某些部分。例如,您可能需要从 URL 中捕获用户的 ID。您可以通过定义路由参数来实现:

phpCopy codeRoute::get('/user/{id}', function (string $id) {
    return 'User '.$id;
});

您可以根据需要定义尽可能多的路由参数:

phpCopy codeRoute::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
    // ...
});

路由参数

必选参数

有时您需要在路由中捕获 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 参数的后面:

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方法。你应该在 App\Providers\RouteServiceProvider 类的 boot 方法中定义这些模式:

/**
 * 定义路由模型绑定、模式过滤器等。
 */
public function boot(): void
{
    Route::pattern('id', '[0-9]+');
}

一旦定义了模式,它会自动应用于使用该参数名称的所有路由:

Route::get('/user/{id}', function (string $id) {
    // 只有当 {id} 是数字时才会执行...
});

编码的正斜杠

Laravel 路由组件允许在路由参数值中出现除 / 之外的所有字符。您必须使用一个 where 条件的正则表达式显式地允许 / 成为占位符的一部分:

Route::get('/search/{search}', function (string $search) {
    return $search;
})->where('search', '.*');

编码的正斜杠仅受支持于最后一个路由段。

命名路由

命名路由允许为特定路由方便地生成 URL 或重定向。您可以通过将name方法链接到路由定义来指定路由名称:

Route::get('/user/profile', function () {
    // ...
})->name('profile');

您也可以为控制器操作指定路由名称:

Route::get(
    '/user/profile',
    [UserProfileController::class, 'show']
)->name('profile');

路由名称应始终唯一。

生成命名路由的 URL

一旦你为某个路由指定了名称,你可以在生成 URL 或重定向时使用 Laravel 的 routeredirect 帮助函数来使用该名称:

// 生成 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 参数指定请求范围的默认值,例如当前语言环境。为了实现这个功能,你可以使用 URL::defaults 方法

检查当前路由

如果您想确定当前请求是否路由到给定的命名路由,可以在 Route 实例上使用 named 方法。例如,您可以从路由中间件检查当前路由名称:

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

路由组

路由组允许您在大量路由之间共享路由属性,例如中间件,而无需在每个单独路由上定义这些属性。

嵌套的路由组会智能地“合并”属性和其父组。中间件和条件是合并的,而名称和前缀是追加的。名称空间分隔符和 URI 前缀中的斜线会自动添加到适当的位置。

中间件

你可以使用 middleware 方法来将中间件指派给一个路由组内的所有路由,其语法为:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second middleware...
    });
 
    Route::get('/user/profile', function () {
        // Uses first & second middleware...
    });
});

控制器

如果一个路由组内的所有路由都使用同一个控制器,你可以使用 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 路径的子域名路由。

路由前缀

prefix 方法可用于在组中的每个路由前添加给定的 URI 前缀。例如,您可能希望将组内的所有路由 URI 前缀都添加 admin

Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
        // 匹配 "/admin/users" URL
    });
});

路由名称前缀

name 方法可用于在组中的每个路由名称前添加给定的字符串前缀。例如,您可能希望将组中所有路由的名称都添加 admin 前缀。该给定的字符串将确切地添加到路由名称前缀,因此我们要确保在前缀中提供尾随的 . 字符:

Route::name('admin.')->group(function () {
    Route::get('/users', function () {
        // 路由名称为 "admin.users"...
    })->name('users');
});

路由模型绑定

当将模型 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} URI 段匹配,因此 Laravel 将自动注入具有与请求 URI 对应值匹配的 ID 的模型实例。如果在数据库中找不到匹配的模型实例,则将自动生成一个 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();

自定义键名

有时,您可能希望使用与 id 不同的列解析 Eloquent 模型。为此,您可以在路由参数定义中指定该列:

use App\Models\Post;
 
Route::get('/posts/{post:slug}', function (Post $post) {
    return $post;
});

如果您希望模型绑定始终使用数据库中的某个列而非 id 来检索给定的模型类,可以在 Eloquent 模型上覆盖 getRouteKeyName 方法:

/**
 * Get the route key for the model.
 */
public function getRouteKeyName(): string
{
    return 'slug';
}

自定义键和作用域

当你在路由中隐式地绑定多个 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 方法来明确指示 Laravel 不使用作用域绑定:

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 引入了对枚举的支持。为了补充这个特性,Laravel 允许你在路由定义中使用字符串支持的枚举进行类型提示,当且仅当路由段与有效的枚举值相对应时,Laravel 才会调用该路由。否则,Laravel 将自动返回一个 404 HTTP 响应。例如,给定以下枚举:

<?php

namespace App\Enums;

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

你可以定义一个路由,当 {category} 路由段是 fruitspeople 时才会被调用。否则,Laravel 会返回一个 404 HTTP 响应:

use App\Enums\Category;
use Illuminate\Support\Facades\Route;

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

显式绑定

您不一定需要使用 Laravel 的隐式、基于约定的模型解析,也可以明确定义路由参数与模型之间的对应关系。您可以使用路由器的 model 方法指定给定参数的类。您应该在 RouteServiceProvider 类的 boot 方法开头定义明确的模型绑定:

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 模型,因此将注入数据库中具有 ID 1 的 User 实例。

如果在数据库中找不到匹配的模型实例,则会自动生成 404 HTTP 响应。

自定义解析逻辑

如果您希望定义自己的模型绑定解析逻辑,可以使用 Route::bind 方法。您传递给 bind 方法的闭包将接收 URI 段的值,并应该返回注入到路由中的类的实例。同样,这种定制应该在应用程序的 RouteServiceProviderboot 方法中完成:

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();
    });
 
    // ...
}

或者,您可以覆盖您的 Eloquent 模型上的 resolveRouteBinding 方法。该方法将接收 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”页面。但是,由于您通常将回退路由定义在 routes/web.php 文件中,因此 web 中间件组中的所有中间件都将应用于该路由。您可以根据需要向此路由添加其他中间件:

Route::fallback(function () {
    // ...
});

回退路由应始终是应用程序注册的最后一个路由。

速率限制

定义限流器

Laravel 包含了强大且可定制的限流服务,您可以使用它来限制特定路由或一组路由的流量量。要开始使用,您应该定义满足您应用程序需求的限流器配置。通常,这应该在您应用程序的 App\Providers\RouteServiceProvider 类的 configureRateLimiting 方法中完成,该类已经包括应用于您的应用程序 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 会自动返回 HTTP 状态码为 429 的响应。如果您想定义自己的响应,可以使用 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 次,对于未登录用户,每分钟限制对该路由的访问 10 次每个 IP 地址:

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 中间件将速率限制器附加到路由或路由组。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 表单不支持 PUTPATCHDELETE 动作。因此,当定义要从 HTML 表单调用的 PUTPATCHDELETE 路由时,您需要在表单中添加一个名为 _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 Blade指令生成 _method 输入字段:

<form action="/example" method="POST">
    @method('PUT')
    @csrf
</form>

访问当前路由

使用 Route 门面上的currentcurrentRouteNamecurrentRouteAction 方法可以访问有关处理传入请求的路由的信息:

use Illuminate\Support\Facades\Route;
 
$route = Route::current(); // Illuminate\Routing\Route
$name = Route::currentRouteName(); // string
$action = Route::currentRouteAction(); // string

您可以参考路由器路由类上可用的所有方法的API文档来了解有关这些类的详细信息。

跨源资源共享(CORS)

Laravel 可以自动响应 CORS OPTIONS HTTP 请求,并使用您配置的值。所有 CORS 设置都可以在应用程序的 config/cors.php 配置文件中进行配置。OPTIONS 请求将自动由 HandleCors 中间件处理,该中间件默认包含在全局中间件堆栈中。您的全局中间件堆栈位于应用程序的 HTTP 内核(App\Http\Kernel)中。

有关 CORS 和 CORS 标头的更多信息,请参阅 MDN Web 关于 CORS 的文档

路由缓存

在部署应用程序到生产环境时,应该利用 Laravel 的路由缓存。使用路由缓存将大大减少注册所有应用程序路由所需的时间。要生成路由缓存,请执行 route:cache Artisan命令:

php artisan route:cache

运行此命令后,您的缓存路由文件将在每个请求上加载。请记住,如果添加任何新路由,则需要生成新的路由缓存。因此,应该仅在项目部署期间运行 route:cache 命令。

您可以使用 route:clear 命令清除路由缓存:

php artisan route:clear

点赞 取消点赞 收藏 取消收藏

<< 上一篇: 门面(Facade)

>> 下一篇: 中间件