Laravel -HTTP 控制器

1.基本控制器

所有的 Laravel 控制器應(yīng)該繼承自 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方法就會被執(zhí)行。當(dāng)然,路由參數(shù)也會被傳遞給這個方法。
控制器 & 命名空間
我們在定義控制器路由的時候沒有指定完整的控制器命名空間,而只是定義了 App\Http\Controllers之后的部分。默認(rèn)情況下,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']);

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

$url = route('name');

2.控制器[中間件]

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

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

但是,將中間件放在控制器構(gòu)造函數(shù)中更方便,在控制器的構(gòu)造函數(shù)中使用 middleware方法你可以很輕松的分配中間件給該控制器。你甚至可以限定該中間件應(yīng)用到該控制器類的指定方法:

class UserController extends Controller
{
    /**
     * 實(shí)例化一個新的 UserController 實(shí)例
     *
     * @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'
]);

在控制器的構(gòu)造函數(shù)中使用 middleware方法你可以很輕松的分配中間件給該控制器。你甚至可以限定該中間件應(yīng)用到該控制器類的指定方法:

class UserController extends Controller
{
    /**
     * 實(shí)例化一個新的 UserController 實(shí)例
     *
     * @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
,這個控制器包含了每一個資源操作對應(yīng)的方法。
接下來,可以為該控制器注冊一個資源路由:

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

Paste_Image.png

只定義部分資源路由

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

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

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

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

補(bǔ)充資源控制器
如果有必要在默認(rèn)資源路由之外添加額外的路由到資源控制器,應(yīng)該在調(diào)用 Route::resource之前定義這些路由;否則,通過 resource
方法定義的路由可能無意中優(yōu)先于補(bǔ)充的額外路由:

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

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

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

<?php

namespace App\Http\Controllers;

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

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

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

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

<?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');

        //
    }
}

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

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

你需要通過定義控制器方法如下所示來類型示 Illuminate\Http\Request
并訪問路由參數(shù) 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)
    {
        //
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 介紹 不要把所有處理請求的邏輯都放到一個單獨(dú)的 routes.php 文件里,我們可以使用控制器去組織這些行為。C...
    伊Summer閱讀 899評論 0 1
  • HTTP 控制器 簡介 控制器允許你將相應(yīng)的路由業(yè)務(wù)邏輯封裝在控制器類中進(jìn)行有效的管理,這樣你不必將所有的路由邏輯...
    Dearmadman閱讀 3,488評論 1 3
  • 0.1配置1.模板繼承2.控制器3.git4.支付寶支付的流程5.路由6.中間件7.請求8.laravel 學(xué)習(xí)筆...
    云龍789閱讀 919評論 0 5
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,720評論 0 121
  • 路由 路由(routing)就是通過互聯(lián)的網(wǎng)絡(luò)把信息從源地址傳輸?shù)侥康牡刂返幕顒?。路由發(fā)生在OSI網(wǎng)絡(luò)參考模型中的...
    Dearmadman閱讀 2,967評論 2 9

友情鏈接更多精彩內(nèi)容