一、安装 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