当前位置: 首页 > 知识库问答 >
问题:

在Symfony2中使用树枝扩展的助手服务

拓拔泓
2023-03-14

我试图设置一个细枝过滤器,其工作方式如下:{{entities | fieldnames}},该过滤器将返回一个包含实体对象的属性名称的数组。我的问题是,经过几个小时的阅读和尝试,我无法执行$this-

错误:对/Users/a77/Dropbox/06中的非对象调用成员函数get()。Proyectos/2011 U-Vox/DEV U-Vox/Uvox Web/src/Acme/DemoBundle/Extension/FieldnamesTwigExtension。php第38行

或者如果构造不带=null Error ContextErrorException:Catchable致命错误:传递给Acme\DemoBundle\Extension\FieldnamesTwigExtension::\uuu construct()的参数1必须是Acme\DemoBundle\Extension\Container的实例,没有给定,在

服务。yml

服务:

helpers:
    class:        Acme\DemoBundle\Services\Helpers

twig.extension.acme.demo:
    class:        Acme\DemoBundle\Twig\Extension\DemoExtension
    arguments:    [twig.loader]

acme.demo.listener:
    class:        Acme\DemoBundle\EventListener\ControllerListener
    arguments:    [twig.extension.acme.demo]

fieldnames:
    class: Acme\DemoBundle\Extension\FieldnamesTwigExtension
    arguments:  [@service_container]

Extension\FieldnamesTwigExtension。php

use Symfony\Component\DependencyInjection\ContainerInterface as Container;
namespace Acme\DemoBundle\Extension;

class FieldnamesTwigExtension extends \Twig_Extension {
private $container;
public function __construct(Container $container=null)
{
    $this->container = $container;
    //var_dump ($container); exit; //  prints null !!!

}
 protected function get($service)
{
    return $this->container->get($service);
}

public function getFilters() {
    return array(
        'fieldnames' => new \Twig_Filter_Method($this, 'fieldnamesFilter'),
    );
}

public function getName() {
    return 'fieldnames_twig_extension';
}

public function fieldnamesFilter($obj) {
    if (is_array($obj)) {
        $first = $obj[0];

// GET (HELPERS) NOT WORKING :

       $fieldnames = $this->container->get("helpers")->getFieldnames($first);
        return $fieldnames;
    }
    return null;
}

public function twig_array_get_function($array, $name) {
    return $array[$name];
}

}

帮手。php

namespace Acme\DemoBundle\Services;

class Helpers {

public function sum($n1, $n2) {
    return $n1 + $n2;
}

public function getFieldnames($entities) {
    $reflect = new \ReflectionClass($entities[0]);
    $props = $reflect->getProperties();
    $fieldnames = Array();
    foreach ($props as $prop) {
        $fieldnames[] = $prop->getName();
    }
    return $fieldnames;
 }

}

AcmeDemoExtension.php

名称空间Acme\DemoBundle\DependencyInjection;

使用Symfony\Component\DependencyInjection\ContainerBuilder;使用Symfony\Component\DependencyInjection\Loader\YamlFileLoader;使用Symfony\Component\HttpKernel\DependencyInjection\Extension;使用Symfony\Component\Config\FileLocator;使用Symfony\Component\DependencyInjection\Definition;//补充

类AcmeDemoExtension扩展了{

public function load(array $configs, ContainerBuilder $container) {

    $definition = new Definition('Acme\DemoBundle\Extension\AccessTwigExtension');
    $definition->addTag('twig.extension');
    $container->setDefinition('access_twig_extension', $definition);

    $definition2 = new Definition('Acme\DemoBundle\Extension\FieldnamesTwigExtension');
    $definition2->addTag('twig.extension');
    $container->setDefinition('fieldnames_twig_extension', $definition2);


    $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
    $loader->load('services.yml');
}

public function getAlias() {
    return 'acme_demo';
}

 }

共有3个答案

柯骏
2023-03-14

在扩展\FieldnamesTwigExtension.php中,在use指令之后调用命名空间是否正常?

返回哪个错误Symfony?

贺刚毅
2023-03-14

你太难了。您应该将助手直接注入到您的小树枝扩展中。您还应该在服务中进行标记。yml。不在依赖项注入扩展中。

http://symfony.com/doc/current/cookbook/templating/twig_extension.html

服务。yml

fieldnames:
    class: Acme\DemoBundle\Extension\FieldnamesTwigExtension
    arguments:  [@helpers]
    tags:
        - { name: twig.extension }

并相应地调整代码的其余部分。

袁鸿雪
2023-03-14

我在我的应用程序上尝试了你的代码,但出现了相同的错误。要解决这个问题:

Acme\DemoBundle\DependencyInjection\AcmeDemoExtension。php

删除以下行:

$definition2 = new Definition('Acme\DemoBundle\Extension\FieldnamesTwigExtension');
$definition2->addTag('twig.extension');
$container->setDefinition('fieldnames_twig_extension', $definition2);

Acme\DemoBundle\Resources\config\services.yml

替换以下行:

fieldnames:
    class: Acme\DemoBundle\Extension\FieldnamesTwigExtension
    arguments:  [@service_container]

作者:

fieldnames:
    class: Acme\DemoBundle\Extension\FieldnamesTwigExtension
    arguments:  [@service_container]
    tags: [{ name: twig.extension }]
 类似资料:
  • 我正在尝试进行树遍历。(按顺序、按顺序和后顺序)这是我的代码。 我认为我插入值有问题,因为当我运行代码时,输出只是空的。有人能解释一下我哪里出错了吗? 在插入函数m中,将根节点和要插入的项作为参数。 然后我使用malloc创建一个新节点。 将数据插入新节点时,左、右为空,因为左和右当前不指向任何节点。 然后检查根是否为空。 如果为空,则 m 将新节点分配给根节点。 如果root不为空。(我不应该松

  • 我想问一下,是否可以在页面加载上扩展Watson Assistant聊天机器人?目前,当页面加载时,用户必须点击下面的小图标才能启动聊天机器人。 沃森助理聊天机器人图标 我使用的是Chrome,解决方案也应该在移动平台上运行。 到目前为止,我有以下带有聊天机器人脚本的空白页面:

  • 问题内容: 我有一个基类,我想在服务中进行扩展以帮助将数据输入角度范围。我已经在网上搜索了一种解决方案,但是没有找到我喜欢的解决方案。我有一个用于访问设备文件系统的基类 类结构: 我希望能够在几个不同的角度服务(即offlineCart,offlineCustomLists等)中扩展该类,其中每个服务都将能够使用存储库来存储各种不同的数据类型。我正在寻找最好,最合适的方式来做到这一点。在普通Jav

  • 问题内容: 我目前正在使用Selenium来运行Chrome实例来测试网页。每次我的脚本运行时,都会启动一个干净的Chrome实例(清理扩展程序,书签,浏览历史记录等)。我想知道是否可以使用Chrome扩展程序运行脚本。我曾尝试搜索Python示例,但是当我在Google上搜索时什么都没想到。 问题答案: 您应该使用Chrome WebDriver 选项设置要加载的扩展程序列表。这是一个例子: 希

  • 本文向大家介绍使用 iisext.vbs 禁用 Web 服务扩展的方法,包括了使用 iisext.vbs 禁用 Web 服务扩展的方法的使用技巧和注意事项,需要的朋友参考一下 应用到: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1 可以使用命令行脚本 iisext.vbs(存储于 systemro

  • 本文向大家介绍使用 Iisext.vbs 启用Web服务扩展的方法,包括了使用 Iisext.vbs 启用Web服务扩展的方法的使用技巧和注意事项,需要的朋友参考一下 应用到: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1 可以使用命令行脚本 iisext.vbs(存储于 systemroot\s