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处理的每一个请求都会有相同的生命周期。框架会负责把很多重复的任务用一个控制器最终执行,控制器执行你自定义的应用代码:

  1. 每个请求都被单个前端控制器(如app.php生产环境 或app_dev.php开发环境)文件处理,前端控制器负责引导框架;

  2. 前端控制器的唯一工作是去初始化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 objet Ré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 objet Response au client.
  3. Rien de magique, ne vous inquiétez pas des autres exigences ! Voici quelques exemples courants :

      Le contrôleur A prépare un objet Response sur la page d'accueil. -
    • Le contrôleur B lit le paramètre {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.
    • 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 Réponse qui redirige le navigateur de l'utilisateur vers la page « Merci » du formulaire de contact.

    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é :
    1. Chaque requête est gérée par un seul contrôleur frontal (tel que app.php environnement de production ou app_dev.phpenvironnement de développement), le contrôleur frontal est responsable du démarrage du framework

      1466410869_65826_51226_http-xkcd-request.png

      Le seul travail du contrôleur frontal est d'initialiser le moteur Symfony ; (en appelant 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

      这个控制器非常的简单:

      • 第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

      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 :

      • 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és Response 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 le Controller< /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), puis il exécutera le contrôleur HelloController::indexAction() et attribuera ryan à 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:Hello:index控制器语法

        如果你是使用YAML或者XML格式,你给你的控制器使用的一个特定快捷语法被称为逻辑控制器名称,例如AppBundle:Hello:index。更多关于控制器格式的信息,请阅读路由器章节的: 控制器命名模式。

        把路由参数传入控制器 ¶

        我们现在已经知道路由指向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.不是所有的路由参数都需要在控制器上有响应参数的

        如果,举个例子,last_name

        Simple, non ?

        AppBundle : Bonjour : syntaxe du contrôleur d'index
        Si vous utilisez les formats YAML ou XML, une syntaxe de raccourci spécifique que vous utilisez pour votre contrôleur est appelée nom de contrôleur logique, tel que AppBundle:Hello:index. Pour plus d'informations sur les formats de contrôleur, lisez Modèles de dénomination des contrôleurs dans le chapitre Routeur.

        Passez les paramètres de routage dans le contrôleur ¶

        Nous savons maintenant que la route pointe vers HelloController::indexAction()< dans AppBundle /code>méthode. Ce qui est encore plus intéressant, c'est le passage des paramètres de la méthode du contrôleur :
        public function indexAction(){
            return $this->redirectToRoute('homepage');     // redirectToRoute is equivalent to using redirect() and generateUrl() together:
            // return $this->redirect($this->generateUrl('homepage'));}
        #🎜🎜#Le contrôleur a un paramètre $name, qui correspond au {name} correspondant (si vous accédez à /hello/ryan, dans ce cas ryan). En fait, lorsque votre contrôleur est exécuté, Symfony fait correspondre chaque paramètre du contrôleur paramétré dans la route correspondante. Cette valeur {name} est donc transmise à $name. Assurez-vous simplement que le nom de l'espace réservé est le même que le nom du paramètre. #🎜🎜##🎜🎜##🎜🎜# Voici un exemple plus intéressant, où le contrôleur a deux paramètres : #🎜🎜#
        public function indexAction(){
            return $this->redirectToRoute('homepage', array(), 301);}
        public function indexAction(){
            return $this->redirect('http://symfony.com/doc');}
        use Symfony\Component\HttpFoundation\RedirectResponse; 
        public function indexAction()
        {
            return new RedirectResponse($this->generateUrl('homepage'));
            }
        // renders app/Resources/views/hello/index.html.twig
        return $this->render('hello/index.html.twig', array('name' => $name));
        #🎜🎜#Le mappage des paramètres d'itinéraire aux paramètres du contrôleur est très simple et flexible. Veuillez suivre les idées suivantes lorsque vous développez : #🎜🎜##🎜🎜#1. L'ordre des paramètres du contrôleur n'a pas d'importance#🎜🎜#Symfony peut faire correspondre les paramètres de méthode du contrôleur en fonction des noms des paramètres de route. En d'autres termes, il peut faire correspondre le paramètre last_name avec le paramètre $last_name. Le contrôleur peut fonctionner normalement avec n'importe quel arrangement de paramètres. #🎜🎜#
        // renders app/Resources/views/hello/greetings/index.html.twigreturn $this->render('hello/greetings/index.html.twig', array(
            'name' => $name));
        #🎜🎜#2. Les paramètres requis par le contrôleur doivent correspondre aux paramètres de routage#🎜🎜##🎜🎜##🎜🎜#Ce qui suit lèvera une exception d'exécution (< code >RuntimeException
        ) car il n'y a pas de paramètre foo dans la définition de la route : #🎜🎜#
        $templating = $this->get('templating'); 
        $router = $this->get('router'); 
        $mailer = $this->get('mailer');
        #🎜🎜#Ce serait bien si les paramètres étaient facultatifs. L'exemple suivant ne générera pas d'exception : #🎜🎜##🎜🎜#
        $ php bin/console debug:container
        #🎜🎜#3. Tous les paramètres de routage n'ont pas besoin d'avoir des paramètres de réponse sur le contrôleur#🎜🎜# #🎜🎜. ##🎜🎜#Si, par exemple, last_name n'est pas très important pour votre manette, vous pouvez l'ignorer complètement : #🎜🎜#
        public function indexAction(){
            // retrieve the object from database
            $product = ...;
            if (!$product) {
                throw $this->createNotFoundException('The product does not exist');
            }     return $this->render(...);}
        #🎜🎜##🎜🎜 ##🎜🎜## 🎜🎜##🎜🎜#Vous pouvez également transmettre d'autres paramètres de votre routeur aux paramètres de votre contrôleur. Découvrez comment transmettre des informations supplémentaires de l'itinéraire au contrôleur#🎜🎜##🎜🎜#


        Classe de base du contrôleur ¶

        Pour plus de commodité, Symfony fournit une classe de base Controller en option . Si vous en héritez, cela ne change rien au fonctionnement de votre contrôleur, et vous pouvez facilement hériter de certaines méthodes d'assistance et conteneurs de services (voir Accès à d'autres conteneurs, ci-dessous) : vous permettant d'accéder à tout ce qui se trouve dans le système. Objet utile, similaire à un objet tableau. Ces objets utiles sont appelés services, et symfony est livré avec ces objets de service, qui peuvent restituer des modèles, enregistrer des informations de journal, etc. Controller基类。如果你继承它,它不会改变你控制器的任何工作原理,而且你还能够很容易的继承一些帮助方法和服务容器(可看,下面的访问其他容器):允许你在系统中访问每一个有用的对象,类似一个数组对象一样。这些有用的对象被称为服务,并且symfony附带这些服务对象,可以渲染模板,还可以记录日志信息等。

        在顶部使用use语句添加Controller类,然后修改HelloController去继承它。如下所示:

        throw new \Exception('Something went wrong!');

        而无论你是否使用Controller基类,这些帮助方法只是让你可以方便地使用Symfony的核心功能。其实查看核心功能的最好方式就是看Controller类本身。

        如果你想了解没有继承controller基类控制器是如何运作的,可以查看 如何把控制器定义为服务。这是可选的,但它可以让你精确控制的更多的“对象/依赖项",注入到你的控制器。

        生成URL ¶

        generateUrl()能够生成一个URL给路由器的辅助方法。

        重定向 

        如果你想将用户重定向到另一个页面,请使用 redirectToRoute() 方法:

        use Symfony\Component\HttpFoundation\Request;
        public function indexAction($firstName, $lastName, Request $request){
        $page = $request->query->get('page', 1);     // ...}

        默认情况下,redirectToRoute()方法执行302(临时)重定向。如果要执行301(永久)重定向,请修改第2个参数:

        use Symfony\Component\HttpFoundation\Request; public function indexAction(Request $request){
            $session = $request->getSession();     // store an attribute for reuse during a later user request
            $session->set('foo', 'bar');     // get the attribute set by another controller in another request
            $foobar = $session->get('foobar');     // use a default value if the attribute doesn't exist
            $filters = $session->get('filters', array());}

        从定向到外部网站,使用redirect()并传入外部URL:

        use Symfony\Component\HttpFoundation\Request; public function updateAction(Request $request){
            $form = $this->createForm(...);     $form->handleRequest($request);     if ($form->isValid()) {
                // do some sort of processing         $this->addFlash(
                    'notice',
                    'Your changes were saved!'
                );         // $this->addFlash is equivalent to $this->get('session')->getFlashBag()->add         return $this->redirectToRoute(...);
            }     return $this->render(...);}

        更多细节,请参考框架起步之路由

        比创建一个专门从事重定向用户的Response对象来说 redirectToRoute()

        Utilisez l'instruction use en haut pour ajouter la classe Controller, puis modifiez HelloController pour en hériter. Comme indiqué ci-dessous :
        XML:{% for flash_message in app.session.flashBag.get('notice') %}    <div class="flash-notice">
                {{ flash_message }}    </div>{% endfor %}
        Que vous utilisiez ou non la classe de base Controller, ces méthodes d'assistance vous permettent simplement d'utiliser facilement les fonctions principales de Symfony. En fait, la meilleure façon de voir les fonctionnalités de base est de regarder la classe Controller elle-même. #🎜🎜##🎜🎜#
        #🎜🎜#Si vous voulez savoir comment un contrôleur n'hérite pas du contrôleur classe de base Pour voir comment cela fonctionne, voyez comment définir un contrôleur en tant que service. Ceci est facultatif, mais cela vous donne un contrôle précis sur davantage d'"objets/dépendances" qui peuvent être injectés dans votre contrôleur. #🎜🎜##🎜🎜##🎜🎜#

        Generate URL ¶

        #🎜🎜#generateUrl()Méthode auxiliaire qui peut générer une URL vers le routeur. #🎜🎜#

        Redirection

        #🎜🎜#Si vous souhaitez rediriger l'utilisateur vers un autre Pour une page, veuillez utiliser la méthode redirectToRoute() : #🎜🎜#
        PHP:<?php foreach ($view['session']->getFlash('notice') as $message): ?>
            <div class="flash-notice">        <?php echo "<div class='flash-error'>$message</div>" ?>
            </div><?php endforeach ?>
        #🎜🎜#Par défaut, la méthode redirectToRoute() effectue une redirection 302 (temporaire). Si vous souhaitez effectuer une redirection 301 (permanente), merci de modifier le 2ème paramètre : #🎜🎜##🎜🎜#
        use Symfony\Component\HttpFoundation\Request; public function indexAction(Request $request){
            $request->isXmlHttpRequest(); // is it an Ajax request?     $request->getPreferredLanguage(array('en', 'fr'));     // retrieve GET and POST variables respectively
            $request->query->get('page');
            $request->request->get('page');     // retrieve SERVER variables
            $request->server->get('HTTP_HOST');     // retrieves an instance of UploadedFile identified by foo
            $request->files->get('foo');     // retrieve a COOKIE value
            $request->cookies->get('PHPSESSID');     // retrieve an HTTP request header, with normalized, lowercase keys
            $request->headers->get('host');
            $request->headers->get('content_type');}
        #🎜🎜# De la redirection vers un site externe, utilisez redirect() et transmettre l'URL externe : #🎜🎜#
        use Symfony\Component\HttpFoundation\Response; 
        // create a simple Response with a 200 status code (the default)$response = new Response('Hello '.$name, Response::HTTP_OK); 
        // create a CSS-response with a 200 status code
        $response = new Response('<style> ... </style>');
        $response->headers->set('Content-Type', 'text/css');
        #🎜🎜#Pour plus de détails, veuillez vous référer au routage du framework. #🎜🎜##🎜🎜#
        #🎜🎜# Ensuite, créez une Réponse spécialisée dans la redirection des utilisateurs < /code>Pour les objets, la méthode redirectToRoute() est un simple raccourci, qui équivaut à : #🎜🎜#
        // ...public function indexAction(){
        // returns '{"username":"jane.doe"}' and sets the proper Content-Type header
        return $this->json(array('username' => 'jane.doe'));    
        // the shortcut defines three optional arguments
        // return $this->json($data, $status = 200, $headers = array(), $context = array());}
        #🎜🎜##🎜🎜#

        Modèle de rendu

        Si vous utilisez HTML, vous devriez vouloir rendre un modèle. La méthode render() peut être utilisée pour restituer le modèle et placer le contenu de sortie dans votre objet Response : render()方法可以用来渲染模板并可以把输出的内容放到你的Response 对象:

        rrreee

        模板也可以防止在更深层次的子目录。但应该避免创建不必要的深层结构:

        rrreee

        模板可以在任何格式的文件中以一种通用的方式去渲染内容。虽然在大多数情况下,你使用模板来渲染HTML内容,模板也可以很容易地生成JavaScript,CSS,XML或者你能想到的任何其他格式。要了解如何使不同的模板格式,参考创建并使用模板中的“模板格式”。

        模板的命名模式

        你也可以把模板放在一个bundle的Resources/views目录下并引用它们的特殊快捷语法,例如@App/Hello/index.html.twig 或者 @App/layout.html.twig。这些将分别存放在bundle的Resources/views/Hello/index.html.twigResources/views/layout.html.twigrrreee

        Le modèle peut également empêcher Sous-répertoires plus profonds. Mais vous devez éviter de créer des structures profondes inutiles :
        rrreee
        Les modèles peuvent restituer le contenu de manière universelle dans n'importe quel format de fichier. Bien que dans la plupart des cas vous utilisiez des modèles pour afficher du contenu HTML, les modèles peuvent également facilement générer du JavaScript, du CSS, du XML ou tout autre format auquel vous pouvez penser. Pour savoir comment formater différents modèles, consultez « Formatage des modèles » dans Création et utilisation de modèles.
        #🎜🎜#
        #🎜🎜#Modèle de dénomination du modèle#🎜 🎜 ##🎜🎜#Vous pouvez également placer les modèles dans le répertoire Resources/views d'un bundle et référencer leur syntaxe de raccourci spéciale, telle que @App/Hello/index.html.twig < /code> ou @App/layout.html.twig. Ceux-ci seront stockés dans les Resources/views/Hello/index.html.twig et Resources/views/layout.html.twig#🎜🎜##🎜🎜# du bundle. #🎜🎜#

        Accéder à d'autres services

        Symfony a intégré de nombreux objets utiles dans les services. Ces services sont utilisés pour afficher des modèles, envoyer des e-mails, interroger des bases de données et tout autre « travail » auquel vous pouvez penser. Lorsque vous installez un nouveau pack, il peut également apporter davantage de services.

        Après avoir hérité de la classe de base controller, vous pouvez passer get()controller基类后,你可以通过get()方法访问任何Symfony的服务。下面列举了一些常见服务:

        rrreee

        到底存在哪些服务?我想要看所有的服务,请使用debug:container命令行查看:

        rrreee

        更多信息请看 服务容器

        管理错误和404页面 ¶

        如果有些动作没找到,将返回一个404响应。为此,你需要抛出一个异常。如果你继承了基础的Controller类,你可以执行以下操作:

        rrreee

        createNotFoundException() 方法创建了一个特殊的NotFoundHttpException对象,来触发symfony内部的http的404响应。

        当然,你也可以自由地抛出你控制器中的任何Exception类,Symfony将自动返回HTTP响应代码500。

        rrreee

        在每个示例中,一个带格式的错误页被显示给最终用户,而一个全是错误的调试页会被显示给开发者(当在调试模式app_dev.php查看该页时 - 可查看 配置Symfony(和环境))。

        这些错误页都是可以自定义的。要想知道更多请阅读“如何自定义错误页”。

        Request对象作为一个控制器参数 ¶

        如果你需要获取查询参数,抓取请求头或者获得一个上传文件?这些信息都存储在Symfony的Request对象。在你的控制器里获取它们,只需要添加Request对象作为一个参数并强制类型为Request类:

        rrreee

        管理Session 

        Symfony提供了一个好用的Session对象,它能够存储有关用户的信息(它可以是使用浏览器的人、bot或Web服务)之间的请求。默认情况下,Symfony通过使用PHP的原生Session来保存cookie中的属性。

        去获取这个session,需要调用Request 对象的getSession()方法。这个方法会返回一个SessionInterface accède à n'importe quel service Symfony. Voici quelques services courants :

        rrreee

        Quels services existent ? Je veux voir tous les services, veuillez utiliser la ligne de commande debug:container pour afficher :
        rrreee

        Pour plus d'informations, veuillez consulter le conteneur de services🎜

        Gérer les erreurs et la page 404 ¶

        🎜Si certaines actions ne sont pas trouvées et une réponse 404 sera renvoyée. Pour ce faire, vous devez lever une exception. Si vous héritez de la classe de base Controller, vous pouvez effectuer les opérations suivantes : 🎜rrreee🎜 La méthode createNotFoundException() crée une Objet NotFoundHttpException pour déclencher la réponse 404 de http dans symfony. 🎜🎜🎜 Bien sûr, vous êtes également libre de lancer n'importe quelle classe Exception dans votre contrôleur, et Symfony renverra automatiquement le code de réponse HTTP 500. 🎜rrreee🎜Dans chaque exemple, une page d'erreur formatée est affichée à l'utilisateur final, tandis qu'une page de débogage pleine d'erreurs est affichée au développeur (en mode débogage app_dev.php Lors de la visualisation de cette page - vous pouvez visualiser la configuration de Symfony (et de l'environnement)). 🎜🎜🎜Ces pages d'erreur sont toutes personnalisables. Pour en savoir plus, lisez « Comment personnaliser les pages d'erreur ». 🎜

        Objet de requête en tant que paramètre du contrôleur ¶

        🎜Que faire si vous avez besoin d'obtenir des paramètres de requête, de récupérer des en-têtes de requête ou d'obtenir un fichier téléchargé ? Ces informations sont stockées dans l'objet Request de Symfony. Pour les obtenir dans votre contrôleur, ajoutez simplement l'objet Request en paramètre et forcez le type à la classe Request : 🎜rrreee🎜Manage Session ¶🎜🎜🎜🎜Symfony fournit un objet Session utile qui peut stocker des informations sur l'utilisateur (il peut s'agir d'une personne utilisant le navigateur, d'un robot ou d'un service Web) sur demande de temps . Par défaut, Symfony enregistre les attributs dans les cookies en utilisant la session native de PHP. 🎜🎜Pour obtenir cette session, vous devez appeler la méthode getSession() de l'objet Request. Cette méthode renverra une SessionInterface, qui utilise la méthode la plus simple pour stocker et récupérer les données de session : 🎜rrreee🎜Ces attributs seront conservés pendant la période de validité de la session de l'utilisateur. 🎜🎜

        Message Flash

        Vous pouvez également stocker certains messages spécifiés dans la session utilisateur. Ce message est appelé "message flash". En règle générale, les messages flash ne peuvent être utilisés qu'une seule fois : ils disparaissent automatiquement lorsque vous les récupérez. Cette propriété rend les messages « flash » particulièrement adaptés au stockage des notifications des utilisateurs.

        Regardons notre exemple de gestion de la soumission d'un formulaire :

        rrreee

        Après avoir traité la demande, le contrôleur définit un message flash appelé avis, puis redirige. Le nom (notice) n'est pas important - c'est un identifiant qui identifie le message.
        notice)并不重要 – 它就是一个确定消息的识别符。

        接下来是模板(或者是更好的,在你的基础布局模板),从session中读取每一条信息:

        rrreeerrreee

        通常使用的noticewarningerror作为不同类型提示信息的键,但是你可以使用任何你需要的键。

        你可以使用peek()方法来获取消息,它可以让消息保存住.

        请求和响应对象 ¶

        正如前面所提到的,框架的Request 对象会作为控制器的参数传入并强制指定数据类型为Request 类:

        rrreee

        这个Request类有一些公共的属性和方法,它们能够返回任何你需要的请求信息。

        Request一样,Response对象也有一个公共的headers属性。它是一个ResponseHeaderBag它有一些不错的方法来getting和setting响应头。头名称的规范化使得 Content-Type等于content-type甚至等于content_type,它们都是相同的。

        对于控制器,唯一的要求就是返回一个Response对象。Response类是一个PHP对于HTTP响应的一个抽象,一个基于文本的消息填充HTTP头,其内容发返客户端:

        rrreee

        也有一些特殊的类能够简化某种响应:

        • 对于JSON:这是一个JosnResponse。可查看 创建一个JOSN响应。

        • 对于文件操作:这是 BinaryFileResponse。可查看 Serving Files。

        • 对于流响应,有StreamedResponse。请看:流化一个响应

        JSON Helper 

        3.1json()

        Vient ensuite le modèle (ou mieux encore, un modèle dans votre mise en page de base) qui lit chaque élément d'information de la session :
        rrreeerrreee🎜avis, avertissement habituellement utilisés. et error sont utilisés comme clés pour différents types de messages d'invite, mais vous pouvez utiliser n'importe quelle clé dont vous avez besoin. 🎜
        🎜Vous pouvez utiliser la méthode peek() pour obtenir le message, il permet de sauvegarder le message. 🎜🎜🎜

        Objets de requête et de réponse ¶

        🎜Comme mentionné précédemment, l'objet Request du framework est transmis en tant que paramètre du contrôleur. et Forcer le type de données spécifié à être la classe Request : 🎜rrreee🎜Cette classe Request possède des propriétés et des méthodes publiques, qui peuvent renvoyer toutes les informations de requête dont vous avez besoin.
        🎜🎜Comme Request, l'objet Response possède également une propriété publique headers. Il s'agit d'un ResponseHeaderBag🎜Il propose des méthodes intéressantes pour obtenir et définir les en-têtes de réponse. Les noms d'en-tête sont normalisés de sorte que Content-Type soit égal à content-type ou même égal à content_type, qui sont tous identiques. 🎜🎜Pour le contrôleur, la seule exigence est de renvoyer un objet Response. La classe Response est une abstraction PHP pour les réponses HTTP. Un message texte remplit l'en-tête HTTP et son contenu est renvoyé au client : 🎜rrreee🎜 Il existe également des classes spéciales qui peuvent simplifier certaines réponses : 🎜
        • 🎜 Pour JSON : il s'agit d'une JosnResponse. Visible Créez une réponse JOSN. 🎜
        • 🎜Pour les opérations sur les fichiers : il s'agit de BinaryFileResponse. Les fichiers de service peuvent être consultés. 🎜
        • 🎜Pour les réponses en streaming, il existe StreamedResponse. Voir : Diffuser une réponse🎜
        🎜JSON Helper
        ¶🎜🎜
        🎜 3.1json() a été introduit à partir de symfony3.1. 🎜🎜

        Le retour des types JSON est de plus en plus populaire dans les applications basées sur des API. Pour cette raison, la classe de base du contrôleur définit la méthode json(), qui crée une JsonResponse et encode automatiquement le contenu donné : json()方法,来创建一个JsonResponse 并自动编码给定的内容:

        rrreee

        如果Serializer服务在你的应用程序中启用,那么内容传递到json()就会自动编码。否则,你将要使用json_encode函数。

        你现在已经了解了Symfony RequestResponse 对象的基础,你还可以参考HttpFoundation组件以了解更多。

        创建静态页面 ¶

        你可以在没有控制器的情况下创建一个静态页面(只需要一个路由和模板)。参考 不使用自定义控制器时如何渲染模板。

        总结 ¶

        当你创建了一个页面,你需要在页面中写一些业务逻辑的代码。在symfony中,这些就是控制器,它是一个能够做任何事情的php函数,目的是把最终的Response对象返回给用户。

        而且你能够继承Controller基类,使工作变得轻松。例如,你不用把html代码写到控制器,您可以使用render()rrreee

        Si le service Serializer est dans votre S'il est activé dans votre application, le contenu transmis à json() sera automatiquement encodé. Sinon, vous souhaiterez utiliser la fonction json_encode.

        Vous connaissez maintenant Symfony Request et Response < /code> La base de l'objet, vous pouvez également vous référer au composant HttpFoundation pour en savoir plus.

        Création de pages statiques ¶
        🎜Vous pouvez créer une page statique sans contrôleur (seulement un itinéraire et un modèle sont nécessaires). Référence Comment rendre des modèles sans utiliser de contrôleurs personnalisés. 🎜🎜Résumé ¶🎜🎜Lorsque vous créez une page, vous devez écrire du code de logique métier dans la page. Dans Symfony, ce sont des contrôleurs, qui sont des fonctions PHP qui font tout ce qu'il faut pour renvoyer l'objet Response final à l'utilisateur. 🎜🎜Et vous pouvez hériter de la classe de base Controller pour faciliter votre travail. Par exemple, au lieu d'écrire du code HTML dans le contrôleur, vous pouvez utiliser render() pour restituer le modèle et renvoyer le contenu du modèle. 🎜🎜Dans d'autres chapitres, vous verrez comment les contrôleurs sont utilisés pour lire les objets de la base de données et les conserver, gérer les soumissions de formulaires, exploiter la mise en cache et bien plus encore. 🎜🎜Continuez ¶🎜🎜 Ensuite, concentrez-vous sur l'apprentissage de l'utilisation de Twig pour rendre des modèles. 🎜🎜