Idle Works, Idle Thoughts

Laravel学习笔记

路由

路由的作用是匹配HTTP请求,根据URL指派处理函数。在app/Http/routes.php中定义路由。

一、基础路由:

Route::get('/', function() {});
Route::post('/user/create', function() {});

二、为多种请求注册路由:

Route::match(['get', 'post'], '/user/create', function() {});    

三、注册响应所有HTTP的路由:

Route::any('/user/create', function() {});    

路由参数

一、基础用法:

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

二、参数检查

只有满足where()中定义参数的请求,才会传达到function()中处理:

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

可以定义全局的参数检查,例如所有id都限制为数字,在RouteServiceProviderboot方法里定义模式:

$router->pattern('id', '[0-9]+');

路由群组

路由群组可以将路由的公共需求抽象为共享属性,包括Middleware, namespaces, 子域名路由,路由前缀等。

路由前缀:

Route::group(['prefix' => 'admin'], function(){
    // 匹配 'admin/super' URL
    Route::get('super', function(){
    });
});

注册URL参数到路由前缀:

Route::group(['prefix' => 'order/{order_id}'], function(){
    Route::get('detail', function($order_id){
    });
});

为参数设定限制:

Route::group([
    'prefix' => 'order/{order_id}',
    'where' => ['order_id' => '[0-9]+'],
    ], function(){
            Route::get('detail', function($order_id){
        });
});

CSRF保护

CSRF - 跨网站请求伪造。

为了防止应用程序受到CSRF攻击,Laravel在每位用户的session中放置随机token,这个token用来验证用户身份。

一、插入CSRF Token到表单

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>" >

或者在Blade模板引擎中使用:

<input type="hidden" name="_token" value=" >" >

我们无需手工验证token,VerifyCsrfToken HTTP中间件会自动验证。

二、X-CSRF-TOKEN 请求头

把Token放在meta标签中,并将其加入到所有请求头中,如:

<meta name="csrf-token" content="" />

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

这样每次发起Ajax请求就会自动加入CSRF Token。

中间件

中间件的作用是过滤HTTP请求,常见的中间件:

所有的中间件都位于app/Http/Middleware

一、建立中间件

make:middleware命令创建中间件:

php artisan make:middleware OrderStatusMiddleware

这个命令将在app/Http/Middleware目录中建立一个叫做OrderStatusMiddleware的类。功能:如果已付款,就跳转到订单明细页面(不能编辑)。

<?php

namespaces App\Http\Middleware;

use Closure;

class OrderStatusMiddleware {
    public function handle($request, Closure $next){
        if($request->input('status') > 500) {   // 500表示已付款
            return direct('details');
        }
        return next($request);
    }
}

?>

二、注册中间件

如果是全局中间件(例如记录每个请求),只需将中间件的类加入到app/Http/Kernel.php$middleware属性中。

如果是要指派给路由,只需将中间件的类加入到app/Http/Kernel.php$routeMiddleware属性中。

Route::get('/user/orderlist/', ['middleware' => 'auth', function() {}]);

控制器

除了在routes.php中为每个路由定义处理逻辑函数外,可以把HTTP的处理逻辑组成一个类,即控制器,并存放在app/Http/Controllers中。

<?php 

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class UserController extends Controller {
    public function showProfile($id) {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}
?>

然后将这个控制器传递到路由中,格式为类名@函数名

Route::get('user/{id}', 'UserController@showProfile');    

传递中间件和控制器到路由中:

Route::get('profile', [
    'middleware' => 'auth',
    'user' => 'UserController@showProfile'
]);