laravel?? ????(Controller)? ?? ??? ???? ? ???? ??????. ????? ?? ?? ?? ??? ??? ???? ??? ? ????. ?? ???? ?? ??? ???? ?? ????? ????, ????? ???? ?? ????, ????? ? ?? "app/Http/Controllers" ????? ?????.
? ????? ?? ??: Windows 7 ???, Laravel 6 ??, DELL G3 ???.
???? ??
1. ??????
??? ???? ??? ???? ??? ?? ?? ?? ??? ????? ??? ???? ???? ??? ??? ??? ? ????. ????? ?? ?? ?? ??? ??? ???? ???? ? ????.
Controller? ?? ??? ???? ? ???? ??????. ?? ???? ?? ??? ???? ?? ????? ????, ????? ???? ?? ????, ?? ??? ? ?? ???? ????.
2. ????? ??? ?? ????
App/Http/Controller? ????? ?????.
Controller.php? ?? ??? ????, ?? ????? ??? ? ????.
3. ???? ?? ??? ??? ??????
Hump-hump ???? ?? + Controller.php
?: AddDataController.php LoginController.php
4. ???? ??? ??? ??????
artisan ??? ?? ???? ?????. ?: ?? ????? ?? ?????? ??? ??:
php artisan make:controller TestController
?? ?? ?? ??,
namespace App\Http\Controller; use Illuminate\Http\Request; class TestController extends Controller{ // }
?? ????
???? ??
??? ?? ???? ???? ????. ? ????? Laravel
? ?? ????? ????? ?? ?????. ? ???? ???? ???? ??? ????? ??? ? ?? middleware
???? ?? ? ?? ??? ???? ?????. Laravel
的基礎控制器。該類控制器提供了一些便利的方法,比如 middleware
方法,該方法可以為控制器行為添加中間件:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Models\User; class UserController extends Controller { /** * 顯示指定用戶的簡介 * * @param int $id * @return \Illuminate\View\View */ public function show($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
你可以像這樣定義一個指向控制器行為的路由:
use App\Http\Controllers\UserController; Route::get('user/{id}', [UserController::class, 'show']);
當一個請求與指定路由的 URI 匹配時, UserController
控制器中的 show
方法將會執(zhí)行。路由參數(shù)也將會被傳遞給該方法。
技巧:控制器并不是 必需 繼承基礎類。如果控制器沒有繼承基礎類,你將無法使用一些便捷的功能,比如
middleware
,validate
,和dispatch
方法。
單行為控制器
如果你想要定義一個只處理單個行為的控制器,你可以在控制器中放置一個 __invoke
方法:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Models\User; class ShowProfile extends Controller { /** * 顯示指定用戶的簡介 * * @param int $id * @return \Illuminate\View\View */ public function __invoke($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
當注冊單個行為控制器的路由時不需要指名方法:
use App\Http\Controllers\ShowProfile; Route::get('user/{id}', ShowProfile::class);
你可以通過 Artisan 命令工具里的 make:controller
命令中的 --invokable
選項來生成一個可調用的控制器
php artisan make:controller ShowProfile --invokable
技巧:可以使用 stub 定制 自定義控制器模板
控制器中間件
中間件 可以在路由文件中分配給控制器的路由:
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
然而,在控制器的構造函數(shù)中指定中間件更為方便。使用控制器構造函數(shù)中的 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); });
技巧:你可以將中間件分配給控制器操作的一個子集。然而,它可能表明你的控制器正在變得復雜。建議你將控制器拆分為多個較小的控制器。
資源型控制器
Laravel 的資源路由通過單行代碼即可將典型的「CURD (增刪改查)」路由分配給控制器。例如,你希望創(chuàng)建一個控制器來處理保存 “照片” 應用的所有 HTTP 請求。使用 Artisan 命令 make:controller
可以快速創(chuàng)建這樣一個控制器:
php artisan make:controller PhotoController --resource
這個命令將會生成一個控制器 app/Http/Controllers/PhotoController.php
。 其中包括每個可用資源操作的方法。
接下來,你可以給控制器注冊一個資源路由:
Route::resource('photos', PhotoController::class);
這個單一的路由聲明創(chuàng)建了多個路由來處理資源上的各種行為。生成的控制器為每個行為保留了方法,包括了關于處理 HTTP 動詞和 URLs 的聲明注釋。
你可以通過將數(shù)組傳參到 resources
Route::resources([ 'photos' => PhotoController::class, 'posts' => PostController::class, ]);??? ?? ???? ??? ???? ??? ??? ? ????.
php artisan make:controller PhotoController --resource --model=Photo??? ??? ??? URI? ????
UserController
????? show
???? ?????. ?? ????? ? ???? ?????. ?: ????? ?? ????? ???? ? ??????? ????. ????? ?? ????? ???? ???
????
, ??? ??
, ????
? ?? ?? ?? ??? ??? ? ????. ??> ???. ?????????? ?? ?????????????? ??? ???? ????? ????? ????? __invoke
???? ???? ???. ??Route::resource('photos', PhotoController::class)->only([ 'index', 'show' ]); Route::resource('photos', PhotoController::class)->except([ 'create', 'store', 'update', 'destroy' ]);???? ??? ??? ? ?? ????? ???? ? ???? ??? ??? ????. ??
Route::apiResource('photos', PhotoController::class);?????
make:controller
???? --invokable
??? ?? ?? ??? ???? ??? ? ????. Artisan ?? ?? ???? ??Route::apiResources([ 'photos' => PhotoController::class, 'posts' => PostController::class, ]);???? ?: ?? ??? ??? ???? ???? ???? ??? ??? ? ???????????? ???? ??? ??????????? ?? ??? ???? ??? ??? ? ????: ??
php artisan make:controller API/PhotoController --api?? ??? ??????? ????? ????? ???? ?? ? ?????. ???? ????
middleware
???? ???? ????? ????? ?? ??? ? ????. ????? ?? ????? ????? ????? ??? ?? ????. ??Route::resource('photos.comments', PhotoCommentController::class);?? ??? ??????? ???? ???? ????? ??? ?? ????. ?? ?? ???? ???? ???? ?? ?? ????? ?? ????? ???? ??? ??? ?????. ??
/photos/{photo}/comments/{comment}???? ?: ???? ??? ?? ??? ????? ??? ? ????. ??? ?? ????? ????? ??? ??? ? ????. ????? ?? ?? ?? ????? ???? ?? ????. ????????Resource Controller????????Laravel? ??? ???? ? ?? ??? ???? ???? "CURD(??, ??, ??)" ??? ????? ??? ? ????. ?? ??, Save Photos ?? ?? ?? HTTP ??? ???? ????? ????? ???. Artisan ???
make:controller
? ???? ??? ????? ??? ?????. ??Route::resource('photos.comments', PhotoCommentController::class)->scoped([ 'comment' => 'slug', ]);??? ???? ????
app/Http/Controllers/PhotoController.php
? ?????. ???? ?? ??? ? ??? ??? ?? ???? ?????. ???????? ????? ??? ??? ??? ? ????. ??/photos/{photo}/comments/{comment:slug}??? ?? ?? ??? ???? ??? ??? ???? ?? ?? ??? ?????. ??? ????? HTTP ?? ? URL? ???? ?? ??? ??? ???? ? ??? ?? ???? ?????. ?????? ?????
resources
???? ???? ? ?? ?? ??? ????? ??? ? ????. ??Route::resource('photos.comments', CommentController::class)->shallow();??????? ???? ?? ????????
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 |
指定資源模型
如果你使用了路由模型綁定,并且想在資源控制器的方法中使用類型提示,你可以在生成控制器的時候使用 --model
選項:
php artisan make:controller PhotoController --resource --model=Photo
部分資源路由
當聲明資源路由時,你可以指定控制器處理的部分行為,而不是所有默認的行為:
Route::resource('photos', PhotoController::class)->only([ 'index', 'show' ]); Route::resource('photos', PhotoController::class)->except([ 'create', 'store', 'update', 'destroy' ]);
API 資源路由
當聲明用于 APIs 的資源路由時,通常需要排除顯示 HTML 模板的路由(如 create
和 edit
)。為了方便起見,你可以使用 apiResource
方法自動排除這兩個路由:
Route::apiResource('photos', PhotoController::class);
你也可以傳遞一個數(shù)組給 apiResources
方法來同時注冊多個 API 資源控制器:
Route::apiResources([ 'photos' => PhotoController::class, 'posts' => PostController::class, ]);
要快速生成不包含 create
或 edit
方法的用于開發(fā)接口的資源控制器,請在執(zhí)行 make:controller 命令時使用 --api
參數(shù):
php artisan make:controller API/PhotoController --api
嵌套資源
有時可能需要定義一個嵌套的資源型路由。例如,照片資源可能被添加了多個評論。那么可以在路由中使用 “點” 符號來聲明資源型控制器:
Route::resource('photos.comments', PhotoCommentController::class);
該路由會注冊一個嵌套資源,可以使用如下 URI
訪問:
/photos/{photo}/comments/{comment}
限定嵌套資源的范圍
Laravel 的 隱式模型綁定 特性可以自動限定嵌套綁定的范圍,因此已解析的子模型會自動屬于父模型。定義嵌套路由時,使用 scoped
方法,可以開啟自動范圍限定,也可以指定 Laravel 應該按照哪個字段檢索子模型資源
Route::resource('photos.comments', PhotoCommentController::class)->scoped([ 'comment' => 'slug', ]);
這個路由會注冊一個限定范圍的嵌套資源路由,可以像下面這樣來訪問:
/photos/{photo}/comments/{comment:slug}
淺層嵌套
通常,并不完全需要在 URI
中同時擁有父 ID 和子 ID ,因為子 ID 已經(jīng)是唯一的標識符。當使用唯一標識符(如自動遞增的主鍵)來標識 URI
中的模型時,可以選擇使用「淺嵌套」的方式定義路由:
Route::resource('photos.comments', CommentController::class)->shallow();
上面的路由定義方式會定義以下路由:
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 |
命名資源路由
默認情況下,所有的資源控制器行為都有一個路由名稱。你可以傳入 names
數(shù)組來覆蓋這些名稱:
Route::resource('photos', PhotoController::class)->names([ 'create' => 'photos.build' ]);
命名資源路由參數(shù)
默認情況下,Route::resource
會根據(jù)資源名稱的「單數(shù)」形式創(chuàng)建資源路由的路由參數(shù)。你可以在選項數(shù)組中傳入 parameters
參數(shù)來輕松地覆蓋每個資源。parameters
數(shù)組應該是資源名稱和參數(shù)名稱的關聯(lián)數(shù)組:
Route::resource('users', AdminUserController::class)->parameters([ 'users' => 'admin_user' ]);
上例將會為資源的 show
路由生成如下的 URI :
/users/{admin_user}
限定范圍的資源路由
有時,在定義資源路由時隱式綁定了多個 Eloquent 模型,你希望限定第二個 Eloquent 模型必須為第一個 Eloquent 模型的子模型。例如,考慮這樣一個場景,通過 slug 檢索某個特殊用戶的一篇文章:
use App\Http\Controllers\PostsController;Route::resource('users.posts', PostsController::class)->scoped();
你可以通過給 scoped
方法傳遞一個數(shù)組來覆蓋默認的模型路由鍵:
use App\Http\Controllers\PostsController;Route::resource('users.posts', PostsController::class)->scoped([ 'post' => 'slug', ]);
當使用一個自定義鍵的隱式綁定作為嵌套路由參數(shù)時,Laravel 會自動限定查詢范圍,按照約定的命名方式去父類中查找關聯(lián)方法,然后檢索到對應的嵌套模型。在這種情況下,將假定 User
模型有一個叫 posts
(路由參數(shù)名的復數(shù))的關聯(lián)方法,通過這個方法可以檢索到 Post
模型。
本地化資源 URI
默認情況下,Route::resource
將會用英文動詞創(chuàng)建資源 URI。如果需要自定義 create
和 edit
行為的動作名,可以在 AppServiceProvider
的 boot
中使用 Route::resourceVerbs
方法實現(xiàn):
use Illuminate\Support\Facades\Route; /** * 引導任何應用服務。 * * @return void */ public function boot() { Route::resourceVerbs([ 'create' => 'crear', 'edit' => 'editar', ]); }
動作被自定義后,像 Route::resource('fotos', 'PhotoController')
這樣注冊的資源路由將會產(chǎn)生如下的 URI:
/fotos/crear /fotos/{foto}/editar
補充資源控制器
如果您需要增加額外的路由到默認的資源路由之中,您需要在 Route::resource
前定義它們;否則, resource
方法定義的路由可能會無意間優(yōu)先于您定義的路由:
Route::get('photos/popular', [PhotoController::class, 'popular']); Route::resource('photos', PhotoController::class);
技巧:記得保持您的控制器的專一性。如果您需要典型的資源操作以外的方法,請考慮將您的控制器分割為兩個更小的控制器。
依賴注入 & 控制器
構造注入
Laravel 服務容器 被用于解析所有的 Laravel 控制器。因此,您可以在控制器的構造函數(shù)中使用類型提示需要的依賴項。聲明的解析會自動解析并注入到控制器實例中去:
<?php namespace App\Http\Controllers; use App\Repositories\UserRepository; class UserController extends Controller { /** * 用戶 repository 實例。 */ protected $users; /** * 創(chuàng)建一個新的控制器實例。 * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { $this->users = $users; } }
您亦可類型提示 Laravel 契約 ,只要它能夠被解析。取決于您的應用,注入依賴到控制器可能會提供更好的可測試性。
方法注入
除了構造器注入以外,您亦可在控制器方法中類型提示依賴。最常見的用法便是注入 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; // } }
如果您的控制器方法要從路由參數(shù)中獲取輸入內容,請在您的依賴項之后列出您的路由參數(shù)。例如,您可以像下方這樣定義路由:
Route::put('user/{id}', [UserController::class, 'update']);
如下所示,您依然可以類型提示 Illuminate\Http\Request
并通過定義您的控制器方法訪問 id
參數(shù):
<?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) { // } }
路由緩存
如果您的應用僅使用了基于路由的控制器,您應該充分利用 Laravel 路由緩存。使用路由緩存將會大幅降低您的應用路由的注冊時間。有時,您的路由注冊的速度可能會提高 100 倍。要生成路由緩存,僅需執(zhí)行 route:cache
Artisan 命令:
php artisan route:cache
在運行該命令后,每次請求將會加載您緩存的路由文件。請記住,您每次添加新路由后均需要生成新的路由緩存。因此,您應該在項目部署時才運行 route:cache
命令。
您亦可使用 route:clear
來清除路由緩存:
php artisan route:clear
【相關推薦:laravel視頻教程】
? ??? ??? ??????? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)

N 1 ?? ??? ??? ?? ???? ?????? ?????? ?? ?? ????. 2. ???? ???? ???? ?? ??? ???????? ??? ??? ?? ? ??????. 3. ??? 2 ? ?? ?? Redis ?? ??? ?? ??? ?? ?? ??? ????? ??????. 4. ??? ????? ????? ????? Clear ()? ???? ???? ?????? ??? ????? ?????. 5. ?????? ??? ????? ???? ???? ? ??? ??? ?? ?? ? SQL ?? ??????. 6. ?? ??? ???? ?? ?????? ?? ?? ??? ?????? ?? ?? ?? ??? ???? ??? ??????. ORM? ???? ????? ?? ??? ????? ?? ???? ??? ???? ?? SQL ????, ??, ?? ?? ? ??? ???? ???????.

settings.json ??? ??? ?? ?? ?? ?? ?? ??? ??? VSCODE ??? ??? ???? ? ?????. 1. ??? ?? ?? : Windows? C : \ Users \\ AppData \ Roaming \ Code \ User \ Settings.json, MacOS IS /users//library/applicationsupport/code/user/settings.json, linux? /home//.config/code/user/settings.json; 2. Workspace ?? ?? : .vscode/settings project root ????

readOnlyPropertiesInphp8.2CanonlyBeassignedOnedOneDonceIntheConstructorAratDeclarationandCannotBemodififificificificifified

??, ??, ?? ?? ? ?? ??? ???? ?? ??? ?? ? ?? ???? ?????. 2. ?? ???? ???? ?? ??? ??? SONGSTOMONY ? HASMANY ?? ??; 3. ?? ? ? ?? ? ?? ??? ????? (?? ???? ?? ??? ? ??). 4. ?? ? ?? ??? ???? ?? ??? ???? ?? ? ?? ??? ???? ?? ??? ?????. 5. ?? ???? ??? ?? (?? ??)? ???? ?? ????? ??????. 6. ?? ??? ?? ??? ???? Laravel Signature URL? ???? ??? ??????. 7. ? ?? ?? ? ? ?? ??? ?? ?? ??? ?? ??? ?????. ?????? ??, ?? ?? ??? ??????????.

?? JavaScript? ???? ??? ??? ?? ??? ??? ??? ?? ??? ?? ??? ??? ???????. 1. HTML ???? ?? ???? ????? ??? ???? ????. 2. CSS ?? : ??? ?? ?? ??? ???? ?? ??, .dark-mode ???? ??? ?? ??? ???? var ()? ?? ??? ??? ?????. 3. JavaScript? ??? ???? ?? ???? ?? ??? ???? ?? LocalStorage? ????. 4. ??? ?? ? ? HTML ???? Dark-Mode ???? ???? ?? ??? LocalStorage? ?????. 5. ?? ?? ?? ??? 0.3 ? ?? ?????? ???? ???? ??????.

?? ?? ??? ???? ?? ??? ?? ?? ? ??? ???? VisualVM ?? JProfiler? ???? ?? ???? Async-Profiler? ?? ??? ?????. 2. ?? ??? ???, ??? ?????, StringBuilder? ???? ??? ? ??? ?? ????, ??? GC ??? ??????. 3. ??? ?? ?? ??? ????? ?? ??? ???? ?? ?????. 4. ??? ???, ?? ???? ????, ?? ???? ???, ??? ?? ????? ??????. 5. JVM ?? ?? ??, ???? ? ?? ? ?? ??? ???? ???? GC ??? ??????. 6. ?? ???? ??? ???, ?? ???? ?? ???? ???, ???? ?????, ?? ? ??? ??????. 7. JMH? ?? ? ???? ?? ??? ? ????

??? Laravel ????? ??? ???? ??????. 2. ??, ?????? ? ????? ???? ??????? ??????. 3. Routes/API.php?? RESTFUL ??? ?????. 4. PostController?? ??, ??, ?? ? ?? ???? ???? JSON ??? ?????. 5. Postman ?? Curl? ???? API ??? ???????. 6. ????? ??? ?? API ??? ?????. ????? ?? ??? ??? ??? ??, ???? ?? ??? Laravelrestapi? ????.

Eloquentorm? Laravel? ?? ?? ??? ?? ??????. ?? SQL ?? PHP ??? ?? ??????? ????? ????? ???? ?? ???? ????. 1. ? ??? ???? ?? ???? ???? ? ???? ?? ????? ?????. 2. ?? ??? ??? ???? ?? ????? ????? ????? ???? ? ? ????. 3. ?? ?? ??? ???? ??? ???? ?? $ ??? ??? ??? ???????. 4. ???, ???, ?? ?? ?? ??? ?? ??? ???? ??? ??? ?? ?? ???? ??? ? ? ????. 5. ?? ?? ???, Orderby ? ?? ??? ??? ?? ? ? ????. 6. ??? ??? ??? ? ??? ?? ? ??? ??? ? ???? ?????.
