我正在使用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');
}
答案 0 :(得分:0)
我认为在您的情况下有两个原因导致此错误:
Controller
类实现,它会声明调用render
服务生成模板的$this->container->get('templating')
方法。我认为你应该注入ContainerInterface来调用模板服务或者直接注入tempplating为您的服务类提供服务.. PS://如果向您展示服务类和控制器实现会更好。
修改强>
好吧,我不知道如何从服务类扩展控制器类(我从未尝试过:)),但我认为这不是一个好主意。因为它们是不同的东西。因此,如果您需要向服务类注入任何服务,则需要执行以下步骤:1.eread this和this 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;
}
}
(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
)输出。