Route

中间件排除csrf验证路由
class VerifyCsrfToken extends BaseVerifier
{
    protected $except = [
        'api/*',
    ];
}

#控制器默认路径App\Http\Controllers, 在App\Providers\RouteServicePrvider.php中设置

请求方法伪造

伪造DELETE方法
<form action='task/1', method='POST'>
    <input type="hidden" name="_method" value="DLEETE">
</form>

CSRF保护:
对只读请求GET,HEAD,OPTIONS, 不会有CSRF问题,
对写请求PUT,PATCH,DELETE,加入隐含字段_token 
    <input type="hidden" name="_token" value="' . csrf_token() .">

如果在javascript中执行请求,需要加下面代码:
<meta name="csrt--token" content="<?php echo csrf_token(); ?>" id="csrf_token()">
js将token加到全局请求头
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content')
    }
});

在VUE中(laravel自带assets/js/bootstrap.js已经实现):
Vue.http.interceptors.push((request,next)=> {
    request.headers['X-CSRF-TOKEN'] = document.querySelector('#csrf-token').getAttribute('content');
    next();
});

laravel对具体的路由不采用csrfToken验证
修改app\Http\Middleware\VerifyCsrfToken.php
protected $except = [
        'article/zan'

Route::get('user/{id?}'; function ($id=1) {
    return 'user ID:' . $id;
})->name('user.profile');

模板引用:
<a href="{{ route('user.profile', ['id'=>100]) }}" />
或者
<a href="{{ route('user.profile', [100]) }}" />

class HomeController::Controller {
    public function show($id) {
        reutrn 'post' . $id . ' link:' . route('post.show', [$id]);
    }
}

Route::get('user/{id}/{slug}, function($id, $slug) {
    return "user ID: " . $id;
})->where(['id' => '[0-9]+', 'slug' => '[a-zA-Z]+')
->name('user.content');

<a href="{{ route('user.content',['id'=>100, 'slug'=>'article_title']) }} ">
<a href=" url('/') ">

Route::middleware('auth')->prefix('api')->group(function() {
    Route::get('post', function() { return view('post'); });
    Route::get('user', function() { return view('user'); });
});
<a href=" url('/api/post') ">

#路由子域名为:http://survey/hkcd.com/
Route::domain('suvery.hkcd.com')->group(function() {
    Route::get('/', 'IndexController@index');
});

#控制器默认路径App\Http\Controllers, 在App\Providers\RouteServicePrvider.php中设置
#下面控制器路径为App\Http\Controllers\Admin
Route::namespace('Admin')->group(function(){
    Route::get('/admin', 'AdminController@index');
});

use Zhiyi\Plus\API2\Controllers as NewAPI2;
Route::get('statistics', NewAPI2\Statistics::class . '@index');


隐匿绑定:
路由定义中affair与控制器依赖注入
$affairs->post('/{affair}/sort', AffairController::class . '@setSort');
        
affair与控制器参数对应,用$gov_affair将不能解析
public function setSort(SortFeed $request, FeedModel $affair) 
{
    $affair->save();
}

显示绑定:
#App\Providers\RouteProvider
public function boot() {
    Route::model('task_model', Task::class);
    parent::boot();
}
Route::get('task/model/{task_model}', function(\App\Models\Task $task) {
    dd($task);
});

兜底路由:
Route::fallback(function(){
    return '404 no page found!';
});

频率限制:
Route::middleware('throttle:60,1')->group(function() {
    Route::get('/user', function(){ });
});

HTTP 请求方式概述

在 HTTP/1.1: Method Definitions 中查看 HTTP/1.1 协议支持的所有请求方式,不同的请求方式用于不同类型的请求:
curl -I HEAD https://laravelacademy.org
curl -I -X OPTIONS https://laravelacademy.org
OPTIONS 允许客户端查看服务器的性能。这个方法会请求服务器返回该资源所支持的所有 HTTP 请求方法,该方法会用'*'来代替资源名称,向服务器发送 OPTIONS 请求,可以测试服务器功能是否正常。JavaScript 的 XMLHttpRequest 对象进行 CORS 跨域资源共享时,就是使用 OPTIONS 方法发送嗅探请求,以判断是否有对指定资源的访问权限。
GET 请求指定的页面信息,并返回响应实体。一般来说 GET 方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。
HEAD 与GET方法一样,都是向服务器发出指定资源的请求,但是服务器在响应 HEAD 请求时不会回传资源的内容部分(即响应实体),这样我们在不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。
POST 向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据包含在请求体中。POST 方法是非幂等的方法,因为这个请求可能会创建新的资源或修改现有资源。
PUT 向指定资源位置上传其最新内容,PUT 方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容,常用于修改指定资源。
DELETE 请求服务器删除所请求 URI 所标识的资源。DELETE 请求后指定资源会被删除,DELETE 方法也是幂等的。
TRACE 请求服务器回显其收到的请求信息,该方法主要用于 HTTP 请求的测试或诊断。
CONNECT 该方法是 HTTP/1.1 协议预留的,能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接与非加密的 HTTP 代理服务器的通信。
PATCH 出现的较晚,它在 2010 年的 RFC 5789 标准中被定义。PATCH 请求与 PUT 请求类似,同样用于资源的更新。二者有以下两点不同:1、PATCH 一般用于资源的部分更新,而 PUT 一般用于资源的整体更新;2、当资源不存在时,PATCH 会创建一个新的资源,而 PUT 只会对已在资源进行更新。