## Laravel学习笔记汇总——路由管理
// 在routes/web.php中,定义网站访问路由。
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
// 可用的Route方法有:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
// 为一个路由注册多个方法:
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('/', function () {
//
});
// 重定向路由
Route::redirect('/here', '/there');
// 重定向路由并自定义返回的状态码,默认是302
Route::redirect('/here', '/there', 301);
// 如果路由仅需要返回一个视图:
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']); # 传递数据
// 将路由中的参数传入回调函数:
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
// 如果回调函数中有其他参数,则路由参数放在这些参数后面。
use Illuminate\Http\Request;
Route::get('/user/{id}', function (Request $request, $id) {
return 'User '.$id;
});
// 如果路由参数为可选,则需要在路由中参数名后另上?,回调函数中添加默认值
Route::get('/user/{name?}', function ($name = null) {
return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
return $name;
});
// 为路由参数设置正则表达式限制
Route::get('/user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
// 一些常用的正则表达式限制,可以使用辅助函数
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->whereNumber('id')->whereAlpha('name');
Route::get('/user/{name}', function ($name) {
//
})->whereAlphaNumeric('name');
Route::get('/user/{id}', function ($id) {
//
})->whereUuid('id');
// 全局的参数限制,需要在App\Providers\RouteServiceProvider中的boot里设置
public function boot()
{
Route::pattern('id', '[0-9]+');
}
// 有了上面这个设置后,路由中就不用为每一个id设置限制了
Route::get('/user/{id}', function ($id) {
// Only executed if {id} is numeric...
});
// 给路由取一个独特的名字
Route::get('/user/profile', function () {
//
})->name('profile');
Route::get(
'/user/profile',
[UserProfileController::class, 'show']
)->name('profile');
// 从名字得到路由URL
$url = route('profile');
// 使用名字生成重定向
return redirect()->route('profile');
// 带参数的路由取名后,生成URL时通过第二个参数提供数据
Route::get('/user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1]);
// 这时如果提供的参数多于路由中所需的参数,多出的将成为query string,如:
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
// /user/1/profile?photos=yes
// 使用路由分组,添加中间件
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second middleware...
});
Route::get('/user/profile', function () {
// Uses first & second middleware...
});
});
// 使用路由分组,添加子域名
Route::domain('{account}.example.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
// 使用路由分组,添加路由前缀
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// Matches The "/admin/users" URL
});
});
// 使用路由分组,添加命名前缀
Route::name('admin.')->group(function () {
Route::get('/users', function () {
// Route assigned name "admin.users"...
})->name('users');
});
// 路由与模型绑定,路由中user为id参数,回调函数中直接使用id与user匹配的模型实例$user
use App\Models\User;
Route::get('/users/{user}', function (User $user) {
return $user->email;
});
// 也可以这样使用,使用Controller作为中介
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]);
}
// 如果在匹配时匹配的字段不是id,可以这样指定,如使用post的slug字段。
// 那当然也可以直接修改Eloquent模型,让getRouteKeyName函数返回需要的字段。
use App\Models\Post;
Route::get('/posts/{post:slug}', function (Post $post) {
return $post;
});
// 上面所有路由都不能匹配的请求,可以使用下面的路由(所以在web.php文件中放到最后)
Route::fallback(function () {
echo "非法访问";
});
// 获取当前请求的Route信息
use Illuminate\Support\Facades\Route;
$route = Route::current(); // Illuminate\Routing\Route
$name = Route::currentRouteName(); // string
$action = Route::currentRouteAction(); // string
// 在项目部署时,可以使用下面的命令缓存路由
php artisan route:cache
// 下面的命令可以清除所有路由缓存
php artisan route:clear