通过服务渲染模板[Symfony 2]

时间:2014-09-04 07:03:00

标签: javascript php symfony

我正在使用symfony2中的自定义捆绑包。我是symfony2的新手。 我的任务是在网站的所有页面上加载JavaScript。 我查看了教程,发现可以通过创建服务来完成。 我创建了Service类。当我使用简单的静态函数时它工作正常。 然后,我为前 -

创建了一个函数
public function test(){



 $sett = json_encode($this->anotherfunction());   //returns array
   return $this->render('mybundle:Default:main.js.twig', array('sett'=>$sett) );  


    }

我在控制器中调用了这个函数,如

$this->get('my_service')->test();

我收到错误

Error: Call to a member function get() on a non-object in E:\xxampp\htdocs\path\vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php line 107 

编辑: 服务/ myservice.php

<?php

namespace Neil\myBundle\Services;



use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Config\FileLocatorInterface;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\FileLoader;
use Neil\MyBundle\Services;



class myService extends Controller {


    public function getHtmlCode(){

        $sett = json_encode(someArray());
        return $this->render('mybundle:Default:main.js.twig', array('sett'=>$sett) );      //This template loads javascript on page.
     //   return 'ssss';

    }

控制器

class DefaultController extends Controller
{



public function testAction(){

    $myService =  $this->get('my_service')->getHtmlCode();


    return $this->render('mybundle:Default:test.html.twig');

}

1 个答案:

答案 0 :(得分:0)

我认为在您的情况下有两个原因导致此错误:

  1. 如果查看基类Controller类实现,它会声明调用render服务生成模板的$this->container->get('templating')方法。我认为你应该注入ContainerInterface来调用模板服务或者直接注入tempplating为您的服务类提供服务..
  2. 您错过了扩展控制器中的基本Controller类;
  3. PS://如果向您展示服务类和控制器实现会更好。

    修改

    好吧,我不知道如何从服务类扩展控制器类(我从未尝试过:)),但我认为这不是一个好主意。因为它们是不同的东西。因此,如果您需要向服务类注入任何服务,则需要执行以下步骤:1.eread thisthis doc pages; 2.创建类和注入服务:

    // in this example we're injecting entity manager service 
    class myService {
    
        private $entityManager;
    
        // Constructor Injection
        public function __construct(EntityManagerInterface $entityManager)
        {
            $this->entityManager = $entityManager;
        }
    }
    
    1. 注册:
    2. (XML示例):

      <?xml version="1.0" encoding="UTF-8" ?>
      <container xmlns="http://symfony.com/schema/dic/services"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
      
          <services>    
              <service id="my_service" class="MYSERVICECLASS">
                  <argument type="service" id="doctrine.orm.entity_manager"/> <!-- we are injecting the above entity manager service -->
              </service>
          </services>
      </container>
      

      PS://如果您需要查看系统中可用的服务,可以在终端输入app/console container:debug(或使用特定字,例如:app/console container:debug | grep templating)输出。