一、什么是路由

路由就是给你一个url,给我找到对应的控制器的方法,运行相应的程序。

二、基础路由

基础路由

Route::get('foo', function () {
    return 'Hello World';
});

路由配置文件

http/routes.php

路由的请求类型

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

满足多种请求方式

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

在路由中传参

一个参数:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

多个参数:

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

可选参数和默认参数

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

使用正则对参数进行限制

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-z]+']);

全局限定。意思就是说这个规则会应用到所有指定的参数名中。

修改RouteServiceProvider:

public function boot(Router $router){
    $router->pattern('id', '[0-9]+');

    parent::boot($router);
}

三、路由命名

一般命名

Route::get('user/profile', ['as' => 'profile', function () {
    //
}]);

命名同时,指定控制器和action

Route::get('user/profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile'
]);

或者:

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

集体命名

Route::group(['as' => 'admin::'], function () {
    Route::get('dashboard', ['as' => 'dashboard', function () {
        // Route named "admin::dashboard"    
          }
     ]);
});

注意:这个集体路由的访问,比如dashboard的地址为:/dashboard而不是/admin/dashboard。只不过它的别名为:admin::dashboard。这个别名可以用来获取路由的地址,下面我们马上就会讲到。

路由地址获取和跳转

// Generating URLs...
$url = route('profile');
// Generating Redirects...
return redirect()->route('profile');

给命名路由传参

Route::get('user/{id}/profile', ['as' => 'profile', function ($id) {
   //}
]);
$url = route('profile', ['id' => 1]);

四、集体路由

集体路由主要用来分享一些属性,避免不必要的重复,比如:middleware,namespace。

中间件

Route::group(['middleware' => 'auth'], function () {
   Route::get('/', function ()    {
       // Uses Auth Middleware    
   });

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

指定命名空间

Route::group(['namespace' => 'Admin'], function(){
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
    Route::group(['namespace' => 'User'], function() {
        // Controllers Within The "App\Http\Controllers\Admin\User" Namespace    
    });
});

指定前缀

Route::group(['prefix' => 'admin'], function () {
   Route::get('users', function ()    {
       // Matches The "/admin/users" URL    
   });
});

还可以在前缀上传入参数

Route::group(['prefix' => 'accounts/{account_id}'], function () {
    Route::get('detail', function ($accountId)    {
        // Matches The "/accounts/{account_id}/detail" URL   
    });
});

五、CSRFtoken

csrftoken用来防止外站提交请求。

// Vanilla PHP<?php echo csrf_field(); ?>
// Blade Template Syntax{{ csrf_field() }}

上面这段代码,用来在模板中生成一个html的input。

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

有时候,我们有一些请求不需要验证csrf,我们可以把这些Url排除:

<?phpnamespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
    ];

x-csrf-token

ajax请求中携带token。

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

六、表单method‘造假'

一般form不支持put,delete,patch,那么我们可以通过这样的方式来实现这些请求。

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

要生成这个’造假‘input,也可以这样:

<?php echo method_field('PUT'); ?>

或者:

{{ method_field('PUT') }}

七、下节预告

数据库查询的三种方法:raw,查询构造,eloquent。