Laravel 简单入门,路由的使用(一)
一、安装 Laravel
Laravel 使用 Composer 来管理项目依赖。因此,在使用 Laravel 之前,请确保您的机器上已经安装了 Composer。
composer create-project --prefer-dist laravel/laravel blog
二、路由的定义
1、路由的定义文件在根目录 routes/web.php 中,可以采用了:
(1)::get()这个方法,它接受的就是 GET 提交
(2)::post()、::put()、::delete()是表单和 Ajax 的提交接受方式
(3)::any()表示不管你是哪种提交方式,我智能的全部接收响应
(4)::match()表示接收你指定的提交方式,用数组作为参数传递
//只能接受get请求 Route::get("index",function (){ return "Hello,Laravel!"; }); //只能接受get请求 Route::post("index",function (){ return "Hello,Laravel!"; }); //全部接收响应 Route::any("index",function (){ return "Hello,Laravel!"; }); //match()表示接收你指定的提交方式 Route::match(['get','post'],'index',function (){ return "Hello,Laravel!"; }); //http://la8.com/index
2、路由参数可分为必填参数和可选参数
//必填参数,http://la8.com/user/1 Route::get('user/{id}', function ($id) { return 'User '.$id; }); //多个参数,http://la8.com/posts/1/comments/2 Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { return 'posts:'.$postId.',comments:'.$commentId; }); //可选参数 Route::get('user/{name?}', function ($name = null) { return $name; });
3、正则表达式约束
你可以使用路由实例上的 where 方法约束路由参数的格式。where 方法接受参数名称和定义参数应如何约束的正则表达式:
Route::get('user/{id}/{name}', function ($id, $name) { return 'User '.$id.',name:'.$name; })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
如果想让约束 id 只能是 0-9 之间作用域全局范围,可以在模型绑定器里设置;模型绑定器路径为:app\Providers\RouteServiceProvider 的 boot()方法;
public function boot() { // Route::pattern('id', '[0-9]+'); parent::boot(); }
注:如果 id 已经被全局约束,在某个局部你想让它脱离约束,可以如下操作:...->where('id', '.*')
4.路由重定向
可以设置访问一个路由的 URI,跳转到另一个路由的 URI,在web.php具体如下:
Route::redirect('index', 'task');
5、路由命名
路由命名可以方便地为指定路由生成 URL 或者重定向。通过在路由定义上链式调用 name
方法可以指定路由名称
//通过设置路由来访问创建好的控制器,参数二:控制器@方法名 Route::get("task/url","TaskController@url")->name('task.url'); //http://la8.com/task/url
注意:路由命名必须是唯一的
6、路由分组和前缀
路由分组功能是为了让大量路由共享路由属性,包括中间件、命名空间等;
//route分组 Route::group(['prefix'=>'api'],function (){ Route::get("test2",function (){ return "index"; }); }); //route分组,推荐使用 Route::prefix('api')->group(function (){ Route::get("test2",function (){ return "index"; }); });
prefix
方法将会为路由组中的每一个 URI 添加前缀。例如,您可以给该组中所有的 URI 添加 admin
的前缀:
Route::prefix('admin')->group(function () { Route::get('users', function () { return "users"; }); }); //http://la8.com/admin/users Route::prefix('admin')->group(function () { Route::get('data1', 'DataController@index'); Route::get('data2', 'DataController@index2'); }); //http://la8.com/admin/data1 //http://la8.com/admin/data2
7、命名空间,控制器嵌套
在\app\Http\Controllers\Admin\ManageController.php控制器:
//控制器嵌套,命名空间的设置 Route::namespace('Admin')->group(function (){ Route::get("manage","ManageController@index"); }); //http://la8.com/manage
8、路由名称前缀
//方式一 Route::group(['as'=>'lhs.'], function () { Route::get('roc', function () { //route() 函数为指定的路由生成路由 URL。 return route('lhs.index');//输出:http://la8.com/roc })->name('index'); }); //方式二 Route::name('lhs.')->group(function () { Route::get('roc', function () { //route() 函数为指定的路由生成路由 URL。 return route('lhs.users');//输出:http://la8.com/roc })->name('users'); });
9、路由回退
如果我们跳转到了一个不存在路由时,会产生 404 错误,体验不佳;可以使用回退路由,让不存在的路由自动跳转到你指定的页面去;
Route::fallback(function (){ return redirect("/"); });
注:回退路由,注意要放在最底部
10、路由重定向
(1). 重定向使用助手函数 redirect()的 to()方法,注意需要 return 才能跳转;
return redirect()->to('/'); //跳到首页 return redirect()->to('task'); //跳转到 task return redirect()->to('task/url'); //跳转到 task/url
(2). 也可以直接使用快捷方式直接进行跳转;
return redirect('/'); //跳到首页 return redirect('task'); //跳转到 task return redirect('task/url'); //跳转到 task/url
(3). redirect()助手有一个对应的 facade 模式对象;
return Redirect::to('/'); //facade 模式,但需要 use 引入
(4). 使用 redirect()的 route()方法,可以跳转到指定的命名路由 URI;
return redirect()->route('task.index'); //注意和 route()方法区别
(5). 使用 redirect()的 back()方法,可以重定向到上一个页面中;
return redirect()->back(); return back(); //快捷方式
(6). 使用 redirect()的 action()方法,可以直接重定向到控制器方法;
return redirect()->action('TaskController@index'); //需注册路由 return redirect()->action('TaskController@index', ['id'=>10]);
(7). 使用 redirect()的 away()方法,跳转到外部链接;
return redirect()->away('http://www.baidu.com'); //不带任何编码
11、表单伪造和 CSRF 保护
HTML表单支持GET请求,但表单不支持 PUT, PATCH 或 DELETE 请求。
Route::get('task/form', 'TaskController@form'); Route::any('task/getform', function () { return \Illuminate\Support\Facades\Request::method(); });
<form action="/task/getform" method="post"> <button type="submit">提交</button> </form>
表单页以 post 发送,路由也使用 post 接受,以下表单提交会出现 419 错误;
这是为了避免被跨站请求伪造攻击,框架提供了 CSRF 令牌保护,请求时验证;
<input type="hidden" name="_token" value="{{csrf_token()}}">
HTML 表单调用请求方式为 PUT
, PATCH
或 DELET
的路由时,您需要在表单中添加一个 _method
的隐藏域。_method
的值将会作为 HTTP 请求的方法:
<form action="/task/getform" method="post"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_token" value="{{csrf_token()}}"> <button type="submit">提交</button> </form>
对于 CSRF 令牌保护和表单伪造提交方式,也支持快捷方式的声明,如下:
@csrf
@method('PUT')
laravel官网:https://learnku.com/docs/laravel/8.x/installation/9354