제어 장치
컨트롤러는 http 요청 정보를 얻고 http 응답(Symfony 응답 객체로)을 구성하고 반환할 수 있는 PHP 함수입니다. 응답은 html 페이지, xml 문서, 직렬화된 json 배열, 이미지, 리디렉션일 수 있습니다. , 404 오류 또는 상상할 수 있는 모든 것. 컨트롤러에는 애플리케이션이 페이지를 렌더링하는 데 필요한 모든 논리가 포함되어 있습니다.
심포니 심플 컨트롤러를 살펴보세요. 다음 컨트롤러는 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>'); }}
컨트롤러의 목표는 동일합니다:Response
객체를 생성하고 반환하는 것입니다. 이 프로세스 동안 요청에서 정보를 읽고, 데이터베이스 리소스를 로드하고, 이메일을 보내고, 사용자 세션에 정보를 설정할 수 있습니다. 그러나 모든 경우에 컨트롤러는 결국 클라이언트에Response
개체를 반환합니다.- 특별한 것은 없습니다. 다른 요구 사항은 걱정하지 마세요! 다음은 몇 가지 일반적인 예입니다.
- 컨트롤러 B는 요청에서
- 컨트롤러 C는 연락처와 관련된 양식 제출을 처리합니다. 요청에서 양식 정보를 읽고 연락처 정보를 데이터베이스에 저장한 다음 연락처 정보가 포함된 이메일을 웹사이트 관리자에게 보냅니다. 마지막으로 사용자 브라우저를 문의 양식의 "감사합니다" 페이지로 리디렉션하는
요청, 컨트롤러 및 응답의 수명 주기 ¶
Symfony가 처리 모든 요청은 동일한 수명주기를 갖습니다. 프레임워크는 많은 반복 작업을 사용자 정의 애플리케이션 코드를 실행하는 컨트롤러로 병합하는 역할을 합니다.第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
- 🎜Line 2: Symfony는 php 네임스페이스 함수를 사용하여 전체 컨트롤러 클래스의 이름을 지정합니다.🎜🎜
- 🎜Line 4: Symfony는 The를 최대한 활용합니다. PHP5.3의 네임스페이스 함수가 추가되었습니다.
use
키워드는 컨트롤러가 반환해야 하는Response
클래스를 가져옵니다. 🎜🎜 - 🎜Line 6: Class 이름은 다음과 같습니다. 컨트롤러 클래스 이름(예:
hello
)과Controller
키워드를 연결한 것입니다. 이는 컨트롤러에 일관성을 제공하고 컨트롤러 이름(예:hello
)을 라우팅 구성으로 참조할 수 있도록 하는 규칙입니다. 🎜🎜 - 🎜8행: 컨트롤러 클래스의 각 작업에는 접미사
Action
이 있고 작업 이름(index
)은 파일의 라우팅 구성을 참조합니다. . 다음 섹션에서는 라우팅을 사용하여 URI를 작업에 매핑하고 경로 자리 표시자({name}
)를 작업 매개 변수($name
)로 변환하는 방법을 보여줍니다. >);🎜🎜 - 🎜10행: 컨트롤러가
Response
객체를 생성하고 반환합니다. 🎜🎜🎜🎜URI를 컨트롤러에 매핑 🎜¶🎜🎜🎜 새 컨트롤러는 간단한 HTML 페이지를 반환합니다. 지정된 URI에서 이 컨트롤러를 렌더링하려면 이에 대한 경로를 만들어야 합니다. 라우팅 장에서 라우팅 구성 요소에 대한 세부 사항을 논의할 것이지만 지금은 컨트롤러에 대한 간단한 경로를 만들어 보겠습니다: 🎜🎜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) { // ... }}
이제
/hello/ryan
으로 왔습니다. (예를 들어 내장 웹 서비스http://localhost:8000/hello/ryan
을 사용하는 경우) ,HelloController::indexAction()
컨트롤러가 실행되고ryan
이$name
변수에 할당됩니다. 이러한 페이지를 생성하면 라우팅과 컨트롤러 간의 간단한 연결이 가능해집니다./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.不是所有的路由参数都需要在控制器上有响应参数的
如果,举个例子,
간단하죠?last_name
Response
개체를 준비합니다. -{slug}
매개변수를 읽고, 데이터베이스에서 블로그 게시물을 로드하고, 블로그 게시물을 표시하는 Response
개체를 생성합니다. 데이터베이스에서 {slug}
를 검색할 수 없는 경우 컨트롤러는 404 상태 코드가 포함된 Response
개체를 생성하고 반환합니다. Response
개체를 생성합니다. 각 요청은 단일 프런트 엔드 컨트롤러(예: app.php code>)에 의해 처리됩니다. 프로덕션 환경 또는
app_dev.php
개발 환경) 파일 처리 시 프런트엔드 컨트롤러는 프레임워크 부팅을 담당합니다.
Kernel
호출) 처리할 수 있도록 Request
객체를 전달합니다. 🎜🎜🎜🎜Symfony 코어는 라우터에 이 요청을 확인하도록 요청합니다. 🎜🎜🎜🎜라우터는 요청 정보를 보고 일치하여 호출할 컨트롤러를 결정하는 특정 경로를 가리킵니다. 🎜🎜🎜🎜실행 컨트롤러, 제어; 핸들러의 코드는 🎜🎜🎜🎜HTTP 헤더를 생성하고 반환하며 Response 개체의 내용은 클라이언트로 다시 전송됩니다. 🎜🎜🎜🎜URI를 컨트롤러에 매핑하는 동안 컨트롤러를 만드는 것은 페이지를 만드는 것만큼 쉽습니다. 🎜🎜🎜🎜이름은 비슷하지만 프런트엔드 컨트롤러는 이 장에서 설명하는 컨트롤러와 다릅니다. 프런트엔드 컨트롤러는 web/
디렉터리에 있는 작은 PHP 파일입니다. 모든 요청은 모두 이를 통해 직접 전달됩니다. 일반적인 애플리케이션에는 프로덕션용 프런트엔드 컨트롤러(예: app.php
)와 개발용 프런트엔드 컨트롤러(예: app_dev.php
)가 있습니다. 전면 컨트롤러를 편집하거나 보거나 걱정할 필요가 없습니다. 이 장의 "컨트롤러 클래스"는 액션이라고도 하는 개별 "컨트롤러"를 하나의 클래스(예: updateAction()
, deleteAction()
)로 구성하는 편리한 방법을 사용합니다. , 등.). 따라서 컨트롤러는 컨트롤러 클래스의 메서드입니다. 생성된 코드를 보관하고 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
。
这个控制器非常的简单:
컨트롤러는 호출 가능한 모든 PHP(함수, 객체 메서드 또는 클로저
클로저 code>), Symfony에서 컨트롤러는 일반적으로 컨트롤러 클래스의 메서드이며 컨트롤러는 종종 액션이라고도 합니다.
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 }.
여기서 컨트롤러는 컨트롤러 클래스 <에 속하는 indexAction
메서드입니다. 코드>HelloController.