Laravel5.3使用学习笔记---路由

使用了laravel一段时间了,今天就开始对Laravel进行一个比较全面的学习吧。打开5.1的chm中文版,那就按照目录开始看路由吧,不过看了一遍后发现,文档似乎漏了很多东西,于是跑到官网再看一遍英文原版,网址如下:
Laravel5.3官网手册路由部分: https://laravel.com/docs/5.3/routing


一. 路由的基本使用

一般我们写php代码,最基本的是要实现,URI->路由->控制器<->数据模型(model)
(1)首先在route.php文件(当然也可以在其他自定义路径文件)里,如下添加一个路由:

Route::get('test', function () {
    return "test route";
});

(2)如果要将路由引导到控制器的话,就要这么写:

Route::get('test', 'TestController@test');

当然,你得先定义一个名为“TestController”的控制器,然后里面有成员方法“test”

好了,这就是一个基本的访问就完成了(控制器访问model这一步后面再说,这里省略),当在浏览器里输入:

http://Host/test

就可以访问到TestController->test()了;

当然,Laravel提供的基本路由方法还有很多,如:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

一开始经验浅的我,也不知道put等方法有什么用,只是在看http1.1协议时有印象,现在再次查了资料后,总结如下,http1.1除了支持get/post外,还支持共8种访问方法:

HttpV1.1 8种访问方法
1.  Get方法:常用的方法,略;
2.  Post方法:常用的方法,略;
3.  Head方法:与get方法类似,主要是为了获取某个访问的头部信息,服务器不返回请求内容;
4.  PUT方法:请求往服务器上存文件;
5.  DELETE方法:请求删除服务器上的文件;
6.  TRACE方法:就是获取服务器收到的来自客户端的请求信息(收发调试),一般用于调试服务器;
7.  Connect方法:把服务器作为跳板,让服务器代替用户去访问其它网页,之后把数据原原本本的返回给用户;
8.  Options方法:获取服务器URI所支持的方法,或用于检查服务器的性能,ajax进行跨域访问时,先发送options方法来判断请求是否安全;

为了使用方便,laravel还允许一个路由使用多种访问方法,使用方法如下:

Route::match(['get', 'post'], 'test', function () {});

Route::any('test', function () {});

当然laravel也可以为路由添加条件验证, 如规定url必须带参数,如:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {});

或者所带参数可以缺省,如:

Route::get('user/{id?}', function ($id="123"){});

或者所带参数满足正则表达式,如:

Route::get('user/{name}', function ($id){})->where(["name"=>"[A-Z]+"]);

或者希望所有路由中的某参数必须满足某个条件,可以在RouteServiceProvider的boot方法中添加:

public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

为了代码简洁,laravel还允许为路由定义别名:

Route::get('user/profile', 'UserController@showProfile')->name('profile');

使用时:

$url = route('profile');
$url = route('profile', ['id' => 1]);
return redirect()->route('profile');

二. 路由的群组使用

为了更好的管理路由,laravel允许使用群组的概念来描述一组路由,如:

Route::group([
    'middleware' => 'auth', //使用中间件
    'namespace' => 'Admin', //定义命名空间
    'domain' => '{account}.myapp.com', //用于获取子域名
    'prefix' => 'admin', //用于为路由前缀
    'as' => 'admin::', //定义群组别名,代码调用时可使用的前缀
], 
function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});

二. 路由模型绑定

路由模型绑定是为了跨越控制层,直接通过路由来获取model的数据的,用法上又分为显式路由绑定和隐式路由绑定。

显式路由绑定如下:

Route::model('user', App\User::class);
Route::get('profile/{user}', function (App\User $user) {});

隐式路由绑定如下:

Route::get('api/users/{user}', function (App\User $user){}); //区别是不用定义显式绑定model

当然,也可以用自定义方法来处理参数与model之间的关系,如:

Route::bind('user', function ($value) {
        return App\User::where('name', $value)->first();
});

三. CSRF安全

使用post,put,delete方法提交的html表单,都应该在表单里插入csrf令牌,不然就被拒绝,使用也就是两种形式,文档见:https://laravel.com/docs/5.3/csrf

在表单里将csrf-token作为键值:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

或者在header的meta里添加csrf-token:

<meta name="csrf-token" content="{{ csrf_token() }}">
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

四. 解决Laravel的PUT,PATCH or DELETE等路由访问和HTML不支持上述方法的矛盾:

方法如下,在表单里添加_method字段,如:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

更简便的是,直接使用框架自带的方法:

{{ method_field('PUT') }}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值