제어 장치


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

  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>');
        }}

    컨트롤러의 목표는 동일합니다: Response 객체를 생성하고 반환하는 것입니다. 이 프로세스 동안 요청에서 정보를 읽고, 데이터베이스 리소스를 로드하고, 이메일을 보내고, 사용자 세션에 정보를 설정할 수 있습니다. 그러나 모든 경우에 컨트롤러는 결국 클라이언트에 Response 개체를 반환합니다.
  3. 특별한 것은 없습니다. 다른 요구 사항은 걱정하지 마세요! 다음은 몇 가지 일반적인 예입니다.

      컨트롤러 A는 홈 페이지에서 Response 개체를 준비합니다. -
    • 컨트롤러 B는 요청에서 {slug} 매개변수를 읽고, 데이터베이스에서 블로그 게시물을 로드하고, 블로그 게시물을 표시하는 Response 개체를 생성합니다. 데이터베이스에서 {slug}를 검색할 수 없는 경우 컨트롤러는 404 상태 코드가 포함된 Response 개체를 생성하고 반환합니다.
    • 컨트롤러 C는 연락처와 관련된 양식 제출을 처리합니다. 요청에서 양식 정보를 읽고 연락처 정보를 데이터베이스에 저장한 다음 연락처 정보가 포함된 이메일을 웹사이트 관리자에게 보냅니다. 마지막으로 사용자 브라우저를 문의 양식의 "감사합니다" 페이지로 리디렉션하는 Response 개체를 생성합니다.

    요청, 컨트롤러 및 응답의 수명 주기

    Symfony가 처리 모든 요청은 동일한 수명주기를 갖습니다. 프레임워크는 많은 반복 작업을 사용자 정의 애플리케이션 코드를 실행하는 컨트롤러로 병합하는 역할을 합니다.
    1. 각 요청은 단일 프런트 엔드 컨트롤러(예: app.php)에 의해 처리됩니다. 프로덕션 환경 또는 app_dev.php 개발 환경) 파일 처리 시 프런트엔드 컨트롤러는 프레임워크 부팅을 담당합니다.

      1466410869_65826_51226_http-xkcd-request.png

      프런트엔드 컨트롤러의 유일한 작업은 Symfony 엔진을 초기화하는 것입니다. (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

      这个控制器非常的简单:

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

      간단한 컨트롤러

      컨트롤러는 호출 가능한 모든 PHP(함수, 객체 메서드 또는 클로저클로저), 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.

      이 컨트롤러는 매우 간단합니다.
      • 🎜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: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

        간단하죠?

        AppBundle:Hello:index 컨트롤러 구문


        If 여부 YAML 또는 XML 형식을 사용하는 경우 AppBundle:Hello:index와 같은 논리 컨트롤러 이름이라고 하는 컨트롤러에 대한 특정 바로 가기 구문을 사용합니다. 컨트롤러 형식에 대한 자세한 내용은 라우터 장의 컨트롤러 명명 패턴을 참조하세요.

        경로 매개변수를 컨트롤러에 전달 ¶

        이제 경로가 AppBundle의 HelloController::indexAction() 메서드를 가리키는 것을 알 수 있습니다. 더 흥미로운 점은 컨트롤러 메서드의 매개변수 전달입니다.
        public function indexAction(){
            return $this->redirectToRoute('homepage');     // redirectToRoute is equivalent to using redirect() and generateUrl() together:
            // return $this->redirect($this->generateUrl('homepage'));}
        🎜 컨트롤러에는 일치하는 경로의 {name} 매개변수에 해당하는 $name 매개변수가 있습니다( /hello/ryan을 방문하는 경우, 이 경우에는 ryan). 실제로 컨트롤러가 실행되면 Symfony는 일치하는 경로에서 매개변수화된 컨트롤러의 모든 매개변수를 일치시킵니다. 따라서 이 {name} 값은 $name에 전달됩니다. 자리표시자 이름이 매개변수 이름과 동일한지 확인하세요. 🎜🎜🎜 여기에 더 흥미로운 예가 있습니다. 컨트롤러에는 두 개의 매개변수가 있습니다. 🎜
        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));
        🎜 라우팅 매개변수를 컨트롤러 매개변수에 매핑하는 것은 매우 쉽고 유연합니다. 개발할 때 다음 아이디어를 따르십시오. 🎜🎜1. 컨트롤러 매개변수의 순서는 중요하지 않습니다.🎜Symfony는 경로 매개변수 이름을 기반으로 컨트롤러 메서드 매개변수를 일치시킬 수 있습니다. 즉, last_name 매개변수를 $last_name 매개변수와 일치시킬 수 있습니다. 컨트롤러는 어떤 매개변수 배열로도 정상적으로 작동할 수 있습니다. 🎜
        // renders app/Resources/views/hello/greetings/index.html.twigreturn $this->render('hello/greetings/index.html.twig', array(
            'name' => $name));
        🎜2. 컨트롤러에 필요한 매개변수는 경로 매개변수와 일치해야 합니다.🎜🎜🎜가 없기 때문에 런타임 예외(RuntimeException)가 발생합니다. foo 매개변수: 🎜
        $templating = $this->get('templating'); 
        $router = $this->get('router'); 
        $mailer = $this->get('mailer');
        🎜 매개변수가 선택사항이면 좋을 것 같습니다. 다음 예에서는 예외가 발생하지 않습니다. 🎜🎜
        $ php bin/console debug:container
        🎜3. 모든 경로 매개변수가 컨트롤러에 응답 매개변수를 가질 필요는 없습니다.🎜🎜🎜예를 들어 last_name 컨트롤러에 그다지 중요하지 않은 경우 완전히 무시할 수 있습니다. 🎜
        public function indexAction(){
            // retrieve the object from database
            $product = ...;
            if (!$product) {
                throw $this->createNotFoundException('The product does not exist');
            }     return $this->render(...);}
        🎜🎜🎜🎜🎜라우터에서 컨트롤러 매개변수로 다른 매개변수를 전달할 수도 있습니다. 경로에서 컨트롤러로 추가 정보를 전달하는 방법을 알아보세요 🎜🎜


        컨트롤러 기본 클래스 ¶

        편의를 위해 Symfony는 선택적 컨트롤러 기본 클래스를 제공합니다. 이를 상속받는 경우 컨트롤러 작동 방식은 변경되지 않으며 일부 도우미 메서드와 서비스 컨테이너를 쉽게 상속할 수 있습니다(아래 다른 컨테이너 액세스 참조). 시스템의 모든 항목에 액세스할 수 있습니다. 배열 객체에. 이러한 유용한 개체를 서비스라고 하며 심포니에는 템플릿을 렌더링하고 로그 정보를 기록하는 등의 서비스 개체가 함께 제공됩니다. 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()

        상단의 use 문을 사용하여 Controller 클래스를 추가한 다음 HelloController를 수정하여 상속합니다. 아래와 같이:
        XML:{% for flash_message in app.session.flashBag.get('notice') %}    <div class="flash-notice">
                {{ flash_message }}    </div>{% endfor %}
        Controller 기본 클래스 사용 여부에 관계없이 이러한 도우미 메서드를 사용하면 Symfony의 핵심 기능을 편리하게 사용할 수 있습니다. 실제로 핵심 기능을 확인하는 가장 좋은 방법은 Controller 클래스 자체를 살펴보는 것입니다. 🎜🎜
        🎜컨트롤러 기본 클래스를 상속하지 않고 컨트롤러가 어떻게 작동하는지 알고 싶다면 다음을 확인하세요. 서비스로 정의된 컨트롤러를 래핑합니다. 이는 선택 사항이지만 컨트롤러에 주입할 수 있는 더 많은 "객체/종속성"을 정밀하게 제어할 수 있습니다. 🎜🎜🎜

        URL 생성 ¶

        🎜generateUrl() 라우터에 대한 URL을 생성할 수 있는 보조 메서드입니다. 🎜

        리디렉션

        🎜사용자를 다른 페이지로 리디렉션하려면 < code>를 사용하세요. 리디렉션ToRoute() 메서드: 🎜
        PHP:<?php foreach ($view['session']->getFlash('notice') as $message): ?>
            <div class="flash-notice">        <?php echo "<div class='flash-error'>$message</div>" ?>
            </div><?php endforeach ?>
        🎜기본적으로 redirectToRoute() 메서드는 302(임시) 리디렉션을 수행합니다. 301(영구) 리디렉션을 수행하려면 두 번째 매개변수를 수정하세요. 🎜🎜
        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');}
        🎜외부 웹사이트로의 리디렉션에서 redirect()를 사용하고 외부 URL을 전달하세요: 🎜
        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');
        🎜더 보기 자세한 내용은 프레임워크를 시작하려면 라우팅을 참조하세요. 🎜🎜
        🎜 사용자 리디렉션을 전문으로 하는 Response 개체를 만드는 것보다redirectToRoute () 메소드는 다음과 같은 간단한 단축키입니다: 🎜
        // ...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());}
        🎜🎜

        렌더링 템플릿

        HTML을 사용하는 경우 템플릿을 렌더링해야 합니다. render() 메서드를 사용하면 템플릿을 렌더링하고 출력 콘텐츠를 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

        템플릿은 또한 더 깊은 하위 디렉터리. 하지만 불필요한 심층 구조를 만드는 것은 피해야 합니다.
        rrreee
        Templates는 모든 파일 형식에서 보편적인 방식으로 콘텐츠를 렌더링할 수 있습니다. 대부분의 경우 템플릿을 사용하여 HTML 콘텐츠를 렌더링하지만 템플릿은 JavaScript, CSS, XML 또는 기타 생각할 수 있는 형식을 쉽게 생성할 수도 있습니다. 다양한 템플릿의 형식을 지정하는 방법을 알아보려면 템플릿 생성 및 사용의 "템플릿 형식 지정"을 참조하세요.
        #🎜🎜#
        #🎜🎜#템플릿 이름 지정 패턴#🎜 🎜 ##🎜🎜#또한 번들의 Resources/views 디렉터리에 템플릿을 넣고 @App/Hello/index.html.twig <와 같은 특수 바로가기 구문을 참조할 수도 있습니다. /code> 또는 @App/layout.html.twig. 이는 번들의 Resources/views/Hello/index.html.twigResources/views/layout.html.twig#🎜🎜##🎜🎜#에 저장됩니다. #🎜🎜#

        다른 서비스에 액세스

        Symfony는 많은 유용한 개체를 서비스에 포함시켰습니다. 이러한 서비스는 템플릿을 렌더링하고, 이메일을 보내고, 데이터베이스를 쿼리하고, 기타 생각할 수 있는 모든 "작업"에 사용됩니다. 새 번들을 설치하면 더 많은 서비스가 제공될 수도 있습니다.

        controller 기본 클래스를 상속받은 후 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 메소드는 모든 Symfony 서비스에 액세스합니다. 다음은 몇 가지 일반적인 서비스입니다.

        rrreee

        어떤 서비스가 있나요? 모든 서비스를 보려면 debug:container 명령줄을 사용하여 확인하세요.
        rrreee

        자세한 내용은 서비스 컨테이너🎜

        오류 및 404 페이지 관리 ¶🎜일부 작업을 찾을 수 없으면 404 응답이 반환됩니다. 이렇게 하려면 예외를 발생시켜야 합니다. 기본 Controller 클래스를 상속하는 경우 다음을 수행할 수 있습니다. 🎜rrreee🎜 createNotFoundException() 메서드는 특별한 NotFoundHttpException 객체는 Symfony 내에서 http의 404 응답을 트리거합니다. 🎜🎜🎜 물론 컨트롤러에서 Exception 클래스를 자유롭게 던질 수도 있으며 Symfony는 자동으로 HTTP 응답 코드 500을 반환합니다. 🎜rrreee🎜각 예에서 형식이 지정된 오류 페이지는 최종 사용자에게 표시되고 오류로 가득 찬 디버그 페이지는 개발자에게 표시됩니다(디버그 모드에서 app_dev.php일 때 이 페이지를 볼 때 - Symfony(및 환경) 구성을 볼 수 있습니다. 🎜🎜🎜이러한 오류 페이지는 모두 사용자 정의할 수 있습니다. 자세한 내용은 "오류 페이지를 사용자 정의하는 방법"을 참조하세요. 🎜

        컨트롤러 매개변수로 개체 요청 ¶

        🎜쿼리 매개변수를 가져오거나, 요청 헤더를 가져오거나, 업로드된 파일을 가져와야 한다면 어떻게 해야 할까요? 이 정보는 Symfony의 Request 객체에 저장됩니다. 컨트롤러에 가져오려면 Request 개체를 매개변수로 추가하고 유형을 Request 클래스에 강제 적용하세요. 🎜rrreee🎜Manage Session ¶🎜🎜🎜🎜Symfony는 사용자(브라우저, 봇 또는 웹 서비스를 사용하는 사람일 수 있음) 시간 요청에 대한 정보를 저장할 수 있는 유용한 Session 객체를 제공합니다. . 기본적으로 Symfony는 PHP의 기본 세션을 사용하여 쿠키에 속성을 저장합니다. 🎜🎜이 세션을 얻으려면 Request 개체의 getSession() 메서드를 호출해야 합니다. 이 메소드는 세션 데이터를 저장하고 검색하는 가장 간단한 메소드를 사용하는 SessionInterface를 반환합니다. 🎜rrreee🎜이러한 속성은 사용자 세션의 유효 기간 동안 유지됩니다. 🎜🎜

        플래시 메시지

        사용자 세션에 지정된 일부 메시지를 저장할 수도 있습니다. 이 메시지를 "플래시 메시지"라고 합니다. 경험상 플래시 메시지는 한 번만 사용할 수 있으며, 검색하면 자동으로 사라집니다. 이 속성은 "플래시" 메시지를 사용자 알림 저장에 특히 적합하게 만듭니다.

        양식 제출을 처리하는 예를 살펴보겠습니다.

        rrreee

        요청을 처리한 후 컨트롤러는 통지라는 플래시 메시지를 설정한 다음 리디렉션합니다. 이름(notice)은 중요하지 않습니다. 이는 메시지를 식별하는 식별자입니다.
        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()

        다음 단계는 세션의 각 정보를 읽는 템플릿(또는 기본 레이아웃의 템플릿)입니다.
        rrreeerrreee🎜일반적으로 사용되는 notice, < code >warning
        error는 다양한 유형의 프롬프트 메시지에 대한 키로 사용되지만 필요한 모든 키를 사용할 수 있습니다. 🎜
        🎜peek() 메소드를 사용하여 🎜🎜🎜

        요청 및 응답 개체 ¶

        🎜앞서 언급한 것처럼 프레임워크의 요청 개체가 컨트롤러의 매개 변수로 전달됩니다. 지정된 데이터 유형을 Request 클래스로 강제 지정: 🎜rrreee🎜이 Request 클래스에는 필요한 요청 정보를 반환할 수 있는 몇 가지 공개 속성과 메서드가 있습니다.
        🎜🎜요청과 마찬가지로 응답 개체에도 공개 헤더 속성이 있습니다. ResponseHeaderBag🎜응답 헤더를 가져오고 설정하는 몇 가지 좋은 방법이 있습니다. 헤더 이름의 정규화는 Content-Typecontent-type과 같게 하거나 심지어 content_type과 같게 만듭니다. 이는 모두 동일합니다. 🎜🎜컨트롤러의 경우 유일한 요구 사항은 응답 개체를 반환하는 것입니다. Response 클래스는 HTTP 응답을 위한 PHP 추상화입니다. 텍스트 기반 메시지가 HTTP 헤더를 채우고 해당 내용이 클라이언트로 다시 전송됩니다. 🎜rrreee🎜 특정 응답을 단순화할 수 있는 몇 가지 특수 클래스도 있습니다: 🎜
        • 🎜 JSON의 경우: JosnResponse입니다. 보기 가능 JOSN 응답을 생성합니다. 🎜
        • 🎜파일 작업의 경우: BinaryFileResponse입니다. 제공 파일을 볼 수 있습니다. 🎜
        • 🎜스트리밍 응답의 경우 StreamedResponse가 있습니다. 참조: 응답 스트리밍🎜
        🎜JSON 도우미
        ¶🎜🎜
        🎜 3.1json() 도우미는 Symfony3.1부터 도입되었습니다. 🎜🎜

        JSON 유형 반환은 API 기반 애플리케이션에서 점점 더 많이 사용되고 있습니다. 이러한 이유로 컨트롤러 기본 클래스는 JsonResponse를 생성하고 지정된 콘텐츠를 자동으로 인코딩하는 json() 메서드를 정의합니다. json()方法,来创建一个JsonResponse 并自动编码给定的内容:

        rrreee

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

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

        创建静态页面 ¶

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

        总结 ¶

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

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

        Serializer 서비스가 애플리케이션에서 활성화하면 json()에 전달된 콘텐츠가 자동으로 인코딩됩니다. 그렇지 않으면 json_encode 함수를 사용하는 것이 좋습니다.

        이제 Symfony 요청응답 <에 대해 알게 되었습니다. /code> 객체의 기초에 대한 자세한 내용은 HttpFoundation 구성 요소를 참조할 수도 있습니다.

        정적 페이지 생성하기 ¶
        🎜컨트롤러 없이 정적 페이지를 생성할 수 있습니다(라우트와 템플릿만 있으면 됩니다). 사용자 정의 컨트롤러를 사용하지 않고 템플릿을 렌더링하는 방법을 참조하세요. 🎜🎜요약 ¶🎜🎜페이지를 생성할 때 페이지에 일부 비즈니스 로직 코드를 작성해야 합니다. Symfony에서 이는 최종 Response 객체를 사용자에게 반환하기 위해 필요한 모든 작업을 수행하는 PHP 함수인 컨트롤러입니다. 🎜🎜그리고 Controller 기본 클래스를 상속하여 작업을 쉽게 할 수 있습니다. 예를 들어 컨트롤러에 HTML 코드를 작성하는 대신 render()를 사용하여 템플릿을 렌더링하고 템플릿의 콘텐츠를 반환할 수 있습니다. 🎜🎜다른 장에서는 데이터베이스에서 객체를 읽고 유지하고, 양식 제출을 처리하고, 캐싱을 작동하는 등의 작업에 컨트롤러를 사용하는 방법을 살펴보겠습니다. 🎜🎜Keep Going ¶🎜🎜 다음으로 Twig를 사용하여 템플릿을 렌더링하는 방법을 배우는 데 집중하세요. 🎜🎜