contrôleur
- Basic Controller
- Define Controller
- Controller et espace de noms
- Contrôleur de comportement
- Route des ressources particulières "Contrôleur de ressources" d paramètres de routage des ressources
- Ressource localisée URIs
- Contrôleur de ressources supplémentaire
- Injection de dépendances et contrôleur
- Injection de constructeur
- Injection de méthode
- Cache de route
Introduction aux contrôleurs
- Contrôleurs de base
- Contrôleurs de définition Middleware de contrôleur Paramètres de l'itinéraire des ressources nommées
- URI avec ressources locales
- Contrôleur de ressources supplémentaire
- Injection de dépendances et contrôleurs
- Cache de route
- Introduction
Afin de remplacer toute la logique de traitement des requêtes définie dans sous la forme de fermetures dans le fichier de routage, vous souhaiterez peut-être utiliser des classes de contrôle pour organiser ces comportements. Les contrôleurs peuvent regrouper la logique de traitement des demandes associée dans une classe distincte. Les contrôleurs sont stockés dans le répertoire - Contrôleurs de base
app/Http/Controllers
.Définir le contrôleur
Ce qui suit est un exemple de classe de contrôleur de base. Il convient de noter que ce contrôleur hérite du contrôleur de classe de base intégré de Laravel. Ce contrôleur de classe de base fournit des méthodes pratiques, telles que la méthodemiddleware
, qui peut ajouter un middleware au comportement du contrôleur :<?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)]); } }
Vous pouvez définir une route pointant vers le comportement du contrôleur comme ceci :Route::get('user/{id}', 'UserController@show');
Désormais, lorsqu'une requête correspond à l'URI de la route spécifiée, la méthode
show
dans le contrôleurUserController
sera exécutée. Les paramètres d'itinéraire seront également transmis à cette méthode.{tip} Les contrôleurs ne sont pas obligés d'hériter des classes de base. Cependant, si le contrôleur n'hérite pas de la classe de base, vous ne pourrez pas utiliser certaines fonctionnalités pratiques, telles que le
middleware
, levalidate
et ledispatch<. /code> méthodes.
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
Contrôleur et espace de noms
Il est important de souligner que nous n'avons pas besoin de spécifier l'espace de noms complet du contrôleur lors de la définition des routes du contrôleur. Étant donné que
RouteServiceProvider
chargera le fichier de route dans un groupe de routes contenant l'espace de noms, nous devons uniquement spécifier la partie du nom de classe après l'espace de nomsAppHttpControllers
.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);});
但是,在控制器的构造函数中指定中间件更为方便。使用控制器构造函数中的
Si vous choisissez de placer le contrôleur dans un répertoire plus profond quemiddleware
AppHttpControllers
, vous devez utiliser un nom de classe spécifique relatif àAppHttpControllers
comme espace de noms racine. Par conséquent, si le nom complet de votre classe de contrôleur estAppHttpControllersPhotosAdminController
, vous devez l'enregistrer dans la route comme suit :php artisan make:controller PhotoController --resource
Contrôleur de comportement uniqueRoute::resource('photos', 'PhotoController');
Lors de l'enregistrement de la route d'un seul contrôleur de comportement, il n'est pas nécessaire de spécifier la méthode :Vous pouvez passer leRoute::resources([ 'photos' => 'PhotoController', 'posts' => 'PostController' ]);
--invokable< dans la commande
make:controller
dans l'Artisan outil de commande /code> option pour générer un contrôleur appelable : 🎜php artisan make:controller PhotoController --resource --model=Photo
🎜🎜🎜🎜controller-middleware Middleware
🎜Le middleware peut être attribué aux routes du contrôleur dans le fichier de routes. 🎜<form action="/foo/bar" method="POST"> @method('PUT') </form>
🎜 Cependant, il est plus pratique de spécifier le middleware dans le constructeur du contrôleur. Le middleware peut être facilement attribué à l'action d'un contrôleur à l'aide de la méthodemiddleware
dans le constructeur du contrôleur. Vous pouvez même restreindre le middleware à certaines méthodes de la classe du contrôleur. 🎜Route::resource('photos', 'PhotoController')->only([ 'index', 'show' ]); Route::resource('photos', 'PhotoController')->except([ 'create', 'store', 'update', 'destroy' ]);
🎜En même temps, le contrôleur vous permet également d'enregistrer un middleware à l'aide d'une fermeture. Cela fournit un moyen pratique de définir un middleware pour un seul contrôleur sans définir la classe entière du middleware : 🎜Route::apiResource('photos', 'PhotoController');
🎜🎜{tip} Vous pouvez cependant attribuer un middleware à un sous-ensemble d'actions de contrôleur, cela peut indiquer que votre contrôleur devient très volumineux ; Il est recommandé de diviser le contrôleur en plusieurs contrôleurs plus petits. 🎜🎜🎜🎜🎜🎜🎜🎜Resource Controller
Le routage des ressources Laravel attribue des itinéraires typiques « CURD (Créer, Supprimer, Modifier, Vérifier) » aux contrôleurs avec une seule ligne de code. Par exemple, vous souhaitez créer un contrôleur qui gère toutes les requêtes HTTP pour les « photos » enregistrées par votre application. En utilisant la commande Artisan
make:controller
, nous pouvons créer rapidement un tel contrôleur :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' ]);
Cette commande générera un contrôleurapp/Http/Controllers/PhotoController.php
. Cela inclut des méthodes pour chaque opération de ressource disponible. Ensuite, vous pouvez enregistrer une route de ressource auprès du contrôleur : 🎜Route::resource('users', 'AdminUserController')->parameters([ 'users' => 'admin_user' ]);
🎜Cette déclaration de route unique crée plusieurs routes pour gérer différents comportements sur la ressource. Le contrôleur généré conserve les méthodes pour chaque action, y compris les annotations déclaratives pour la gestion des verbes HTTP et des URL. 🎜🎜Vous pouvez créer plusieurs contrôleurs de ressources à la fois en passant les paramètres du tableau à la méthoderesources
: 🎜/users/{admin_user}
🎜🎜Gestion des opérations du contrôleur de ressources
Méthode HTTP URI Action Nom de l'itinéraire 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
/photosindex photo s.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}
/photos/{photo}
destroy photos.destroy Spécifier le modèle de ressource
Si vous utilisez la liaison de modèle de route et souhaitez utiliser des indices de type dans les méthodes du contrôleur de ressources, vous pouvez utiliser l'option
--model
lors de la génération du contrôleur :--model
选项:use Illuminate\Support\Facades\Route; /** * 初始化任何应用服务 * * @return void */ public function boot(){ Route::resourceVerbs([ 'create' => 'crear', 'edit' => 'editar', ]); }
伪造表单方法
因为 HTML 表单不能生成
PUT
,PATCH
, 和DELETE
请求,所以你需要一个添加一个隐藏的_method
字段来伪造 HTTP 动作。这个 Blade 指令@method
可以为你创建这个字段:/fotos/crear/fotos/{foto}/editar
部分资源路由
声明资源路由时,你可以指定控制器应该处理的部分行为,而不是所有默认的行为:
Route::get('photos/popular', 'PhotoController@method'); Route::resource('photos', 'PhotoController');
API 资源路由
当声明用于 APIs 的资源路由时,通常需要排除显示 HTML 模板的路由, 如
create
和edit
。 为了方便起见,你可以使用apiResource
方法自动排除这两个路由:<?php namespace App\Http\Controllers; use App\Repositories\UserRepository; class UserController extends Controller{ /** * The user repository instance. */ protected $users; /** * Create a new controller instance. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { $this->users = $users; } }
你可以通过传递一个数组给
apiResources
方法的方式来一次性注册多个 API 资源控制器:<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** * Store a new user. * * @param Request $request * @return Response */ public function store(Request $request) { $name = $request->name; // } }
为了快速生成一个不包含
create
和edit
方法的 API 资源控制器,可以在执行make:controller
命令时加上--api
选项:Route::put('user/{id}', 'UserController@update');
命名资源路由
默认情况下,所有资源控制器操作都有一个路由名称;但是,是可以通过用选项传递一个
names
数组来覆盖这些名称:<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** * Update the given user. * * @param Request $request * @param string $id * @return Response */ public function update(Request $request, $id) { // } }
命名资源路由参数
默认情况下,
Route::resource
会根据资源名称的 「单数」 形式创建资源路由的路由参数。你可以在选项数组中传入parameters
参数来轻松地覆盖每个资源。parameters
数组应当是一个资源名称和参数名称的关联数组:php artisan route:cache
上列将会为资源的
show
php artisan route:clear
Méthode de faux formulaireParce que les formulaires HTML ne peuvent pas générer
rrreee🎜PUT
,PATCH
et < code>DELETE demande, vous devez donc ajouter un champ_method
caché pour simuler l'action HTTP. Cette directive Blade@method
peut créer ce champ pour vous :🎜Routage partiel des ressources
🎜Lors de la déclaration d'une route de ressources, vous pouvez spécifier certains des comportements que le contrôleur doit gérer, au lieu de tous les comportements par défaut : 🎜rrreee🎜🎜Routes de ressources API🎜🎜Lors de la déclaration de routes de ressources pour les API, il est généralement nécessaire d'exclure les routes qui affichent des modèles HTML, tels quecreate
etedit<. /code>. Pour plus de commodité, vous pouvez utiliser la méthode
apiResource
pour exclure automatiquement ces deux routes : 🎜rrreee🎜Vous pouvez enregistrer plusieurs routes à la fois en passant un tableau à la ressource API de la méthodeapiResources
contrôleur : 🎜rrreee🎜Afin de générer rapidement un contrôleur de ressources API qui ne contient pas les méthodescreate
etedit
, vous pouvez exécutermake:controller
Ajoutez l'option--api
lors de la commande : 🎜rrreee🎜🎜🎜🎜Routes de ressources nommées
🎜Par défaut, toutes les actions du contrôleur de ressources ont un nom de route, cependant, ces noms peuvent être remplacés en passant un tableaunames
avec des options :🎜rrreee🎜 🎜🎜🎜Paramètres d'itinéraire de ressources nommées
🎜 Par défaut, < code>Route::resource créera des paramètres de routage pour les itinéraires de ressources basés sur la forme "singulière" du nom de la ressource. Vous pouvez facilement remplacer chaque ressource en passant les paramètresparameters
dans le tableau d'options. Le tableauparameters
doit être un tableau associatif de noms de ressources et de noms de paramètres : 🎜rrreee🎜La liste ci-dessus générera l'URL suivante pour la routeshow
de la ressource : 🎜rrreee🎜🎜 🎜 🎜🎜🎜URI de ressources localisés
Par défaut,
rrreeeRoute::resource
utilisera des verbes anglais pour créer des URI de ressources. Si vous devez localiser les noms des actionscreate
etedit
, vous pouvez utiliserAppServiceProvider
dans le code de la méthodeboot
. Implémentation de la méthode >Route::resourceVerbs.Route::resource
将会使用英文动词来创建资源 URI 。如果你需要本地化create
和edit
行为动作名,你可以在AppServiceProvider
的boot
方法中使用Route::resourceVerbs
方法实现。一旦动作被自定义后,像
rrreeeRoute::resource('fotos', 'PhotoController')
这样注册的资源路由将会产生如下的 URI:补充资源控制器
如果你需要为资源控制器添加默认路由之外的额外路由,你应该调用
rrreeeRoute::resource
;之前定义这些路由;否则,由resource
方法定义的路由可能会无意中优先你补充的路由:{tip} 记住保持控制器的专一性。如果你发现自己经常需要典型资源操作之外的方法,请考虑将控制器拆分为较小的控制器。
依赖注入 & 控制器
构造函数注入
Laravel 服务容器 解析所有的控制器。因此,你可以在控制器的构造函数中使用类型提示可能需要的依赖项。依赖声明会被自动解析并注入到控制器实例:
rrreee当然,你可以输入任何的 Laravel 契约. 只要容器可以解析它。根据你的应用,注入你的类型提示到控制器会提供更好可测试性。
方法注入
处理构造函数注入,你还可以在控制器方法中输入类型提示依赖项。方法注入最常见的用例是在控制器方法中注入
rrreeeIlluminateHttpRequest
的实例:如果你的控制器还需要获取路由参数中的输入,把路由参数放在这些依赖项的后面。例如,你的路由定义像这样:
rrreee你仍然可以输入
Une fois l'action personnalisée, une route de ressource enregistrée commeIlluminateHttpRequest
类型提示,并通过在你的控制器方法中使用下面的定义来访问id
rrreeeRoute::resource('fotos', 'PhotoController')
générera l'URI suivante :Contrôleurs de ressources supplémentaires🎜🎜Si vous devez ajouter des routes supplémentaires au-delà des routes par défaut pour les contrôleurs de ressources, vous devez les définir routes avant d'appelerRoute::resource
; sinon, les routes définies par la méthoderesource
peuvent par inadvertance prendre priorité sur les routes que vous ajoutez : 🎜rrreee🎜{tip} N'oubliez pas de garder votre contrôleur concentré. Si vous avez fréquemment besoin de méthodes en dehors des opérations classiques sur les ressources, envisagez de diviser votre contrôleur en contrôleurs plus petits. 🎜
🎜🎜🎜🎜Injection de dépendances et contrôleurs
< div name="342751" data-unique="342751">🎜Injection de constructeur
🎜Le conteneur de service Laravel résout tous les contrôleurs. Par conséquent, vous pouvez utiliser des indications de type dans le constructeur de votre contrôleur pour les dépendances dont vous pourriez avoir besoin. Les déclarations de dépendances sont automatiquement résolues et injectées dans l'instance du contrôleur : 🎜rrreee🎜 Bien sûr, vous pouvez saisir n'importe quel contrat Laravel tant que le conteneur peut le résoudre. En fonction de votre application, l'injection de vos indices de type dans le contrôleur offrira une meilleure testabilité. 🎜🎜LearnKu.com🎜. 🎜🎜Injection de méthode
🎜Gérer l'injection de constructeur, vous pouvez également taper des indices de dépendances dans les méthodes du contrôleur. Le cas d'utilisation le plus courant de l'injection de méthode consiste à injecter une instance deIlluminateHttpRequest
dans une méthode de contrôleur : 🎜rrreee🎜Si votre contrôleur a également besoin d'obtenir une entrée dans les paramètres de route, placez les paramètres de route dans ces dépendances plus tard. . Par exemple, la définition de votre itinéraire ressemble à ceci : 🎜rrreee🎜 Vous pouvez toujours saisir l'indice de typeIlluminateHttpRequest
et accéder à l'id
en utilisant la définition suivante dans les paramètres de votre méthode de contrôleur : 🎜rrreee🎜🎜🎜🎜🎜🎜Mise en cache des itinéraires
{note} Les itinéraires basés sur la fermeture ne peuvent pas être mis en cache. Utilisez la mise en cache des itinéraires. Vous devez convertir toutes les routes de fermeture en routes de contrôleur.
Si votre application utilise uniquement le routage basé sur le contrôleur, vous devriez alors profiter de la mise en cache des routes. L'utilisation de la mise en cache des routes réduira considérablement le temps requis pour enregistrer toutes les routes d'application. Dans certains cas, l’enregistrement des itinéraires est même 100 fois plus rapide. Pour générer un cache de route, exécutez simplement
rrreeeroute:cache
:route:cache
:运行此命令之后,每个请求都将加载缓存的路由文件。记住,如果你添加了任何的新路由,则需要生成新的路由缓存。因此,你只应在项目部署期间运行
route:cache
命令。你可以使用
Après avoir exécuté cette commande, chaque requête chargera le fichier de route mis en cache. N'oubliez pas que si vous ajoutez de nouveaux itinéraires, vous devrez générer un nouveau cache d'itinéraire. Par conséquent, vous ne devez exécuter la commanderoute:clear
rrreeeroute:cache
que pendant le déploiement du projet. Cet article a été publié pour la première fois sur le site