pengawal


Pengawal ialah fungsi php yang anda buat, yang boleh mendapatkan maklumat permintaan http dan membina serta mengembalikan respons http (sebagai objek Respons Symfony mungkin halaman html, dokumen xml, tatasusunan json bersiri, Imej, ubah hala). , 404 ralat atau apa-apa lagi yang anda boleh bayangkan. Pengawal mengandungi sebarang logik yang diperlukan oleh aplikasi anda untuk memaparkan halaman.

Sila lihat pengawal ringkas symfony. Pengawal berikut akan mengeluarkan hello word: 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>');
        }}

    Matlamat pengawal adalah sama: untuk mencipta dan mengembalikan objek Respons. Semasa proses ini, ia mungkin membaca maklumat daripada permintaan, memuatkan sumber pangkalan data, menghantar e-mel dan menetapkan maklumat dalam sesi pengguna. Tetapi dalam semua kes, pengawal akhirnya akan mengembalikan objek Respons kepada klien.
  3. Tiada apa-apa yang ajaib, jangan risau tentang sebarang keperluan lain! Berikut ialah beberapa contoh biasa:

      Pengawal A menyediakan objek Respons pada halaman utama. -
    • Pengawal B membaca parameter {slug} daripada permintaan, memuatkan catatan blog daripada pangkalan data dan mencipta objek Respons yang memaparkan catatan blog. Jika {slug} tidak boleh diambil daripada pangkalan data, pengawal akan mencipta dan mengembalikan objek Respons dengan kod status 404.
    • Pengawal C mengendalikan penyerahan borang berkenaan kenalan. Ia membaca maklumat borang daripada permintaan, menyimpan maklumat hubungan dalam pangkalan data dan menghantar e-mel yang mengandungi maklumat hubungan kepada pentadbir laman web. Akhir sekali, ia mencipta objek Respons yang mengubah hala penyemak imbas pengguna ke halaman "Terima kasih" borang kenalan.

    Kitaran hayat permintaan, pengawal dan respons

    Pengendalian Symfony Setiap permintaan akan mempunyai kitaran hayat yang sama. Rangka kerja akan bertanggungjawab untuk menggabungkan banyak tugas berulang ke dalam pengawal yang melaksanakan kod aplikasi tersuai anda:
    1. Setiap permintaan dikendalikan oleh pengawal bahagian hadapan tunggal (seperti app.php persekitaran pengeluaran atau persekitaran pembangunan app_dev.php) pemprosesan fail, pengawal bahagian hadapan bertanggungjawab untuk but rangka kerja

      1466410869_65826_51226_http-xkcd-request.png

      Satu-satunya tugas pengawal bahagian hadapan adalah untuk memulakan enjin Symfony; (memanggil Kernel) dan masukkan objek Request untuk membenarkannya diproses. 🎜🎜🎜🎜Symfony Core meminta penghala untuk memeriksa permintaan ini; Kod dalam pengendali akan mencipta dan mengembalikan objek Respons; pengepala 🎜🎜🎜🎜HTTP dan kandungan objek Respons akan dihantar semula kepada klien. 🎜🎜🎜🎜Mencipta pengawal semudah membuat halaman, sambil memetakan URI ke pengawal. 🎜🎜🎜🎜

      Walaupun namanya serupa, pengawal bahagian hadapan adalah berbeza daripada pengawal yang kita bincangkan dalam bab ini Pengawal bahagian hadapan ialah fail PHP kecil dalam direktori web/ anda. dan semua permintaan semua melaluinya terus. Aplikasi biasa akan mempunyai pengawal bahagian hadapan untuk pengeluaran (seperti app.php) dan pengawal bahagian hadapan untuk pembangunan (seperti app_dev.php) . Anda tidak perlu mengedit, melihat atau bimbang tentang pengawal hadapan. "Kelas pengawal" dalam bab ini menggunakan kaedah yang mudah untuk menyusun "pengawal" individu, juga dipanggil tindakan, ke dalam satu kelas (cth., updateAction(), deleteAction () , dsb.). Oleh itu, pengawal adalah kaedah dalam kelas pengawal. Mereka akan memegang kod yang anda buat dan mengembalikan objek respons 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

      Pengawal ringkas

      Walaupun pengawal boleh berupa PHP yang boleh dipanggil (fungsi, Kaedah objek atau Penutupan), dalam Symfony, pengawal biasanya merupakan kaedah dalam kelas pengawal, pengawal juga sering dipanggil tindakan:

      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 }.

      Pengawal di sini ialah indexAction Kaedah, yang dimiliki oleh kelas pengawal < kod>HelloController.

      Pengawal ini sangat mudah:
      • 🎜Baris 2: Symfony menggunakan fungsi ruang nama php untuk menamakan keseluruhan kelas pengawal🎜🎜
      • 🎜Baris 4: Symfony menggunakan sepenuhnya The fungsi ruang nama PHP5.3 ditambah: kata kunci use mengimport kelas Response, yang mesti dikembalikan oleh pengawal kami 🎜🎜
      • 🎜Baris 6: Nama Kelas ialah gabungan nama kelas pengawal (seperti hello) serta kata kunci Controller. Ini ialah konvensyen yang memberikan ketekalan kepada pengawal dan membenarkan mereka merujuk nama pengawal (cth. hello) sebagai konfigurasi laluan. 🎜🎜
      • 🎜Baris 8: Setiap tindakan dalam kelas pengawal mempunyai akhiran Action dan nama tindakan (index) dirujuk kepada konfigurasi penghalaan dalam fail . Dalam bahagian seterusnya, kami akan menggunakan penghalaan untuk memetakan URI kepada tindakan dan menunjukkan cara menukar ruang letak laluan ({name}) kepada parameter tindakan ($name >);🎜🎜
      • 🎜Baris 10: Pengawal mencipta dan mengembalikan objek Respons. 🎜🎜🎜🎜Memetakan URI kepada Pengawal 🎜¶🎜🎜🎜 Pengawal baharu kami mengembalikan halaman HTML yang ringkas. Untuk dapat memberikan pengawal ini pada URI tertentu, kita perlu mencipta laluan untuknya. Kami akan membincangkan butiran komponen penghalaan dalam bab penghalaan, tetapi buat masa ini mari buat laluan mudah untuk pengawal kami: 🎜🎜
        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)
            {
                // ...
            }}

        Sekarang, anda datang ke /hello/ryan (contohnya, jika anda menggunakan perkhidmatan web terbina dalam http://localhost:8000/hello/ryan) , kemudian Pengawal HelloController::indexAction() akan dilaksanakan dan ryan akan diberikan kepada pembolehubah $name. Mencipta halaman sedemikian membolehkan perkaitan mudah antara penghalaan dan pengawal. /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

        Mudah kan?

        AppBundle:Hello:index controller syntax


        Jika Sama ada anda menggunakan format YAML atau XML, anda menggunakan sintaks pintasan khusus untuk pengawal anda yang dipanggil nama pengawal logik, seperti AppBundle:Hello:index. Untuk mendapatkan maklumat lanjut tentang format pengawal, baca Corak Penamaan Pengawal dalam bab Penghala.

        Lepaskan parameter laluan ke dalam pengawal ¶

        Kami kini tahu bahawa laluan itu menghala ke kaedah HelloController::indexAction() dalam AppBundle. Apa yang lebih menarik ialah lulus parameter kaedah pengawal:
        public function indexAction(){
            return $this->redirectToRoute('homepage');     // redirectToRoute is equivalent to using redirect() and generateUrl() together:
            // return $this->redirect($this->generateUrl('homepage'));}
        🎜Pengawal mempunyai parameter $name, yang sepadan dengan parameter {name} bagi laluan yang dipadankan ( jika anda Lawati /hello/ryan, dalam kes ini ryan). Malah, apabila pengawal anda dilaksanakan, Symfony memadankan setiap parameter dalam pengawal berparameter dalam laluan yang dipadankan. Jadi nilai {name} ini dihantar ke $name. Cuma pastikan nama pemegang tempat adalah sama dengan nama parameter. 🎜🎜🎜 Berikut adalah contoh yang lebih menarik, di sini pengawal mempunyai dua parameter: 🎜
        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));
        🎜Memetakan parameter penghalaan ke parameter pengawal adalah sangat mudah dan fleksibel. Sila ikut idea berikut apabila anda membangunkan: 🎜🎜1 Susunan parameter pengawal tidak penting🎜Symfony boleh memadankan parameter kaedah pengawal berdasarkan nama parameter laluan. Dalam erti kata lain, ia boleh memadankan parameter last_name dengan parameter $last_name. Pengawal boleh berfungsi secara normal dengan sebarang susunan parameter. 🎜
        // renders app/Resources/views/hello/greetings/index.html.twigreturn $this->render('hello/greetings/index.html.twig', array(
            'name' => $name));
        🎜2. Parameter yang diperlukan oleh pengawal mesti sepadan dengan parameter laluan🎜🎜🎜Pengecualian masa jalan (RuntimeException) akan dilemparkan di bawah kerana tiada < kod> foo Parameter: 🎜
        $templating = $this->get('templating'); 
        $router = $this->get('router'); 
        $mailer = $this->get('mailer');
        🎜 Alangkah baiknya jika parameter tersebut adalah pilihan. Contoh berikut tidak akan mengeluarkan pengecualian: 🎜🎜
        $ php bin/console debug:container
        🎜3 Tidak semua parameter laluan perlu mempunyai parameter respons pada pengawal🎜🎜🎜Jika, sebagai contoh, nama_akhir . Jika ia tidak begitu penting kepada pengawal anda, anda boleh mengabaikannya sepenuhnya: 🎜
        public function indexAction(){
            // retrieve the object from database
            $product = ...;
            if (!$product) {
                throw $this->createNotFoundException('The product does not exist');
            }     return $this->render(...);}
        🎜🎜🎜🎜🎜Anda juga boleh menghantar parameter lain daripada penghala anda kepada parameter pengawal anda. Lihat cara menghantar maklumat tambahan dari laluan ke pengawal 🎜🎜


        Kelas asas pengawal ¶

        Untuk kemudahan, Symfony menyediakan kelas asas Controler pilihan. Jika anda mewarisi daripadanya, ia tidak mengubah apa-apa tentang cara pengawal anda berfungsi dan anda boleh mewarisi beberapa kaedah pembantu dan bekas perkhidmatan dengan mudah (lihat Mengakses Bekas Lain, di bawah): membenarkan anda mengakses segala-galanya dalam sistem Objek berguna, serupa kepada objek tatasusunan. Objek berguna ini dipanggil perkhidmatan, dan symfony disertakan dengan objek perkhidmatan ini, yang boleh membuat templat, merekod maklumat log, dsb. 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()

        Gunakan pernyataan penggunaan di bahagian atas untuk menambah kelas Controller dan kemudian mengubah suai HelloController untuk mewarisinya. Seperti yang ditunjukkan di bawah:
        XML:{% for flash_message in app.session.flashBag.get('notice') %}    <div class="flash-notice">
                {{ flash_message }}    </div>{% endfor %}
        Tidak kira sama ada anda menggunakan kelas asas Controller, kaedah pembantu ini hanya membenarkan anda menggunakan fungsi teras Symfony dengan mudah. Malah, cara terbaik untuk melihat fungsi teras adalah dengan melihat kelas Pengawal itu sendiri. 🎜🎜
        🎜Jika anda ingin mengetahui cara pengawal berfungsi tanpa mewarisi kelas asas pengawal, anda boleh menyemak cara untuk balut pengawal Ditakrifkan sebagai perkhidmatan. Ini adalah pilihan, tetapi ia memberi anda kawalan yang tepat ke atas lebih banyak "objek/bergantungan" yang boleh disuntik ke dalam pengawal anda. 🎜🎜🎜

        Jana URL ¶

        🎜generateUrl() Kaedah tambahan yang boleh menjana URL ke penghala. 🎜

        Ubah hala

        🎜Jika anda ingin mengubah hala pengguna ke halaman lain, sila gunakan < code> kaedah 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 ?>
        🎜Secara lalai, kaedah redirectToRoute() melakukan ubah hala 302 (sementara). Jika anda ingin melakukan ubah hala 301 (kekal), ubah suai parameter ke-2: 🎜🎜
        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');}
        🎜Dari menghala ke tapak web luaran, gunakan redirect() dan masukkan URL luaran: 🎜
        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');
        🎜Lagi butiran , sila rujuk penghalaan untuk memulakan rangka kerja. 🎜🎜
        🎜 Daripada mencipta objek Respons yang pakar dalam mengubah hala penggunaredirectToRoute () kaedah ialah pintasan mudah, yang bersamaan dengan: 🎜
        // ...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());}
        🎜🎜

        Templat Rendering

        Jika anda menggunakan HTML, anda sepatutnya mahu membuat templat. Kaedah render() boleh digunakan untuk memaparkan templat dan meletakkan kandungan output ke dalam objek Respons anda: 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

        Templat juga boleh disimpan dalam subdirektori yang lebih dalam. Tetapi anda harus mengelak daripada mencipta struktur dalam yang tidak perlu:
        rrreee
        Templat boleh menghasilkan kandungan secara universal dalam sebarang format fail. Walaupun dalam kebanyakan kes anda menggunakan templat untuk memaparkan kandungan HTML, templat juga boleh menjana JavaScript, CSS, XML atau sebarang format lain yang boleh anda fikirkan dengan mudah. Untuk mengetahui cara memformat templat yang berbeza, lihat "Pemformatan Templat" dalam Mencipta dan Menggunakan Templat.
        🎜
        🎜Corak penamaan templat🎜🎜Anda juga boleh meletakkan templat Dalam direktori Sumber/paparan berkas dan rujuk kepada sintaks pintasan khasnya, seperti @App/Hello/index.html.twig atau @App/layout .html .ranting. Ini akan disimpan dalam Resources/views/Hello/index.html.twig dan Resources/views/layout.html.twig masing-masing🎜🎜🎜

        Akses perkhidmatan lain

        Symfony telah memasukkan banyak objek berguna ke dalam perkhidmatan. Perkhidmatan ini digunakan untuk membuat templat, menghantar e-mel, pangkalan data pertanyaan dan sebarang "kerja" lain yang boleh anda fikirkan. Apabila anda memasang himpunan baharu, ia juga mungkin membawa lebih banyak perkhidmatan.

        Selepas mewarisi kelas asas controller, anda boleh lulus 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 mengakses sebarang perkhidmatan Symfony. Berikut adalah beberapa perkhidmatan biasa:

        rrreee

        Apakah perkhidmatan yang wujud? Saya mahu melihat semua perkhidmatan, sila gunakan debug:container paparan baris arahan:
        rrreee

        Untuk maklumat lanjut, sila lihat bekas perkhidmatan🎜

        Urus ralat dan halaman 404 ¶

        🎜Jika Beberapa tindakan tidak ditemui dan respons 404 akan dikembalikan. Untuk melakukan ini, anda perlu membuang pengecualian. Jika anda mewarisi kelas Controller asas, anda boleh melakukan perkara berikut: 🎜rrreee🎜 Kaedah createNotFoundException() mencipta NotFoundHttpException objek untuk mencetuskan 404 respons http dalam symfony. 🎜🎜🎜 Sudah tentu, anda juga bebas untuk membuang mana-mana kelas Exception dalam pengawal anda dan Symfony akan mengembalikan kod respons HTTP 500 secara automatik. 🎜rrreee🎜Dalam setiap contoh, halaman ralat terformat ditunjukkan kepada pengguna akhir, manakala halaman nyahpepijat yang penuh dengan ralat ditunjukkan kepada pembangun (apabila dalam mod nyahpepijat app_dev.php Apabila melihat halaman ini - anda boleh melihat mengkonfigurasi Symfony (dan persekitaran)). 🎜🎜🎜Halaman ralat ini semuanya boleh disesuaikan. Untuk mengetahui lebih lanjut, baca "Cara Menyesuaikan Halaman Ralat". 🎜

        Minta objek sebagai parameter pengawal ¶

        🎜Bagaimana jika anda perlu mendapatkan parameter pertanyaan, ambil pengepala permintaan atau dapatkan fail yang dimuat naik? Maklumat ini disimpan dalam objek Request Symfony. Untuk memasukkannya ke dalam pengawal anda, cuma tambahkan objek Request sebagai parameter dan paksa jenis ke kelas Request: 🎜rrreee🎜Urus Sesi ¶🎜🎜🎜🎜Symfony menyediakan objek Sesi berguna yang boleh menyimpan maklumat tentang pengguna (ia boleh menjadi orang yang menggunakan penyemak imbas, bot atau perkhidmatan web) permintaan masa . Secara lalai, Symfony menyimpan atribut dalam kuki dengan menggunakan Sesi asli PHP. 🎜🎜Untuk mendapatkan sesi ini, anda perlu memanggil kaedah getSession() bagi objek Request. Kaedah ini akan mengembalikan SessionInterface, yang menggunakan kaedah paling mudah untuk menyimpan dan mendapatkan semula data sesi: 🎜rrreee🎜Atribut ini akan dikekalkan semasa tempoh sah sesi pengguna. 🎜🎜

        Flash Message

        Anda juga boleh menyimpan beberapa mesej yang ditentukan dalam sesi pengguna Mesej ini dipanggil "flash message". Sebagai peraturan, mesej kilat hanya boleh digunakan sekali: ia hilang secara automatik apabila anda mendapatkannya semula. Sifat ini menjadikan mesej "flash" sangat sesuai untuk menyimpan pemberitahuan pengguna.

        Mari lihat contoh kami mengendalikan penyerahan borang:

        rrreee

        Selepas mengendalikan permintaan, pengawal menetapkan mesej kilat yang dipanggil notis dan kemudian mengubah hala. Nama (notis) tidak penting - ia adalah pengecam yang mengenal pasti mesej.
        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()

        Seterusnya ialah templat (atau lebih baik lagi, templat dalam reka letak asas anda) yang membaca setiap maklumat daripada sesi:
        rrreeerrreee🎜Biasanya digunakan notis, < kod>amaran dan error digunakan sebagai kunci untuk pelbagai jenis mesej gesaan, tetapi anda boleh menggunakan mana-mana kunci yang anda perlukan. 🎜
        🎜Anda boleh menggunakan kaedah peek() untuk mendapatkan mesej, Ia membenarkan mesej disimpan 🎜🎜🎜

        Objek Permintaan dan Respons ¶

        🎜Seperti yang dinyatakan sebelum ini, objek Permintaan rangka kerja dihantar sebagai parameter pengawal. dan Paksa jenis data yang ditentukan menjadi kelas Request: 🎜rrreee🎜Kelas Request ini mempunyai beberapa sifat dan kaedah awam, yang boleh mengembalikan sebarang maklumat permintaan yang anda perlukan.
        🎜🎜Seperti Permintaan, objek Response juga mempunyai sifat header awam. Ia ialah ResponseHeaderBag🎜Ia mempunyai beberapa kaedah yang bagus untuk mendapatkan dan menetapkan pengepala respons. Nama pengepala dinormalkan supaya Content-Type adalah sama dengan content-type atau bahkan sama dengan content_type, yang semuanya sama. 🎜🎜Untuk pengawal, satu-satunya keperluan ialah mengembalikan objek Respons. Kelas Respons ialah abstraksi PHP untuk respons HTTP Mesej berasaskan teks mengisi pengepala HTTP, dan kandungannya dihantar semula kepada klien: 🎜rrreee🎜 Terdapat juga beberapa kelas khas yang boleh memudahkan respons tertentu: 🎜
        • 🎜 Untuk JSON: Ini ialah JosnResponse. Boleh dilihat Buat respons JOSN. 🎜
        • 🎜Untuk operasi fail: ini ialah BinaryFileResponse. Melayan Fail boleh dilihat. 🎜
        • 🎜Untuk respons penstriman, terdapat StreamedResponse. Lihat: Menstrim respons🎜
        🎜JSON Helper
        ¶🎜🎜
        🎜 3.1json() helper telah diperkenalkan bermula dari symfony3.1. 🎜🎜

        Memulangkan jenis JSON semakin popular dalam aplikasi berasaskan API. Atas sebab ini, kelas asas pengawal mentakrifkan kaedah json(), yang mencipta JsonResponse dan secara automatik mengekod kandungan yang diberikan: json()方法,来创建一个JsonResponse 并自动编码给定的内容:

        rrreee

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

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

        创建静态页面 ¶

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

        总结 ¶

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

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

        Jika perkhidmatan Serializer berada dalam anda Jika didayakan dalam aplikasi anda, kandungan yang dihantar kepada json() akan dikodkan secara automatik. Jika tidak, anda akan mahu menggunakan fungsi json_encode.

        Anda kini tahu tentang Symfony Request dan Response < /code> Asas objek, anda juga boleh merujuk kepada komponen HttpFoundation untuk mengetahui lebih lanjut.

        Mencipta Halaman Statik ¶
        🎜Anda boleh mencipta halaman statik tanpa pengawal (hanya laluan dan templat diperlukan). Rujukan Cara membuat templat tanpa menggunakan pengawal tersuai. 🎜🎜Ringkasan ¶🎜🎜Apabila anda membuat halaman, anda perlu menulis beberapa kod logik perniagaan dalam halaman tersebut. Dalam symfony, ini adalah pengawal, iaitu fungsi PHP yang melakukan apa sahaja yang diperlukan untuk mengembalikan objek Respons terakhir kepada pengguna. 🎜🎜Dan anda boleh mewarisi kelas asas Pengawal untuk memudahkan kerja anda. Sebagai contoh, daripada menulis kod HTML ke dalam pengawal, anda boleh menggunakan render() untuk memaparkan templat dan mengembalikan kandungan templat. 🎜🎜Dalam bab lain, anda akan melihat cara pengawal digunakan untuk membaca objek daripada pangkalan data dan mengekalkannya, mengendalikan penyerahan borang, mengendalikan caching dan banyak lagi. 🎜🎜Teruskan Teruskan ¶🎜🎜 Seterusnya, fokus pada pembelajaran menggunakan Twig untuk membuat templat. 🎜🎜