路由的定义
什么是路由?路由就是提供接受 HTTP 请求的路径,并和程序交互的功能。简单点理解,就是为了提供访问程序的 URL地址,所做的一些设置工作
路由文件位置
项目根目录下的routes目录下的web.php
基础路由
Route::get('hello',function (){
return 'hello laravel 12';
});
我们采用了::get()这个方法,它接受的就是 GET 提交。除此之外我们还有::post()、::put()、::delete()是表单和 Ajax 的提交接受方式。::any()表示不管你是哪种提交方式,我智能的全部接收响应。::match()表示接收你指定的提交方式例如用数组作为参数传递例如:
Route::match(['get','post'],'index',function(){
return 'Hello, World!';
});
路由参数
必须参数
Route::get('/id/{id}/name/{name}',function ($id,$name){
return "id=$id,name=$name";
});
可选参数
Route::get('/name/{name?}',function ($name = null){
return "name=$name";
});
约束参数
Route::get('num/{num}/name/{name}',function ($num,$name){
return "num=$num,name=$name";
})->where('num','[0-9]+')
->where('name','[A-Za-z]+');
也可以用数组形式进行约束
Route::get('num/{num}/name/{name}',function ($num,$name){
return "num=$num,name=$name";
})->where(['num'=>'[0-9]+','name'=>'[A-Za-z]+']);
全局约束
如果你希望路由参数始终受给定正则表达式的约束,则可以使用 pattern 方法。你应该在应用程序的 App\Providers\AppServiceProvider 类的 boot 方法中定义这些模式:
public function boot(): void
{
//
Route::pattern('id', '[0-9]+');
}
局部解除全局约束
Route::get('/id/{id}/name/{name}',function ($id,$name){
return "id=$id,name=$name";
})->where('id','.*');
路由访问控制器
记得use进来,要不然会报错,然后因为有use所以分组中命名空间的那个写法已经废弃
use App\Http\Controllers\TestController;
Route::get('test',[TestController::class,'test']);
路由重定向
//默认不写第三个参数是302重定向
Route::redirect('/','hello');
//第三个参数是状态码
Route::redirect('/num','hello',301);
//这个默认是301
Route::permanentRedirect('/aa','test');
视图路由
//不带参数直接返回视图
Route::view('/welcome', 'welcome');
//单参数返回视图
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
//通过助手函数返回视图
Route::get('/', function () {
return view('welcome');
});
路由命名
命名路由允许为特定路由方便地生成 URL 或重定向。通过将 name
方法链接到路由定义上指定路由的名称:
Route::get('/user/profile', function () {
// ...
})->name('profile');
Route::get(
'/user/profile',
[UserProfileController::class, 'show']
)->name('profile');
name方法就是为路由命名的,但是名字是唯一的不能重复。通过name的命名方便重定向或者生成url
// 生成URL...
$url = route('profile');
// 生成重定向...
return redirect()->route('profile');
return to_route('profile');
路由分组
路由前缀
prefix
方法可用于为组中的每个路由添加给定 URI 的前缀。例如,你可能希望为组内的所有路由 URI 添加 admin 前缀:
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// 匹配 "/admin/users" URL
});
});
路由分组中间件
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// 使用第一个和第二个中间件...
});
Route::get('/user', function () {
// 使用第一个和第二个中间件...
});
});
路由分组控制器
Route::controller(TestController::class)->group(function (){
Route::get('/test','index');
Route::get('/test/user','user');
});
路由分组子域名
Route::domain('admin.laravel.com')->group(function (){
Route::get('user',function (){
return "admin.laravel.com/user";
});
Route::get('goods',function (){
return "admin.laravel.com/goods";
});
});
路由分组名称前缀
Route::name('test.')->group(function (){
Route::get("user",[TestController::class,'user'])->name('user');
Route::get("test",[TestController::class,'index'])->name('index');
});
空的分组路由
Route::group([],function (){
Route::get('test',[TestController::class,'test']);
Route::get('hello',function (){
return 'hello laravel 12';
});
});
这里的第一个参数是数组,里面可以放前缀prefix、子域名doman、中间件middleware、路由命名名称前缀as(name参数得用as)等其他参数例如:
Route::group(['prefix'=>'api','domain'=>'admin.laravel.com','middleware'=>'first',as=>'test.'],function (){
Route::get('test',[TestController::class,'test'])->name('test');
Route::get('hello',function (){
return 'hello laravel 12';
})->name('hello');
});
注意一下,这里数组形式的路由命名参数name不适用,需要用as代替那么。或者可以在内部再嵌套一个Route::name,例如
Route::group(['prefix'=>'api','domain'=>'admin.laravel.com'],function (){
Route::name("test.")->group(function (){
Route::get("user",[TestController::class,'user'])->name('user');
Route::get("test",[TestController::class,'index'])->name('index');
});
});
备用路由-回退路由-默认路由
当请求没有设置的路由的时候会调用该路由。注意:这个回退路由必须放在所有路由的下面.这个是官方文档里说的,但是实际测试中放回退路由后面的依旧能正常
Route::fallback(function () {
return "默认的404";
});
路由信息
使用Route::current()可以获取路由全部信息
Route::get("current",function (){
dump(Route::current());
});

获取路由名称
使用Route::currentRouteName()来获取路由名称
Route::get("currentRouteName",function (){
return Route::currentRouteName();
})->name('test.name');
获取控制器方法名称
使用Route::currentRouteAction()获取控制器和方法名称
//路由文件中
Route::get('getAction',[UserController::class,'getAction']);
//控制器中
public function getAction(){
return Route::currentRouteAction();
}