contrôleur
Un contrôleur est une fonction php que vous créez, qui peut obtenir des informations sur la requête http et construire et renvoyer une réponse http (en tant qu'objet de réponse Symfony, la réponse peut être une page HTML, un document XML, un tableau JSON sérialisé, des images, des redirections). , erreurs 404 ou tout ce que vous pouvez imaginer. Les contrôleurs contiennent toute la logique dont votre application a besoin pour afficher la page.
Jetez un œil au contrôleur simple Symfony. Le contrôleur suivant affichera bonjour mot
: hello word
:
use Symfony\Component\HttpFoundation\Response; public function helloAction(){ return new Response('Hello world!');}
控制器的目标都是相同的:创建并返回一个Response
对象。在这个过程中,它可能会从请求中读取信息,加载数据库资源,发送邮件,在用户session中设置信息。但是所有情况下,控制器将最终返回 Response
对象给客户端。
没有什么神奇的不用担心还有别的要求!下面是一些常见的例子:
控制器A准备了一个首页上的
Response
对象。-控制器B从请求中读取
{slug}
参数,从数据库中载入一条博文,并创建一个显示该博文的Response
对象。如果{slug}
不能被数据库中检索到,那么控制器将创建并返回一个带404状态码的Response
对象。控制器C处理关于联系人的表单提交。它从请求中读取表单信息,将联系人信息存入数据库并发送包含联系人信息的电子邮件给网站管理员。最后,它创建一个
Response
对象将用户的浏览器重定向到联系人表单的“感谢”页面。
请求、控制器、响应的生命周期 ¶
symfony处理的每一个请求都会有相同的生命周期。框架会负责把很多重复的任务用一个控制器最终执行,控制器执行你自定义的应用代码:
每个请求都被单个前端控制器(如
app.php
生产环境 或app_dev.php
开发环境)文件处理,前端控制器负责引导框架;前端控制器的唯一工作是去初始化Symfony引擎(调用
Kernel
)并传入一个Request
// src/AppBundle/Controller/HelloController.phpnamespace AppBundle\Controller; use Symfony\Component\HttpFoundation\Response; class HelloController{ public function indexAction($name) { return new Response('<html><body>Hello '.$name.'!</body></html>'); }}
Le but du contrôleur est le même : créer et renvoyer un objetRéponse
. Au cours de ce processus, il peut lire les informations de la demande, charger les ressources de la base de données, envoyer des e-mails et définir des informations dans la session utilisateur. Mais dans tous les cas, le contrôleur finira par renvoyer un objetResponse
au client.- Rien de magique, ne vous inquiétez pas des autres exigences ! Voici quelques exemples courants :
- Le contrôleur B lit le paramètre
- Le contrôleur C gère les soumissions de formulaires concernant les contacts. Il lit les informations du formulaire de la demande, stocke les informations de contact dans la base de données et envoie un e-mail contenant les informations de contact à l'administrateur du site Web. Enfin, il crée un objet
Le cycle de vie des requêtes, des contrôleurs et des réponses ¶
Gestions Symfony Chaque demande aura le même cycle de vie. Le framework sera chargé de fusionner de nombreuses tâches répétitives dans un contrôleur qui exécute votre code d'application personnalisé :第2行:Symfony利用php命名空间函数去命名整个控制器类
第4行:Symfony充分利用了PHP5.3的名称空间的功能:
use
关键字导入Response
类,是我们控制器必须返回的;第6行:类名是一个串联的控制器类名称(例如
hello
)加上Controller
关键字。这是一个约定,为控制器提供一致性,并允许它们引用控制器名称(例如hello
)作为路由配置。第8行:在控制器类中的每个action都有着后缀
Action
,并且这个action名(index
)被引用到路由配置文件中。在下一节中,我们将使用路由映射一个URI到该action,并展示如何将路由占位符({name}
)变成action的参数($name
);第10行:控制器创建并返回一个
Response
- Ligne 2 : Symfony utilise la fonction d'espace de noms php pour nommer toute la classe du contrôleur# 🎜🎜 #
- #🎜🎜#Ligne 4 : Symfony utilise pleinement la fonction d'espace de noms de PHP5.3 :
use
importation de mots clésResponse
La classe est ce que notre le contrôleur doit retourner ; #🎜🎜##🎜🎜# - #🎜🎜#Ligne 6 : Le nom de la classe est un nom de classe de contrôleur concaténé (tel que
hello
) Ajoutez leController< /code> mot-clé. Il s'agit d'une convention qui assure la cohérence des contrôleurs et leur permet de référencer le nom du contrôleur (par exemple
hello
) comme configuration de route. #🎜🎜##🎜🎜#- #🎜🎜#Ligne 8 : Chaque action de la classe du contrôleur a le suffixe
Action
et le nom de l'action (index< /code>) est référencé dans le fichier de configuration de routage. Dans la section suivante, nous utiliserons le routage pour mapper un URI à l'action et montrerons comment transformer l'espace réservé de route (
{name}
) en paramètre d'action ($name
>); #🎜🎜##🎜🎜#- #🎜🎜#Ligne 10 : Le contrôleur crée et renvoie un objet
Response
. Notre nouveau contrôleur renvoie une simple page HTML. Pour pouvoir restituer ce contrôleur à un URI spécifié, nous devons créer une route pour celui-ci. Nous discuterons des détails des composants de routage dans le chapitre sur le routage, mais pour l'instant créons une route simple pour notre contrôleur : #🎜🎜##🎜🎜#XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="hello" path="/hello/{name}"> <!-- uses a special syntax to point to the controller - see note below --> <default key="_controller">AppBundle:Hello:index</default> </route></routes>
#🎜🎜#PHP:// app/config/routing.phpuse Symfony\Component\Routing\Route;use Symfony\Component\Routing\RouteCollection; $collection = new RouteCollection();$collection->add('hello', new Route('/hello/{name}', array( // uses a special syntax to point to the controller - see note below '_controller' => 'AppBundle:Hello:index',))); return $collection;
// src/AppBundle/Controller/HelloController.php// ...use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; /** * @Route("/hello/{name}", name="hello") */public function indexAction($name){ // ...}
Annotations:// src/AppBundle/Controller/HelloController.php// ... use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class HelloController{ /** * @Route("/hello/{firstName}/{lastName}", name="hello") */ public function indexAction($firstName, $lastName) { // ... }}
Maintenant, vous arrivez à
/hello/ryan
(par exemple, si vous utilisez le service Web intégréhttp://localhost:8000/hello/ryan code>), puis il exécutera le contrôleur
HelloController::indexAction()
et attribueraryan
à la variable$name
. La création d'une telle page permet une association simple entre le routage et les contrôleurs./hello/ryan
(例如,如果你使用内置的web服务http://localhost:8000/hello/ryan
),那么它就会执行HelloController::indexAction()
控制器,并且将ryan
赋给$name
变量。创建这样一个页面就能够让路由跟控制器做简单的关联。简单吧?
把路由参数传入控制器 ¶
我们现在已经知道路由指向AppBundle中的
HelloController::indexAction()
方法。还有更有趣的就是控制器方法的参数传递:YAML:# app/config/routing.ymlhello: path: /hello/{firstName}/{lastName} defaults: { _controller: AppBundle:Hello:index }
控制器有个参数
$name
,对应所匹配路由的{name}
参数(如果你访问/hello/ryan
, 在本例中是ryan
)。实际上当执行你的控制器时,Symfony在所匹配路由中匹配带参数控制器中的每个参数。所以这个{name}
值被传入到$name
。只需要确保占位符的名称和参数名称一样就行。以下是更有趣的例子,这里的控制器有两个参数:
XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> <route id="hello" path="/hello/{firstName}/{lastName}"> <default key="_controller">AppBundle:Hello:index</default> </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\Route;use Symfony\Component\Routing\RouteCollection; $collection = new RouteCollection();$collection->add('hello', new Route('/hello/{firstName}/{lastName}', array( '_controller' => 'AppBundle:Hello:index',))); return $collection;
public function indexAction($lastName, $firstName){ // ...}
public function indexAction($firstName, $lastName, $foo){ // ...}
将路由参数映射到控制器参数是十分容易和灵活的。在你开发时请遵循以下思路:
1. 控制器参数的顺序无关紧要Symfony可以根据路由参数名匹配控制器方法参数。换句话说,它可以实现
last_name
参数与$last_name
参数的匹配。控制器可以在随意排列参数的情况下正常工作。public function indexAction($firstName, $lastName, $foo = 'bar'){ // ...}
2.控制器所需参数必须匹配路由参数
下面会抛出一个运行时异常(
RuntimeException
),因为在路由定义中没有foo
参数:public function indexAction($firstName){ // ...}
如果参数是可选的,那该多好。下面的例子不会抛出异常:
// src/AppBundle/Controller/HelloController.phpnamespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class HelloController extends Controller{ // ...}
3.不是所有的路由参数都需要在控制器上有响应参数的
如果,举个例子,
Simple, non ?last_name
- #🎜🎜#Ligne 8 : Chaque action de la classe du contrôleur a le suffixe
Response
sur la page d'accueil. -{slug}
de la requête, charge un article de blog à partir de la base de données et crée un objet Response
qui affiche l'article de blog. Si {slug}
ne peut pas être récupéré de la base de données, le contrôleur créera et renverra un objet Response
avec un code d'état 404. Réponse
qui redirige le navigateur de l'utilisateur vers la page « Merci » du formulaire de contact. Chaque requête est gérée par un seul contrôleur frontal (tel que app.php code> environnement de production ou
app_dev.php
environnement de développement), le contrôleur frontal est responsable du démarrage du framework
Kernel< /code>) et transmettez un objet Request
pour le laisser traiter. 🎜🎜🎜🎜Le noyau Symfony demande au routeur de vérifier cette requête ; 🎜🎜🎜🎜Le routeur examine et fait correspondre les informations de la requête et les pointe vers une route spécifique, qui détermine quel contrôleur appeler ; 🎜🎜🎜🎜Contrôleur d'exécution, contrôle ; Le code dans le gestionnaire créera et renverra un objet Response ; les en-têtes 🎜🎜🎜🎜HTTP et le contenu de l'objet Response seront renvoyés au client. 🎜🎜🎜🎜Créer un contrôleur est aussi simple que créer une page, tout en mappant un URI au contrôleur. 🎜🎜🎜🎜Bien que les noms soient similaires, le contrôleur frontal est différent du contrôleur dont nous parlons dans ce chapitre. Le contrôleur frontal est dans votre web/<. Répertoire /code> Un petit fichier PHP, toutes les requêtes passent directement par lui. Une application typique aura un contrôleur frontal pour la production (tel que app.php
) et un contrôleur frontal pour le développement (tel que app_dev.php
). Vous n'avez jamais besoin de modifier, d'afficher ou de vous soucier des contrôleurs frontaux. Les "classes de contrôleurs" de ce chapitre utilisent une méthode pratique pour organiser des "contrôleurs" individuels, également appelés actions, en une seule classe (par exemple, updateAction()
, deleteAction()
, etc.). Par conséquent, un contrôleur est une méthode de la classe contrôleur. Ils contiendront le code que vous avez créé et renverront un objet de réponse Response
. web/
目录中的一个PHP小文件,所有的请求都直接经过它。一个典型的应用程序将有一个用于生产的前端控制器(如app.php
)和一个用于开发的前端控制器(如app_dev.php
)。你可以永远不需要去对前端控制器编辑、查看或者有所担心。本章的“控制器类”用一种方便的方法组织各自的“controllers”,也被称为actions,它们都在一个类里(如,updateAction()
, deleteAction()
, 等)。所以,在控制器类里一个控制器就是一个方法。它们会持有你创建的代码,并返回Response
响应对象。
一个简单的控制器 ¶
虽然一个控制器可以是任何的可被调用的PHP(函数、对象的方法或Closure
),在Symfony,控制器通常是在控制器类中的一个方法,控制器也常被称为action:
Annotations:// src/AppBundle/Controller/HelloController.phpnamespace AppBundle\Controller; use Symfony\Component\HttpFoundation\Response;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class HelloController{
/**
* @Route("/hello/{name}", name="hello")
*/
public function indexAction($name)
{
return new Response('<html><body>Hello '.$name.'!</body></html>');
}}
这里面的控制器是indexAction
方法,它隶属于一个控制器类HelloController
。
这个控制器非常的简单:
Un contrôleur simple ¶# 🎜🎜 #Bien qu'un contrôleur puisse être n'importe quoi appelable en PHP (fonction, méthode objet ou Closure
), dans Symfony, un contrôleur est généralement une méthode dans la classe contrôleur, contrôle Le contrôleur est aussi souvent appelé action : # 🎜🎜#YAML:# app/config/routing.ymlhello:
path: /hello/{name}
# uses a special syntax to point to the controller - see note below
defaults: { _controller: AppBundle:Hello:index }.
Le contrôleur ici est la méthode indexAction
, qui appartient à une classe de contrôleur HelloController
.
Ce contrôleur est très simple :