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

posted @ 2021-01-03 12:41  不睡  阅读(1660)  评论(0编辑  收藏  举报