laravel12基础-路由
laravel12基础-路由

路由的定义

什么是路由?路由就是提供接受 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::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();
}

By cxp

发表回复