Laravel -HTTP 控制器

1.基本控制器

所有的 Laravel 控制器應該繼承自 Laravel 自帶的控制器基類 Controller

<?php

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * 為指定用戶顯示詳情
     *
     * @param int $id
     * @return Response
     */
    public function showProfile($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}
我們可以像這樣定義指向該控制器動作的[路由]
Route::get('user/{id}', 'UserController@showProfile');

UserController的 showProfile方法就會被執行。當然,路由參數也會被傳遞給這個方法。
控制器 & 命名空間
我們在定義控制器路由的時候沒有指定完整的控制器命名空間,而只是定義了 App\Http\Controllers之后的部分。默認情況下,RouteServiceProvider將會在一個路由群組中載入 routes.php 文件,并且該路由群組指定定了群組中路由控制器所在的命名空間。
如果你在 App\Http\Controllers
目錄下選擇使用 PHP 命名空間嵌套或組織控制器,只需要使用相對于App\Http\Controllers
命名空間的指定類名即可。因此,如果你的完整控制器類是App\Http\Controllers\Photos\AdminController
,你可以像這樣注冊路由:

Route::get('foo', 'Photos\AdminController@method');

命名控制器路由
和閉包路由一樣,可以指定控制器路由的名稱:

Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);

你還可以使用輔助函數 route 來為已命名的控制器路由生成對應的 URL:

$url = route('name');

2.控制器[中間件]

中間件可以像這樣分配給控制器路由:

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

3.[Controller Middleware 控制器中間件]

你可以像下面的例子一樣把[中間件]指派給控制器路由:

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

3.[RESTful]資源控制器

php artisan make:controller PhotoController --resource

該 Artisan 命令將會生成一個控制器文件
app/Http/Controllers/PhotoController.php
,這個控制器包含了每一個資源操作對應的方法。
接下來,可以為該控制器注冊一個資源路由:

Route::resource('photo', 'PhotoController');

Paste_Image.png

只定義部分資源路由

Route::resource('photo', 'PhotoController',
['only' => ['index', 'show']]);

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

命名資源路由
默認情況下,所有資源控制器動作都有一個路由名稱,然而,我們可以通過傳入 names數組來覆蓋這些默認的名字:

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

補充資源控制器
如果有必要在默認資源路由之外添加額外的路由到資源控制器,應該在調用 Route::resource之前定義這些路由;否則,通過 resource
方法定義的路由可能無意中優先于補充的額外路由:

Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');

4.[依賴注入] & 控制器

構造函數注入
Laravel 使用服務容器解析所有的 Laravel 控制器,因此,可以在控制器的構造函數中類型聲明任何依賴,這些依賴會被自動解析并注入到控制器實例中:

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * 創建新的控制器實例
     *
     * @param UserRepository $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}

方法注入
除了構造函數注入之外,還可以在控制器的動作方法中進行依賴的類型提示,例如,我們可以在某個方法中類型提示 Illuminate\Http\Request
實例:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class UserController extends Controller
{
    /**
     * 存儲新用戶
     *
     * @param Request $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->input('name');

        //
    }
}

如果控制器方法期望輸入路由參數,只需要將路由參數放到其他依賴之后

Route::put('user/{id}', 'UserController@update');

你需要通過定義控制器方法如下所示來類型示 Illuminate\Http\Request
并訪問路由參數 id:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class UserController extends Controller
{
    /**
     * 更新指定用戶
     *
     * @param Request $request
     * @param int $id
     * @return Response
     * @translator http://laravelacademy.org
     */
    public function update(Request $request, $id)
    {
        //
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 介紹 不要把所有處理請求的邏輯都放到一個單獨的 routes.php 文件里,我們可以使用控制器去組織這些行為。C...
    伊Summer閱讀 825評論 0 1
  • HTTP 控制器 簡介 控制器允許你將相應的路由業務邏輯封裝在控制器類中進行有效的管理,這樣你不必將所有的路由邏輯...
    Dearmadman閱讀 3,433評論 1 3
  • 0.1配置1.模板繼承2.控制器3.git4.支付寶支付的流程5.路由6.中間件7.請求8.laravel 學習筆...
    云龍789閱讀 841評論 0 5
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,626評論 0 121
  • 路由 路由(routing)就是通過互聯的網絡把信息從源地址傳輸到目的地址的活動。路由發生在OSI網絡參考模型中的...
    Dearmadman閱讀 2,874評論 2 9