<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                * * * * * [TOC] ## 簡介 除了在路由文件中以閉包的形式定義所有的請求處理邏輯外,你可能還想使用控制器類來組織此類操作。控制器能夠將相關的請求處理邏輯組成一個單獨的類。控制器被存放在?`app/Http/Controllers`?目錄下。 ## 基礎控制器 ### 定義控制器 以下是一個基礎控制器類的例子。需要注意的是,該控制器繼承了 Laravel 內置的基礎控制器類。該基礎類提供了一些便捷的方法,比如?`middleware`?方法,該方法可以用來給控制器操作添加中間件: ~~~ <?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class UserController extends Controller { /** * 展示給定用戶的信息。 * * @param int $id * @return Response */ public function show($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } } ~~~ 你可以這樣定義一個指向該控制器操作的路由: ~~~ Route::get('user/{id}', 'UserController@show'); ~~~ 現在,當請求和此特定路由的 URI 匹配時,`UserController`?類的?`show`?方法就會被執行。當然,路由參數也會被傳遞至該方法。 > {tip} 控制器并不是?**一定**?要繼承基礎類。只是,你將無法使用一些便捷的功能,比如?`middleware`,`validate`?和?`dispatch`?方法。 ### 控制器與命名空間 這一點很重要,我們在定義控制器路由時,不必指定完整的控制器命名空間。`RouteServiceProvider`?會在一個包含命名空間的路由組中加載路由文件,因此我們只需要指定類名中?`App\Http\Controllers`?命名空間之后的部分就可以了。 如果你選擇將控制器存放在?`App\Http\Controllers`?目錄下,只需簡單地使用相對于根命名空間?`App\Http\Controllers`?的特定類名。因此,如果你的完整控制器類是?`App\Http\Controllers\Photos\AdminController`,你應該用這種方式注冊指向該控制器的路由: ~~~ Route::get('foo', 'Photos\AdminController@method'); ~~~ ### 單一操作控制器 如果想定義一個只處理單個操作的控制器,你可以在控制器中只設置一個?`__invoke`?方法: ~~~ <?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class ShowProfile extends Controller { /** * 展示給定用戶的信息。 * * @param int $id * @return Response */ public function __invoke($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } } ~~~ 為單一操作控制器注冊路由時,無需指定方法: ~~~ Route::get('user/{id}', 'ShowProfile'); ~~~ ## 控制器中間件 [中間件](中間件.md)?可以在路由文件中指定給控制器路由: ~~~ Route::get('profile', 'UserController@show')->middleware('auth'); ~~~ 然而,在控制器的構造方法中指定中間件會更為便捷。在控制器構造方法中使用?`middleware`?方法,你可以很容易地將中間件指定給控制器操作。你甚至可以約束中間件只對控制器類中的某個特定方法生效: ~~~ class UserController extends Controller { /** * 創建一個新的控制器實例。 * * @return void */ public function __construct() { $this->middleware('auth'); $this->middleware('log')->only('index'); $this->middleware('subscribed')->except('store'); } } ~~~ 控制器也允許你使用閉包的方式注冊中間件。這提供了一種很便捷地為單個控制器定義中間件的方式,而不用定義一個完整的中間件類: ~~~ $this->middleware(function ($request, $next) { // ... return $next($request); }); ~~~ > {tip} 你可能將中間件指定到控制器的部分操作上,然而,這會使你的控制器過于臃腫。換個角度,考慮將控制器分成多個更小的控制器。 ## 資源控制器 Laravel 資源路由可以將典型的「CURD」路由指定到一個控制器上,僅需一行代碼就可以實現。比如,你可能希望創建一個控制器來處理所有應用保存的「相片」的 HTTP 請求。使用 Artisan 命令?`make:controller`,就能快速創建這樣一個控制器: ~~~ php artisan make:controller PhotoController --resource ~~~ 這個命令會在?`app/Http/Controllers/PhotoController.php`?中生成一個控制器,該控制器包含了各種可用的資源操作方法。 接下來,你可以給控制器注冊一個資源路由: ~~~ Route::resource('photos', 'PhotoController'); ~~~ 這個路由聲明會創建多個路由來處理各種各樣的資源操作。前面生成的控制器已經包含了這些操作的方法,還包括了 HTTP 動作和操作 URI 的注釋。 #### 資源控制器操作處理 | 動作 | 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 | #### 指定資源模型 如果你使用了路由模型綁定,并且想在資源控制器的方法中對某個模型實例做類型約束,你可以在生成控制器的時候使用?`--model`?選項: ~~~ php artisan make:controller PhotoController --resource --model=Photo ~~~ #### 偽造表單方法 送?`PUT`,`PATCH`?或者?`DELETE`?請求,你需要添加一個?`_method`?隱藏域字段來偽造 HTTP 動作。`method_field`?輔助函數可以為你創建這個字段: ~~~ {{ method_field('PUT') }} ~~~ ### 部分資源路由 聲明資源路由的時候,你可以指定控制器處理部分操作,而不必使用全部默認的操作: ~~~ 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`?會基于資源名稱的「單數」形式生成路由參數。你可以在選項數組中傳入?`parameters`參數,實現每個資源基礎中參數名稱的重寫。`parameters`?應該是一個將資源名稱和參數名稱聯系在一起的數組: ~~~ Route::resource('user', 'AdminUserController', ['parameters' => [ 'user' => 'admin_user' ]]); ~~~ 上例將會為?`show`?方法的路由生成如下的 URI: ~~~ /user/{admin_user} ~~~ ### 本地化資源 URI 默認地,`Route::resource`?將會用英文動詞創建資源 URI。如果你想本地化?`create`?和?`edit`?的動作名,可以使用?`Route::resourceVerb`?方法,可以在?`AppServiceProvider`?的?`boot`?方法中實現: ~~~ use Illuminate\Support\Facades\Route; /** * 自定義任何應用服務。 * * @return void */ public function boot() { Route::resourceVerbs([ 'create' => 'crear', 'edit' => 'editar', ]); } ~~~ 動作名被自定義后,像?`Route::resource('fotos', 'PhtotController')`?這樣注冊的資源路由將會產生如下的 URI: ~~~ /fotos/crear /fotos/{foto}/editar ~~~ ### 附加資源控制器 如果你想在默認的資源路由之外增加資源控制器路由,你應該在調用?`Route::resource`?之前定義這些路由;否則,`resource`?方法定義的路由可能會不小心覆蓋你的附加路由: ~~~ Route::get('photos/popular', 'PhotoController@method'); Route::resource('photos', 'PhotoController'); ~~~ > {tip} 記住保持控制器的專一性。如果你需要典型的資源操作之外的方法,考慮將你的控制器分成兩個更小的控制器吧。 ## 依賴注入與控制器 #### 構造方法注入 Laravel 使用?[服務容器](服務容器.md)?來解析所有的控制器。因此,你可以在控制器的構造方法中對任何依賴使用類型約束,聲明的依賴會自動被解析并注入控制器實例中: ~~~ <?php namespace App\Http\Controllers; use App\Repositories\UserRepository; class UserController extends Controller { /** * 用戶 repository 實例。 */ protected $users; /** * 創建一個新的控制器實例。 * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { $this->users = $users; } } ~~~ 當然,你也可以對任何的?[Laravel contract](Contracts.md)?使用類型約束。當容器解析 contract 的時候,就會使用類型約束。直接將依賴注入控制器可能會提供更好的可測試性,但這取決于你的項目的具體情況。 #### 方法注入 除了構造方法注入之外,你還可以在控制器方法中使用依賴類型約束。一個常見的用法就是將?`Illuminate\Http\Request`?實例注入控制器方法中: ~~~ <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * 保存一個新用戶。 * * @param Request $request * @return Response */ public function store(Request $request) { $name = $request->name; // } } ~~~ 如果控制器方法需要從路由參數中獲取輸入內容,只需在其他依賴后列出路由參數即可。比如,路由定義如下: ~~~ Route::put('user/{id}', 'UserController@update'); ~~~ 通過以下方式定義控制器方法,可以讓你在使用?`Illuminate\Http\Request`?類型約束的同時仍然可以獲取參數?`id`: ~~~ <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller { /** * 更新給定用戶的信息。 * * @param Request $request * @param string $id * @return Response */ public function update(Request $request, $id) { // } } ~~~ ## 路由緩存 > {note} 基于閉包的路由并不能被緩存。如果要使用路由緩存,你必須將所有的閉包路由轉換成控制器類。 如果你的應用只用到了基于控制器的路由,那么你應該充分利用 Laravel 的路由緩存。使用路由緩存將極大地減少注冊全部應用路由的時間。某些情況下,路由注冊甚至可以快一百倍。要生成路由緩存,只需在 Artisan 命令行中執行?`route:cache`?命令: ~~~ php artisan route:cache ~~~ 運行這個命令之后,每一次請求的時候都將會加載緩存的路由文件。記住,如果添加了新的路由,你需要刷新路由緩存。因此,你應該只在項目部署時才運行?`route:cache`?命令: 你可以使用?`route:clear`?命令清除路由緩存: ~~~ php artisan route:clear ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看