Rumah > Artikel > rangka kerja php > Apakah pengawal laravel
Dalam laravel, pengawal (Pengawal) ialah kelas yang digunakan untuk melaksanakan fungsi tertentu, pengawal boleh menggabungkan logik pemprosesan permintaan yang berkaitan ke dalam kelas yang berasingan. Sesetengah kaedah disimpan dalam pengawal untuk melaksanakan fungsi tertentu Pengawal dipanggil melalui penghalaan, dan fungsi panggil balik tidak lagi digunakan dalam direktori "app/Http/Controllers".
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Laravel 6, komputer DELL G3.
1.
Untuk menggantikan semua logik pemprosesan permintaan yang ditakrifkan dalam bentuk penutupan dalam fail laluan, anda mungkin mahu menggunakan kelas kawalan untuk mengatur tingkah laku ini. Pengawal boleh mengumpulkan logik pemprosesan permintaan berkaitan ke dalam kelas yang berasingan.
Pengawal ialah kelas yang digunakan untuk melaksanakan fungsi tertentu Beberapa kaedah disimpan dalam pengawal untuk melaksanakan fungsi tertentu Pengawal dipanggil melalui penghalaan dan fungsi panggil balik tidak lagi digunakan.
2. Di manakah pengawal itu ditulis?
App/Http/Controllers letakkan pengawal
Controller.php ialah fail kelas induk, pengawal lain boleh mewarisi
3. Bagaimana untuk menamakan fail pengawal?
Nama pengawal bonggol tinggi +Controller.php
Contohnya, AddDataController.php LoginController.php
4 Bagaimana untuk menulis struktur peranti?
Dijana secara automatik melalui arahan artisan, sebagai contoh: Pastikan anda memasukkan dalam direktori akar projek semasa pada baris arahan:
php artisan make:controller TestController
Kod struktur ialah dilengkapkan secara automatik,
namespace App\Http\Controller; use Illuminate\Http\Request; class TestController extends Controller{ // }
Define Controller
Berikut ialah contoh kelas pengawal asas. Perlu diingatkan bahawa pengawal ini mewarisi pengawal asas Laravel
. Kelas pengawal ini menyediakan beberapa kaedah kemudahan, seperti kaedah middleware
, yang menambahkan perisian tengah pada tingkah laku pengawal:
<?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)]); } }
Anda boleh menentukan laluan yang menghala ke tingkah laku pengawal seperti ini:
use App\Http\Controllers\UserController; Route::get('user/{id}', [UserController::class, 'show']);
Apabila permintaan sepadan dengan URI laluan yang ditentukan, kaedah UserController
dalam pengawal show
akan dilaksanakan. Parameter laluan juga akan dihantar kepada kaedah ini.
Petua: Pengawal tidak diperlukan untuk mewarisi daripada kelas asas. Jika pengawal tidak mewarisi daripada kelas asas, anda tidak akan dapat menggunakan beberapa ciri kemudahan, seperti kaedah
middleware
,validate
dandispatch
.
Pengawal Tingkah Laku Tunggal
Jika anda ingin menentukan pengawal yang hanya mengendalikan satu gelagat, anda boleh meletakkan Kaedah __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)]); } }
Tidak perlu menentukan kaedah semasa mendaftarkan laluan pengawal tingkah laku tunggal:
use App\Http\Controllers\ShowProfile; Route::get('user/{id}', ShowProfile::class);
Anda boleh lulus perintah make:controller
dalam alat arahan Artisan. Pilihan --invokable
untuk menjana pengawal boleh panggil
php artisan make:controller ShowProfile --invokable
Petua: Anda boleh menggunakan stub untuk menyesuaikan templat pengawal tersuai
Perisian Tengah Laluan yang boleh diberikan kepada pengawal dalam fail laluan:
Route::get('profile', [UserController::class, 'show'])->middleware('auth');
Walau bagaimanapun, dalam kawalan Ia lebih mudah untuk menentukan perisian tengah dalam pembina pembina. Middleware boleh diperuntukkan dengan mudah kepada pengawal menggunakan kaedah middleware
dalam pembina pengawal. Anda juga boleh mengehadkan perisian tengah untuk hanya berkuat kuasa pada kaedah tertentu dalam pengawal:
class UserController extends Controller { /** * 实例化一个新的控制器实例 * * @return void */ public function __construct() { $this->middleware('auth'); $this->middleware('log')->only('index'); $this->middleware('subscribed')->except('store'); } }
Pada masa yang sama, pengawal juga membenarkan anda mendaftar perisian tengah menggunakan penutupan. Ini menyediakan cara yang mudah untuk mentakrifkan middleware untuk satu pengawal tanpa mentakrifkan keseluruhan kelas middleware:
$this->middleware(function ($request, $next) { // ... return $next($request); });
Petua: Anda boleh menetapkan middleware kepada tindakan pengawal subset . Walau bagaimanapun, ini mungkin tanda bahawa pengawal anda menjadi rumit. Anda disyorkan agar memisahkan pengawal kepada beberapa pengawal yang lebih kecil.
Penghalaan sumber Laravel boleh memperuntukkan laluan "CURD (Buat, Padam, Ubah Suai, Semak)" biasa melalui satu baris kod kepada pengawal. Contohnya, anda ingin mencipta pengawal yang mengendalikan semua permintaan HTTP untuk apl Simpan Foto. Anda boleh mencipta pengawal sedemikian dengan cepat menggunakan perintah Artisan make:controller
:
php artisan make:controller PhotoController --resource
Arahan ini akan menjana pengawal app/Http/Controllers/PhotoController.php
. Ini termasuk kaedah untuk setiap operasi sumber yang tersedia.
Seterusnya, anda boleh mendaftarkan laluan sumber dengan pengawal:
Route::resource('photos', PhotoController::class);
Pengisytiharan laluan tunggal ini mencipta berbilang laluan untuk mengendalikan pelbagai gelagat pada sumber. Pengawal yang dijana mengekalkan kaedah untuk setiap tindakan, termasuk anotasi deklaratif untuk mengendalikan kata kerja HTTP dan URL.
Anda boleh mencipta berbilang pengawal sumber serentak dengan menghantar parameter tatasusunan ke dalam kaedah resources
:
Route::resources([ 'photos' => PhotoController::class, 'posts' => PostController::class, ]);
Pemprosesan Operasi Pengawal Sumber
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);
你也可以传递一个数组给 apiResources
方法来同时注册多个 API 资源控制器:
Route::apiResources([ 'photos' => PhotoController::class, 'posts' => PostController::class, ]);
要快速生成不包含 create
或 edit
方法的用于开发接口的资源控制器,请在执行 make:controller 命令时使用 --api
参数:
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 已经是唯一的标识符。当使用唯一标识符(如自动递增的主键)来标识 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
数组来覆盖这些名称:
Route::resource('photos', PhotoController::class)->names([ 'create' => 'photos.build' ]);
默认情况下,Route::resource
会根据资源名称的「单数」形式创建资源路由的路由参数。你可以在选项数组中传入 parameters
参数来轻松地覆盖每个资源。parameters
数组应该是资源名称和参数名称的关联数组:
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
方法传递一个数组来覆盖默认的模型路由键:
use App\Http\Controllers\PostsController;Route::resource('users.posts', PostsController::class)->scoped([ 'post' => 'slug', ]);
当使用一个自定义键的隐式绑定作为嵌套路由参数时,Laravel 会自动限定查询范围,按照约定的命名方式去父类中查找关联方法,然后检索到对应的嵌套模型。在这种情况下,将假定 User
模型有一个叫 posts
(路由参数名的复数)的关联方法,通过这个方法可以检索到 Post
模型。
默认情况下,Route::resource
将会用英文动词创建资源 URI。如果需要自定义 create
和 edit
行为的动作名,可以在 AppServiceProvider
的 boot
中使用 Route::resourceVerbs
方法实现:
use Illuminate\Support\Facades\Route; /** * 引导任何应用服务。 * * @return void */ public function boot() { Route::resourceVerbs([ 'create' => 'crear', 'edit' => 'editar', ]); }
动作被自定义后,像 Route::resource('fotos', 'PhotoController')
这样注册的资源路由将会产生如下的 URI:
/fotos/crear /fotos/{foto}/editar
如果您需要增加额外的路由到默认的资源路由之中,您需要在 Route::resource
前定义它们;否则, resource
方法定义的路由可能会无意间优先于您定义的路由:
Route::get('photos/popular', [PhotoController::class, 'popular']); Route::resource('photos', PhotoController::class);
技巧:记得保持您的控制器的专一性。如果您需要典型的资源操作以外的方法,请考虑将您的控制器分割为两个更小的控制器。
构造注入
Laravel 服务容器 被用于解析所有的 Laravel 控制器。因此,您可以在控制器的构造函数中使用类型提示需要的依赖项。声明的解析会自动解析并注入到控制器实例中去:
<?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 契约 ,只要它能够被解析。取决于您的应用,注入依赖到控制器可能会提供更好的可测试性。
方法注入
除了构造器注入以外,您亦可在控制器方法中类型提示依赖。最常见的用法便是注入 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::class, '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) { // } }
如果您的应用仅使用了基于路由的控制器,您应该充分利用 Laravel 路由缓存。使用路由缓存将会大幅降低您的应用路由的注册时间。有时,您的路由注册的速度可能会提高 100 倍。要生成路由缓存,仅需执行 route:cache
Artisan 命令:
php artisan route:cache
在运行该命令后,每次请求将会加载您缓存的路由文件。请记住,您每次添加新路由后均需要生成新的路由缓存。因此,您应该在项目部署时才运行 route:cache
命令。
您亦可使用 route:clear
来清除路由缓存:
php artisan route:clear
【相关推荐:laravel视频教程】
Atas ialah kandungan terperinci Apakah pengawal laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!