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处理的每一个请求都会有相同的生命周期。框架会负责把很多重复的任务用一个控制器最终执行,控制器执行你自定义的应用代码:
每个请求都被单个前端控制器(如
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>'); }}
Matlamat pengawal adalah sama: untuk mencipta dan mengembalikan objekRespons
. 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 objekRespons
kepada klien.- Tiada apa-apa yang ajaib, jangan risau tentang sebarang keperluan lain! Berikut ialah beberapa contoh biasa:
- Pengawal B membaca parameter
- 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
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:第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
- 🎜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 kelasResponse
, yang mesti dikembalikan oleh pengawal kami 🎜🎜 - 🎜Baris 6: Nama Kelas ialah gabungan nama kelas pengawal (seperti
hello
) serta kata kunciController
. 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 dalamhttp://localhost:8000/hello/ryan
) , kemudian PengawalHelloController::indexAction()
akan dilaksanakan danryan
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中的
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.不是所有的路由参数都需要在控制器上有响应参数的
如果,举个例子,
Mudah kan?last_name
Respons
pada halaman utama. -{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. Respons
yang mengubah hala penyemak imbas pengguna ke halaman "Terima kasih" borang kenalan. Setiap permintaan dikendalikan oleh pengawal bahagian hadapan tunggal (seperti app.php code> persekitaran pengeluaran atau persekitaran pembangunan
app_dev.php
) pemprosesan fail, pengawal bahagian hadapan bertanggungjawab untuk but rangka kerja
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
。
这个控制器非常的简单:
Walaupun pengawal boleh berupa PHP yang boleh dipanggil (fungsi, Kaedah objek atau Penutupan code>), 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.