pengawal
- Parameter penghalaan sumber bernama
- Supplementary resource controller
- Dependency injection& Controller
- Constructor injection
- Suntikan
- Method
Pengenalan kepada Pengawal
- Pengawal Asas
- Definisi Pengawal Perisian tengah Pengawal
- Parameter Laluan Sumber Dinamakan
- URI sumber tempatan pengenalan
- Untuk menggantikan semua logik pemprosesan permintaan yang ditakrifkan dalam bentuk penutupan dalam fail penghalaan, anda mungkin mahu menggunakan kelas kawalan untuk mengatur tingkah laku ini. Pengawal boleh mengumpulkan logik pemprosesan permintaan berkaitan ke dalam kelas yang berasingan. Pengawal disimpan dalam direktori
app/Http/Controllers
. - Basic Controllers
div ="049056" data-unique="049056">
Define Controller
Berikut ialah contoh kelas pengawal asas. Perlu diingatkan bahawa pengawal ini mewarisi pengawal kelas asas terbina dalam Laravel. Pengawal kelas asas ini menyediakan beberapa kaedah yang mudah, seperti kaedahmiddleware
, yang boleh menambah middleware pada tingkah laku pengawal:<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class UserController extends Controller { /** * 显示给定用户的概要文件. * * @param int $id * @return View */ public function show($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
Anda boleh menentukan laluan yang menghala ke gelagat pengawal seperti ini:
Route::get('user/{id}', 'UserController@show');
Kini, apabila permintaan sepadan dengan URI laluan yang ditentukan, kaedah
show
dalam pengawalUserController
akan dilaksanakan. Parameter laluan juga akan dihantar kepada kaedah ini.app/Http/Controllers
目录中。基础控制器
定义控制器
下面是一个基础控制器类的例子。 需要注意的是,该控制器继承了 Laravel 内置的基类控制器。 该基类控制器提供了一些便利的方法,比如
middleware
方法,该方法可以为控制器行为添加中间件:Route::get('foo', 'Photos\AdminController@method');
你可以这样定义一个指向控制器行为的路由:
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class ShowProfile extends Controller { /** * 展示给定用户的资料. * * @param int $id * @return View */ public function __invoke($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
现在,当一个请求与指定路由的 URI 匹配时,
UserController
控制器中的show
方法就会被执行。路由参数也将会被传递给该方法。{tip} 控制器并 不是强制要求继承基础类 。 但是, 如果控制器没有继承基础类,你将无法使用一些便捷的功能,比如
middleware
,validate
和dispatch
{tip} Pengawal tidak diperlukan untuk mewarisi daripada kelas asas. Walau bagaimanapun, jika pengawal tidak mewarisi daripada kelas asas, anda tidak akan dapat menggunakan beberapa ciri yang mudah, seperti
🎜perisian tengah
,validate
dandispatch< /code> kaedah.
Pengawal & Ruang Nama
Adalah penting untuk menunjukkan bahawa kita tidak perlu menentukan ruang nama pengawal yang lengkap semasa menentukan laluan pengawal. Oleh kerana
RouteServiceProvider
akan memuatkan fail laluan dalam kumpulan laluan yang mengandungi ruang nama, kami hanya perlu menentukan bahagian nama kelas selepas ruang namaAppHttpControllers
.RouteServiceProvider
会在一个包含命名空间的路由组中加载路由文件,我们只需要指定类名中AppHttpControllers
命名空间之后的部分就可以了。如果你选择将控制器放在
AppHttpControllers
更深层次的目录中,需要使用相对于AppHttpControllers
作为根命名空间的指定类名。 因此,如果你完整的控制器类名为AppHttpControllersPhotosAdminController
,你在路由中应当采用如下的形式注册:Route::get('user/{id}', 'ShowProfile');
单个行为控制器
如果你想定义一个只处理单个行为的控制器,你可以在控制器中放置一个
__invoke
方法:php artisan make:controller ShowProfile --invokable
当注册单个行为控制器的路由时,无需指明方法:
Route::get('profile', 'UserController@show')->middleware('auth');
你可以通过 Artisan 命令工具里的
make:controller
命令中的--invokable
选项来生成一个可调用的控制器:class UserController extends Controller{ /** * Instantiate a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); $this->middleware('log')->only('index'); $this->middleware('subscribed')->except('store'); } }
控制器中间件
Middleware 可以在路由文件中分配给控制器的路由。
$this->middleware(function ($request, $next) { // ... return $next($request);});
但是,在控制器的构造函数中指定中间件更为方便。使用控制器构造函数中的
Jika anda memilih untuk meletakkan pengawal dalam direktori yang lebih dalam daripadamiddleware
AppHttpControllers
, anda perlu menggunakan nama kelas tertentu berbandingAppHttpControllers
sebagai ruang nama akar. Oleh itu, jika nama kelas pengawal lengkap anda ialahAppHttpControllersPhotosAdminController
, anda harus mendaftarkannya dalam laluan seperti berikut:php artisan make:controller PhotoController --resource
Pengawal tingkah laku tunggalRoute::resource('photos', 'PhotoController');
Apabila mendaftarkan laluan pengawal tingkah laku tunggal, tidak perlu menyatakan kaedah:Anda boleh lulusRoute::resources([ 'photos' => 'PhotoController', 'posts' => 'PostController' ]);
--invokable< dalam perintah
make:controller
dalam Artisan alat arahan /kod> pilihan untuk menjana pengawal boleh panggil: 🎜php artisan make:controller PhotoController --resource --model=Photo
🎜🎜🎜🎜controller-middleware Middleware
🎜Perisian tengah boleh diberikan kepada laluan pengawal dalam fail laluan. 🎜<form action="/foo/bar" method="POST"> @method('PUT') </form>
🎜 Walau bagaimanapun, adalah lebih mudah untuk menentukan perisian tengah dalam pembina pengawal. Middleware boleh diperuntukkan dengan mudah kepada tindakan pengawal menggunakan kaedahmiddleware
dalam pembina pengawal. Anda juga boleh mengehadkan perisian tengah kepada kaedah tertentu pada kelas pengawal. 🎜Route::resource('photos', 'PhotoController')->only([ 'index', 'show' ]); Route::resource('photos', 'PhotoController')->except([ 'create', 'store', 'update', 'destroy' ]);
🎜Pada masa yang sama, pengawal juga membenarkan anda mendaftar middleware menggunakan penutupan. Ini menyediakan cara yang mudah untuk mentakrifkan perisian tengah untuk satu pengawal tanpa mentakrifkan keseluruhan kelas perisian tengah: 🎜Route::apiResource('photos', 'PhotoController');
🎜🎜{tip} Anda boleh menetapkan perisian tengah kepada subset tindakan pengawal walau bagaimanapun, Ini mungkin menunjukkan bahawa pengawal anda semakin besar. Anda disyorkan agar memisahkan pengawal kepada beberapa pengawal yang lebih kecil. 🎜🎜🎜🎜🎜🎜🎜🎜Resource Controller
Laravel resource routing memberikan laluan biasa "CURD (Create, Delete, Modify, Check)" kepada pengawal dengan satu baris kod. Contohnya, anda ingin mencipta pengawal yang mengendalikan semua permintaan HTTP untuk "foto" yang disimpan oleh apl anda. Menggunakan perintah Artisan
make:controller
, kita boleh mencipta pengawal sedemikian dengan cepat:make:controller
, 我们可以快速创建这样一个控制器:Route::apiResources([ 'photos' => 'PhotoController', 'posts' => 'PostController' ]);
这个命令会生成一个控制器
app/Http/Controllers/PhotoController.php
。 其中包括每个可用资源操作的方法。接下来,你可以给控制器注册一个资源路由:
php artisan make:controller API/PhotoController --api
这个单一的路由声明创建多个路由来处理资源上的各种行为。生成的控制器为每个行为保留了方法,包括了关于处理 HTTP 动词和 URLs 的声明注释。
你可以通过将数组传参到
resources
Route::resource('photos', 'PhotoController')->names([ 'create' => 'photos.build' ]);
Arahan ini akan menjana pengawalapp/Http/Controllers/PhotoController.php
. Ini termasuk kaedah untuk setiap operasi sumber yang tersedia. Seterusnya, anda boleh mendaftarkan laluan sumber kepada pengawal: 🎜Route::resource('users', 'AdminUserController')->parameters([ 'users' => 'admin_user' ]);
🎜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 kepada kaedahsumber: 🎜 /users/{admin_user}
🎜🎜Pengendalian Operasi Pengawal Sumber
- Sumber setempat URIs