2012-04-24 31 views
13

Thay vì mở rộng bộ điều khiển chuẩn, tôi muốn tiêm Twig vào một trong các lớp học của tôi.Tiêm Twig làm dịch vụ trong Symfony2

Bộ điều khiển:

namespace Project\SomeBundle\Controller; 

use Twig_Environment as Environment; 

class SomeController 
{ 
    private $twig; 

    public function __construct(Environment $twig) 
    { 
     $this->twig = $twig; 
    } 

    public function indexAction() 
    { 
     return $this->twig->render(
      'SomeBundle::template.html.twig', array() 
     ); 
    } 
} 

và sau đó trong services.yml tôi có như sau:

project.controller.some: 
    class: Project\SomeBundle\Controller\SomeController 
    arguments: [ @twig ] 

Các lỗi tôi nhận được là:

SomeController :: __ construct () phải là một ví dụ của Twig_Environment, không có trường hợp nào được hiển thị

Nhưng tôi đang chuyển qua số @twig qua config. Tôi không thể nhìn thấy những gì tôi đang làm sai.

Edit:

Thêm vào mã đúng - đây là những gì cố định vấn đề:

// in `routing.yml` refer to the service you defined in `services.yml` 
project.controller.some 
    project_website_home: 
     pattern:/
     defaults: { _controller: project.controller.some:index } 
+0

Điều này có vẻ khá cũ, nhưng tôi đã tự hỏi như thế nào là bạn có thể đăng ký tất cả Extensions cành, các mã được tạo bởi SF2 có -> addExtension để thêm mã động đó. –

Trả lời

5
  1. Hãy thử xoá bộ nhớ cache của bạn.

  2. Tuyến đường của bạn có được thiết lập là refer to the controller as a service không? Nếu không, Symfony sẽ không sử dụng định nghĩa dịch vụ, và do đó bất kỳ đối số nào bạn chỉ định.

+0

cảm ơn. đó là tuyến đường trong routing.yml không đề cập đến dịch vụ. Đã cập nhật câu hỏi với mã từ routing.yml – ed209

+0

khi bạn có quyền truy cập vào vùng chứa, tính năng này dễ dàng chỉ $ this-> container-> get ('templating') -> render() – vodich

3

Trước hết, cho phép nhìn vào những gì đã có sẵn trong bao bì dịch vụ của bạn:

λ php bin/console debug:container | grep twig 
    twig                 Twig_Environment 
    ... 

λ php bin/console debug:container | grep templa 
    templating               Symfony\Bundle\TwigBundle\TwigEngine 
    ... 

Bây giờ chúng ta có lẽ sẽ đi cho TwigEngine lớp (dịch vụ khuôn mẫu) thay vì Twig_Enviroment (dịch vụ cành lá). Bạn có thể tìm thấy dịch vụ khuôn mẫu dưới vendor\symfony\symfony\src\Symfony\Bundle\TwigBundle\TwigEngine.php

... 
class TwigEngine extends BaseEngine implements EngineInterface 
{ 
... 

Trong lớp này, bạn sẽ tìm thấy hai phương pháp render (..) và renderResponse (...), có nghĩa là phần còn lại của mã của bạn nên làm việc tốt với các dưới đây ví dụ. Bạn cũng sẽ thấy rằng TwigEngine tiêm dịch vụ twig (Twig_Enviroment class) để xây dựng nó lớp cha mẹ BaseEngine. Có fore không cần phải yêu cầu dịch vụ twig và lỗi của bạn yêu cầu Twig_Environment nên biến mất.

Vì vậy, trong mã của bạn Bạn sẽ làm điều này như sau:

# app/config/services.yml 
services: 
    project.controller.some: 
     class: Project\SomeBundle\Controller\SomeController 
     arguments: ['@templating'] 

lớp học của bạn

namespace Project\SomeBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface; 
use Symfony\Component\HttpFoundation\Response; 

class SomeController 
{ 
    private $templating; 

    public function __construct(EngineInterface $templating) 
    { 
     $this->templating = $templating; 
    } 

    public function indexAction() 
    { 
     return $this->templating->render(
      'SomeBundle::template.html.twig', 
      array(

      ) 
     ); 
    } 
} 
Các vấn đề liên quan