【笔记】控制器中间件 和 RESTful 资源控制器

控制器中间件

可将 中间件 指定给控制器路由,例如:

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

不过,在控制器构造器中指定中间件会更为灵活。在控制器构造器中使用 middleware 方法,你可以很容易地将中间件指定给控制器。你甚至可以对中间件作出限制,仅将它提供给控制器类中的某些方法。

class UserController extends Controller
{
    /**
     * 添加一个 UserController 实例。
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log', ['only' => ['fooAction', 'barAction']]);

        $this->middleware('subscribed', ['except' => ['fooAction', 'barAction']]);
    }
}

RESTful 资源控制器

资源控制器让你可以轻松地创建与资源相关的 RESTful 控制器。例如,你可能想要创建一个用来处理应用程序保存「相片」时发送 HTTP 请求的控制器。使用 make:controller Artisan 命令,我们可以快速地创建一个像这样的控制器:

php artisan make:controller PhotosController

此 Artisan 命令会生成 app/Http/Controllers/PhotosController.php 控制器文件。此控制器会包含用来操作可获取到的各种资源的方法。

接下来,你可以在控制器中注册资源化路由:

Route::resource('photos', 'PhotosController');

这一条路由声明会创建多个路由,用来处理各式各样和相片资源相关的的 RESTful 行为。同样地,生成的控制器有着各种和这些行为绑定的方法,包含要处理的 URI 及方法对应的注释。

由资源控制器处理的行为

动词路径行为(方法)路由名称
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

部分资源路由

声明资源路由时,你可以指定让此路由仅处理一部分的行为:

Route::resource('photos', 'PhotosController',
                ['only' => ['index', 'show']]);

Route::resource('photos', 'PhotosController',
                ['except' => ['create', 'store', 'update', 'destroy']]);

命名资源路由

所有的资源控制器行为默认都有路由名称;不过你可以在选项中传递一个 names数组来重写这些名称:

Route::resource('photos', 'PhotosController',
                ['names' => ['create' => 'photo.build']]);

嵌套资源

有时你可能会需要定义「嵌套」资源路由。例如,相片资源可能会附带多个「评论」。要「嵌套」此资源控制器,可在路由声明中使用「点」记号:

Route::resource('photos.comments', 'PhotoCommentController');

此路由会注册一个「嵌套」资源,可通过类似的 URL 来访问它:photos/{photos}/comments/{comments}

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class PhotoCommentController extends Controller
{
    /**
     * 显示指定相片的评论。
     *
     * @param  int  $photoId
     * @param  int  $commentId
     * @return Response
     */
    public function show($photoId, $commentId)
    {
        //
    }
}
posted on 2017-07-20 09:45  roadone  阅读(517)  评论(0)    收藏  举报