<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Controllers - [簡介](#introduction) - [基礎控制器](#basic-controllers) - [定義控制器](#defining-controllers) - [控制器與命名空間](#controllers-and-namespaces) - [單一行為控制器](#single-action-controllers) - [控制器中間件](#controller-middleware) - [RESTful 資源控制器](#resource-controllers) - [部分資源路由](#restful-partial-resource-routes) - [命名資源路由](#restful-naming-resource-routes) - [重命名資源路由器參數](#restful-naming-resource-route-parameters) - [附加資源控制器](#restful-supplementing-resource-controllers) - [依賴注入與控制器](#dependency-injection-and-controllers) - [路由緩存](#route-caching) <a name="introduction"></a> ## 簡介 除了可以以閉包的形式在路由文件中定義所有的請求處理邏輯外,你可能還希望可以使用控制器類來組織此行為。控制器可將相關的 HTTP 請求處理邏輯組成一個類。控制器一般存放在 `app/Http/Controllers` 目錄下。 > 譯者注:請不要在路由文件里面寫邏輯代碼,邏輯處理代碼請在 Controller 里書寫。 <a name="basic-controllers"></a> ## 基礎控制器 <a name="defining-controllers"></a> ### 定義控制器 下面是一個基礎控制器類的例子。所有 Laravel 控制器都應繼承基礎控制器類,它包含在 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` 等方法。 <a name="controllers-and-namespaces"></a> ### 控制器與命名空間 有一點非常重要,那就是我們在定義控制器路由時,不需要指定完整的控制器命名空間。我們只需要定義「根」命名空間 `App\Http\Controllers` 之后的部分類名稱即可。默認 `RouteServiceProvider` 會使用路由群組,把 `routes.php` 文件里所有路由規則都配置了根控制器命名空間。 若你需要在 `App\Http\Controllers` 目錄內層使用 PHP 命名空間嵌套或組織控制器,只要使用相對于 `App\Http\Controllers` 根命名空間的特定類名稱即可。例如控制器類全名為 `App\Http\Controllers\Photos\AdminController`,你可以像這樣注冊一個路由: Route::get('foo', 'Photos\AdminController@method'); <a name="single-action-controllers"></a> ### 單一行為控制器 如果你想定義只有一個行為的控制器,只需在控制器中設置一個名為 `__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'); <a name="controller-middleware"></a> ## 控制器中間件 [中間件](/docs/{{version}}/middleware) 可以指定到路由文件中的控制器路由上: Route::get('profile', 'UserController@show')->middleware('auth'); 不過,在控制器構造器中指定中間件會更為靈活。在控制器構造器中使用 `middleware` 方法,你可以很容易地將中間件指定給控制器。你甚至可以對中間件作出限制,僅將它提供給控制器類中的某些方法。 class UserController extends Controller { /** * 添加一個 UserController 實例。 * * @return void */ public function __construct() { $this->middleware('auth'); $this->middleware('log')->only('index'); $this->middleware('subscribed')->except('store'); } } > {tip} 你可以將某個中間件指定到一部分控制器行為上,然而,那可能意味著你的控制器過于臃腫。反而,你可以考慮將控制器分解成多個較小的控制器。 <a name="resource-controllers"></a> ## RESTful 資源控制器 Laravel 資源路由只需一行代碼就可以將典型的 "CRUD" 路由指定到一個控制器上。例如,你可能想要創建一個用來處理應用程序保存「相片」時發送 HTTP 請求的控制器。使用 `make:controller` Artisan 命令,我們可以快速地創建一個像這樣的控制器: php artisan make:controller PhotoController --resource 此命令會生成 `app/Http/Controllers/PhotosController.php` 控制器文件。該控制器會包含各種資源操作的方法。 接下來,你可以在控制器中注冊資源化路由: Route::resource('photos', 'PhotoController'); 這一條路由聲明會創建多個路由,用來處理各式各樣和相片資源相關的的 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 | #### 模擬表單方法 因為 HTML 表單不能發送 `PUT`,`PATCH`,或 `DELETE` 請求, 你需要使用隱藏的 `_method` 表單字段來模擬這些 HTTP 動詞。 你可以使用輔助函數 `method_field` 生成該表單字段: {{ method_field('PUT') }} <a name="restful-partial-resource-routes"></a> ### 部分資源路由 聲明資源路由時,你可以指定讓此路由僅處理一部分的行為: Route::resource('photo', 'PhotoController', ['only' => [ 'index', 'show' ]]); Route::resource('photo', 'PhotoController', ['except' => [ 'create', 'store', 'update', 'destroy' ]]); <a name="restful-naming-resource-routes"></a> ### 命名資源路由 所有的資源控制器行為默認都有路由名稱;不過你可以在`選項`參數數組中傳遞一個 `names` 數組來重寫這些名稱: Route::resource('photo', 'PhotoController', ['names' => [ 'create' => 'photo.build' ]]); <a name="restful-naming-resource-route-parameters"></a> ### 重命名資源路由器參數 默認情況下,`Route::resource` 會基于資源英文名稱的「單數」形式生成路由參數。如果你想重寫此參數,可以在 `選項` 參數數組中傳入 `parameters` 數組,在此數組中指定參數名稱: Route::resource('user', 'AdminUserController', ['parameters' => [ 'user' => 'admin_user' ]]); 上面的示例代碼,會為資源的 `show` 路由生成以下的 URIs: /user/{admin_user} <a name="restful-supplementing-resource-controllers"></a> ### 附加資源控制器 如果想在資源控制器中默認的資源路由之外加入其它額外路由,則應該在調用 `Route::resource` **之前** 定義這些路由。否則,由 `resource` 方法定義的路由可能會不小心覆蓋你附加的路由: Route::get('photos/popular', 'PhotoController@method'); Route::resource('photos', 'PhotoController'); > {tip} 記住要保持控制器的專注性。如果你發現控制器需要典型資源化行為之外的一些方法,就可以考慮將其分解為兩個較小的控制器了。 <a name="dependency-injection-and-controllers"></a> ## 依賴注入與控制器 #### 構造器注入 Laravel 使用 [服務容器](/docs/{{version}}/container) 來解析所有的控制器。因此,你能夠在控制器的構造方法中,對任何需要的依賴使用類型提示。這些聲明的依賴將被自動解析并注入到控制器實例當中: <?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](/docs/{{version}}/contracts) 使用類型提示。若容器能夠解析它,你就可以使用類型提示。根據你的應用的情況,把依賴注入到控制器中會提供更好的可測試性。 #### 方法注入 除了構造器注入之外,你也可以對 `控制器行為方法的依賴` 使用類型提示。例如,讓我們對 `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) { // } } <a name="route-caching"></a> ## 路由緩存 > {note} 路由緩存并不會作用在基于閉包的路由。要使用路由緩存,你必須將所有閉包路由轉換為控制器類。 若你的應用程序完全通過控制器使用路由,你應該充分利用 Laravel 路由緩存。使用路由緩存可以大幅降低注冊全部路由所需的時間。在某些情況下,你的路由注冊甚至可以快上一百倍!要生成路由緩存,只要運行 `route:cache` 此 Artisan 命令: php artisan route:cache 這就可以了!現在你的緩存路由文件將被用來代替 `app/Http/routes.php` 這一文件。請記得,若你添加了任何新的路由,就必須生成新的路由緩存。因此你可能希望只在你的項目部署時才運行 `route:cache` 這一命令。 要移除緩存路由文件而不生成新的緩存,請使用 `route:clear` 命令: php artisan route:clear > 譯者注: 想知道更多 Laravel 程序調優的技巧?請參閱:[Laravel 5 程序優化技巧](https://phphub.org/topics/2020) ## 譯者署名 | 用戶名 | 頭像 | 職能 | 簽名 | |---|---|---|---| | [@Macken](https://phphub.org/users/1289) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/1289_1473143048.jpg?imageView2/1/w/200/h/200"> | 翻譯 | 專注Web開發,[麥肯先生](https://macken.me) My Blog |
                  <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>

                              哎呀哎呀视频在线观看