站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

什么叫l(wèi)aravel控制器

在laravel中,控制器(Controller)是一個(gè)類,用于實(shí)現(xiàn)一定的功能;控制器能將相關(guān)的請求處理邏輯組成一個(gè)單獨(dú)的類。控制器中存放中一些方法,實(shí)現(xiàn)一定的功能,通過路由調(diào)用控制器,不再使用回調(diào)函數(shù);控制器被存放在“app/Http/Controllers”目錄中。

什么叫l(wèi)aravel控制器

本教程操作環(huán)境:windows7系統(tǒng)、Laravel6版,DELL G3電腦。

控制器介紹

1、控制器是什么?

為了替代在路由文件中以閉包形式定義的所有的請求處理邏輯,你可能想要使用控制類來組織這些行為。控制器能將相關(guān)的請求處理邏輯組成一個(gè)單獨(dú)的類。

Controller,是類,用于實(shí)現(xiàn)一定的功能,控制器中存放中一些方法,實(shí)現(xiàn)一定的功能,通過路由調(diào)用控制器,不再使用回調(diào)函數(shù)。

2、控制器寫在哪里?

App/Http/Controllers放置控制器

Controller.php是父類文件,別的控制器可以繼承

3、控制器文件如何命名?

大駝峰的控制器名+Controller.php

例如AddDataController.php LoginController.php

4、控制器結(jié)構(gòu)怎么寫?

通過artisan命令自動生成,例如:確保在當(dāng)前項(xiàng)目的根目錄,命令行輸入:

php artisan make:controller TestController
登錄后復(fù)制

結(jié)構(gòu)代碼自動完成,

   namespace AppHttpController;    use IlluminateHttpRequest;        class TestController extends  Controller{      //    }
登錄后復(fù)制

基礎(chǔ)控制器

定義控制器

下面是一個(gè)基礎(chǔ)控制器類的例子。需要注意的是,該控制器繼承了 Laravel 的基礎(chǔ)控制器。該類控制器提供了一些便利的方法,比如 middleware 方法,該方法可以為控制器行為添加中間件:

<?php  namespace AppHttpControllers;  use AppHttpControllersController; use AppModelsUser;  class UserController extends Controller {     /**      * 顯示指定用戶的簡介      *      * @param  int  $id      * @return IlluminateViewView      */     public function show($id)     {         return view('user.profile', ['user' => User::findOrFail($id)]);     } }
登錄后復(fù)制

你可以像這樣定義一個(gè)指向控制器行為的路由:

use AppHttpControllersUserController;  Route::get('user/{id}', [UserController::class, 'show']);
登錄后復(fù)制

當(dāng)一個(gè)請求與指定路由的 URI 匹配時(shí), UserController 控制器中的 show 方法將會執(zhí)行。路由參數(shù)也將會被傳遞給該方法。

技巧:控制器并不是 必需 繼承基礎(chǔ)類。如果控制器沒有繼承基礎(chǔ)類,你將無法使用一些便捷的功能,比如 middlewarevalidate,和 dispatch 方法。

單行為控制器

如果你想要定義一個(gè)只處理單個(gè)行為的控制器,你可以在控制器中放置一個(gè) __invoke 方法:

<?php  namespace AppHttpControllers;  use AppHttpControllersController; use AppModelsUser;  class ShowProfile extends Controller {     /**      * 顯示指定用戶的簡介      *      * @param  int  $id      * @return IlluminateViewView      */     public function __invoke($id)     {         return view('user.profile', ['user' => User::findOrFail($id)]);     } }
登錄后復(fù)制

當(dāng)注冊單個(gè)行為控制器的路由時(shí)不需要指名方法:

use AppHttpControllersShowProfile;  Route::get('user/{id}', ShowProfile::class);
登錄后復(fù)制

你可以通過 Artisan 命令工具里的 make:controller 命令中的 --invokable 選項(xiàng)來生成一個(gè)可調(diào)用的控制器

php artisan make:controller ShowProfile --invokable
登錄后復(fù)制

技巧:可以使用 stub 定制 自定義控制器模板

控制器中間件

中間件 可以在路由文件中分配給控制器的路由:

Route::get('profile', [UserController::class, 'show'])->middleware('auth');
登錄后復(fù)制

然而,在控制器的構(gòu)造函數(shù)中指定中間件更為方便。使用控制器構(gòu)造函數(shù)中的 middleware 方法,可以輕松地將中間件分配給控制器。你甚至可以將中間件限制為只在控制器中的某些方法生效:

class UserController extends Controller {     /**      * 實(shí)例化一個(gè)新的控制器實(shí)例      *      * @return void      */     public function __construct()     {         $this->middleware('auth');          $this->middleware('log')->only('index');          $this->middleware('subscribed')->except('store');     } }
登錄后復(fù)制

同時(shí),控制器還允許你使用一個(gè)閉包來注冊中間件。這為不定義整個(gè)中間件類的情況下為單個(gè)控制器定義中間件提供了一種便捷的方法:

$this->middleware(function ($request, $next) {     // ...      return $next($request); });
登錄后復(fù)制

技巧:你可以將中間件分配給控制器操作的一個(gè)子集。然而,它可能表明你的控制器正在變得復(fù)雜。建議你將控制器拆分為多個(gè)較小的控制器。

資源型控制器

Laravel 的資源路由通過單行代碼即可將典型的「CURD (增刪改查)」路由分配給控制器。例如,你希望創(chuàng)建一個(gè)控制器來處理保存 “照片” 應(yīng)用的所有 HTTP 請求。使用 Artisan 命令 make:controller 可以快速創(chuàng)建這樣一個(gè)控制器:

php artisan make:controller PhotoController --resource
登錄后復(fù)制

這個(gè)命令將會生成一個(gè)控制器 app/Http/Controllers/PhotoController.php。 其中包括每個(gè)可用資源操作的方法。

接下來,你可以給控制器注冊一個(gè)資源路由:

Route::resource('photos', PhotoController::class);
登錄后復(fù)制

這個(gè)單一的路由聲明創(chuàng)建了多個(gè)路由來處理資源上的各種行為。生成的控制器為每個(gè)行為保留了方法,包括了關(guān)于處理 HTTP 動詞和 URLs 的聲明注釋。

你可以通過將數(shù)組傳參到 resources 方法中的方式來一次性的創(chuàng)建多個(gè)資源控制器:

Route::resources([     'photos' => PhotoController::class,     'posts' => PostController::class, ]);
登錄后復(fù)制

資源控制器操作處理

Verb URI Action Route Name
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

指定資源模型

如果你使用了路由模型綁定,并且想在資源控制器的方法中使用類型提示,你可以在生成控制器的時(shí)候使用 --model 選項(xiàng):

php artisan make:controller PhotoController --resource --model=Photo
登錄后復(fù)制

部分資源路由

當(dāng)聲明資源路由時(shí),你可以指定控制器處理的部分行為,而不是所有默認(rèn)的行為:

Route::resource('photos', PhotoController::class)->only([     'index', 'show' ]);  Route::resource('photos', PhotoController::class)->except([     'create', 'store', 'update', 'destroy' ]);
登錄后復(fù)制

API 資源路由

當(dāng)聲明用于 APIs 的資源路由時(shí),通常需要排除顯示 HTML 模板的路由(如 createedit )。為了方便起見,你可以使用 apiResource 方法自動排除這兩個(gè)路由:

Route::apiResource('photos', PhotoController::class);
登錄后復(fù)制

你也可以傳遞一個(gè)數(shù)組給 apiResources 方法來同時(shí)注冊多個(gè) API 資源控制器:

Route::apiResources([     'photos' => PhotoController::class,     'posts' => PostController::class, ]);
登錄后復(fù)制

要快速生成不包含 createedit 方法的用于開發(fā)接口的資源控制器,請?jiān)趫?zhí)行 make:controller 命令時(shí)使用 --api 參數(shù):

php artisan make:controller API/PhotoController --api
登錄后復(fù)制

嵌套資源

有時(shí)可能需要定義一個(gè)嵌套的資源型路由。例如,照片資源可能被添加了多個(gè)評論。那么可以在路由中使用 “點(diǎn)” 符號來聲明資源型控制器:

Route::resource('photos.comments', PhotoCommentController::class);
登錄后復(fù)制

該路由會注冊一個(gè)嵌套資源,可以使用如下 URI 訪問:

/photos/{photo}/comments/{comment}
登錄后復(fù)制

限定嵌套資源的范圍

Laravel 的 隱式模型綁定 特性可以自動限定嵌套綁定的范圍,因此已解析的子模型會自動屬于父模型。定義嵌套路由時(shí),使用 scoped 方法,可以開啟自動范圍限定,也可以指定 Laravel 應(yīng)該按照哪個(gè)字段檢索子模型資源

Route::resource('photos.comments', PhotoCommentController::class)->scoped([     'comment' => 'slug', ]);
登錄后復(fù)制

這個(gè)路由會注冊一個(gè)限定范圍的嵌套資源路由,可以像下面這樣來訪問:

/photos/{photo}/comments/{comment:slug}
登錄后復(fù)制

淺層嵌套

通常,并不完全需要在 URI 中同時(shí)擁有父 ID 和子 ID ,因?yàn)樽?ID 已經(jīng)是唯一的標(biāo)識符。當(dāng)使用唯一標(biāo)識符(如自動遞增的主鍵)來標(biāo)識 URI 中的模型時(shí),可以選擇使用「淺嵌套」的方式定義路由:

Route::resource('photos.comments', CommentController::class)->shallow();
登錄后復(fù)制

上面的路由定義方式會定義以下路由:

HTTP 方式 URI 行為 路由名稱
GET /photos/{photo}/comments index photos.comments.index
GET /photos/{photo}/comments/create create photos.comments.create
POST /photos/{photo}/comments store photos.comments.store
GET /comments/{comment} show comments.show
GET /comments/{comment}/edit edit comments.edit
PUT/PATCH /comments/{comment} update comments.update
DELETE /comments/{comment} destroy comments.destroy

命名資源路由

默認(rèn)情況下,所有的資源控制器行為都有一個(gè)路由名稱。你可以傳入 names 數(shù)組來覆蓋這些名稱:

Route::resource('photos', PhotoController::class)->names([     'create' => 'photos.build' ]);
登錄后復(fù)制

命名資源路由參數(shù)

默認(rèn)情況下,Route::resource 會根據(jù)資源名稱的「單數(shù)」形式創(chuàng)建資源路由的路由參數(shù)。你可以在選項(xiàng)數(shù)組中傳入 parameters 參數(shù)來輕松地覆蓋每個(gè)資源。parameters 數(shù)組應(yīng)該是資源名稱和參數(shù)名稱的關(guān)聯(lián)數(shù)組:

Route::resource('users', AdminUserController::class)->parameters([     'users' => 'admin_user' ]);
登錄后復(fù)制

上例將會為資源的 show 路由生成如下的 URI :

/users/{admin_user}
登錄后復(fù)制

限定范圍的資源路由

有時(shí),在定義資源路由時(shí)隱式綁定了多個(gè) Eloquent 模型,你希望限定第二個(gè) Eloquent 模型必須為第一個(gè) Eloquent 模型的子模型。例如,考慮這樣一個(gè)場景,通過 slug 檢索某個(gè)特殊用戶的一篇文章:

use AppHttpControllersPostsController;Route::resource('users.posts', PostsController::class)->scoped();
登錄后復(fù)制

你可以通過給 scoped 方法傳遞一個(gè)數(shù)組來覆蓋默認(rèn)的模型路由鍵:

use AppHttpControllersPostsController;Route::resource('users.posts', PostsController::class)->scoped([     'post' => 'slug', ]);
登錄后復(fù)制

當(dāng)使用一個(gè)自定義鍵的隱式綁定作為嵌套路由參數(shù)時(shí),Laravel 會自動限定查詢范圍,按照約定的命名方式去父類中查找關(guān)聯(lián)方法,然后檢索到對應(yīng)的嵌套模型。在這種情況下,將假定 User 模型有一個(gè)叫 posts(路由參數(shù)名的復(fù)數(shù))的關(guān)聯(lián)方法,通過這個(gè)方法可以檢索到 Post 模型。

本地化資源 URI

默認(rèn)情況下,Route::resource 將會用英文動詞創(chuàng)建資源 URI。如果需要自定義 createedit 行為的動作名,可以在 AppServiceProviderboot 中使用 Route::resourceVerbs 方法實(shí)現(xiàn):

use IlluminateSupportFacadesRoute;  /**  * 引導(dǎo)任何應(yīng)用服務(wù)。  *  * @return void  */ public function boot() {     Route::resourceVerbs([         'create' => 'crear',         'edit' => 'editar',     ]); }
登錄后復(fù)制

動作被自定義后,像 Route::resource('fotos', 'PhotoController') 這樣注冊的資源路由將會產(chǎn)生如下的 URI:

/fotos/crear  /fotos/{foto}/editar
登錄后復(fù)制

補(bǔ)充資源控制器

如果您需要增加額外的路由到默認(rèn)的資源路由之中,您需要在 Route::resource 前定義它們;否則, resource 方法定義的路由可能會無意間優(yōu)先于您定義的路由:

Route::get('photos/popular', [PhotoController::class, 'popular']);  Route::resource('photos', PhotoController::class);
登錄后復(fù)制

技巧:記得保持您的控制器的專一性。如果您需要典型的資源操作以外的方法,請考慮將您的控制器分割為兩個(gè)更小的控制器。

依賴注入 & 控制器

構(gòu)造注入

Laravel 服務(wù)容器 被用于解析所有的 Laravel 控制器。因此,您可以在控制器的構(gòu)造函數(shù)中使用類型提示需要的依賴項(xiàng)。聲明的解析會自動解析并注入到控制器實(shí)例中去:

<?php  namespace AppHttpControllers;  use AppRepositoriesUserRepository;  class UserController extends Controller {     /**      * 用戶 repository 實(shí)例。      */     protected $users;      /**      * 創(chuàng)建一個(gè)新的控制器實(shí)例。      *      * @param  UserRepository  $users      * @return void      */     public function __construct(UserRepository $users)     {         $this->users = $users;     } }
登錄后復(fù)制

您亦可類型提示 Laravel 契約 ,只要它能夠被解析。取決于您的應(yīng)用,注入依賴到控制器可能會提供更好的可測試性。

方法注入

除了構(gòu)造器注入以外,您亦可在控制器方法中類型提示依賴。最常見的用法便是注入 IlluminateHttpRequest 到您的控制器方法中:

<?php  namespace AppHttpControllers;  use IlluminateHttpRequest;  class UserController extends Controller {     /**      * 保存一個(gè)新用戶。      *      * @param  Request  $request      * @return Response      */     public function store(Request $request)     {         $name = $request->name;          //     } }
登錄后復(fù)制

如果您的控制器方法要從路由參數(shù)中獲取輸入內(nèi)容,請?jiān)谀囊蕾図?xiàng)之后列出您的路由參數(shù)。例如,您可以像下方這樣定義路由:

Route::put('user/{id}', [UserController::class, 'update']);
登錄后復(fù)制

如下所示,您依然可以類型提示 IlluminateHttpRequest 并通過定義您的控制器方法訪問 id 參數(shù):

<?php  namespace AppHttpControllers;  use IlluminateHttpRequest;  class UserController extends Controller {     /**      * 修改指定的用戶。      *      * @param  Request  $request      * @param  string  $id      * @return Response      */     public function update(Request $request, $id)     {         //     } }
登錄后復(fù)制

路由緩存

如果您的應(yīng)用僅使用了基于路由的控制器,您應(yīng)該充分利用 Laravel 路由緩存。使用路由緩存將會大幅降低您的應(yīng)用路由的注冊時(shí)間。有時(shí),您的路由注冊的速度可能會提高 100 倍。要生成路由緩存,僅需執(zhí)行 route:cache Artisan 命令:

php artisan route:cache
登錄后復(fù)制

在運(yùn)行該命令后,每次請求將會加載您緩存的路由文件。請記住,您每次添加新路由后均需要生成新的路由緩存。因此,您應(yīng)該在項(xiàng)目部署時(shí)才運(yùn)行 route:cache 命令。

您亦可使用 route:clear 來清除路由緩存:

php artisan route:clear
登錄后復(fù)制

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
日韩精品内射视频免费观看| 99热这里只有精品在线| 久久久g0g0午夜无码精品| 久久久久人妻一区精品色| 老司机91精品网站在线观看| 91国内外精品自在线播放| 亚洲日韩国产精品乱| 精品大臿蕉视频在线观看| 国产日韩成人亚洲丁香婷婷 | 99视频精品全部在线观看| 97精品免费视频| 99精品在线免费观看| 久久九九久精品国产日韩经典| 国产在线精品一区二区不卡| 二区久久国产乱子伦免费精品 | 青青青国产精品一区二区| 国产精品久久午夜夜伦鲁鲁| 最新国产精品拍自在线观看| 久久久精品日本一区二区三区| 国产精品一区二区三区99| 尤物TV国产精品看片在线| 日韩国产有码在线观看视频| 最新日韩精品中文字幕| 亚洲综合日韩久久成人AV| 国产日韩在线视频免费播放| 日韩AV高清无码| 日韩精品无码熟人妻视频| 日韩精品久久久肉伦网站| 日韩精品免费在线视频| 日韩在线播放全免费| 日韩AV无码一区二区三区不卡| 精品一区二区91| 一本一本久久a久久精品综合| 伊人 久久 精品 | 亚洲AV无码成人网站久久精品大| 免费91麻豆精品国产自产在线观看| 久久久久久久99精品免费观看| 国产精品美女一区二区视频| 久久精品中文字幕不卡一二区| 无码人妻精品一区二区三区在线| 亚洲人成亚洲精品|