2

我试图service container在我的 Sonata Admin 类中注入它以便在configureFormFields方法中使用它。这就是我所拥有的:

config.yml(奏鸣曲服务定义)

services:
  tan.product.admin.product:
    class: Tan\ProductBundle\Admin\ProductAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, group: Product, label: Product }
    arguments: [ null, Tan\ProductBundle\Entity\Product, @service_container]

ProductAdmin.php

class ProductAdmin extends Admin
{

    /** @var \Symfony\Component\DependencyInjection\ContainerInterface */
    private $container;
    public $supportsPreviewMode = true;

    /**
     * @param string $code
     * @param string $class
     * @param string $baseControllerName
     */
    public function __construct($code, $class, $baseControllerName, $container = null)
    {
        parent::__construct($code, $class, $baseControllerName);
        $this->container = $container;
    }

    // other methods 

    protected function configureFormFields(FormMapper $form)
    {

        $helper = $this->container->get('oneup_uploader.templating.uploader_helper');
        $endpoint = $helper->endpoint('products');

        $form
                ->add('product_name', null, array('label' => 'Nombre'))
                ->add('product_description', null, array('label' => 'Descripción'));
    }

}

但我收到了这个错误:

ContextErrorException:可捕获的致命错误:无法将类 appDevDebugProjectContainer 的对象转换为 /var/www/html/tan/var/cache/dev/classes.php 第 12979 行中的字符串

那里有什么问题?

4

3 回答 3

4

由于您的构造函数采用 4 个参数,其中第 4 个是服务容器,因此您需要传入第 4 个服务容器:

services:
  tan.product.admin.product:
  class: Tan\ProductBundle\Admin\ProductAdmin
  tags:
      - { name: sonata.admin, manager_type: orm, group: Product, label: Product }
  arguments: [ null, Tan\ProductBundle\Entity\Product, null, @service_container]
于 2014-08-07T17:18:14.660 回答
3

尝试将第 4 个参数添加到 Admin 构造函数会导致我出错:

“传递给 AppBundle\Admin\WebLabAbstractMessageAdmin::__construct() 的参数 4 必须是 Doctrine\ORM\EntityManager 的一个实例,没有给出”无论我尝试将什么服务传递给参数。

所以我使用了调用方法:

#services.yml
app.admin.twitter_message:
    class: AppBundle\Admin\WebLabAbstractMessageAdmin
    arguments: [~, AppBundle\Entity\Twitter\Message, SonataAdminBundle:CRUD]
    tags:
        - { name: sonata.admin, manager_type: orm, group: operator, label: Message, show_in_dashboard: false }
    calls:
        - ["setEntityManager", ['@doctrine.orm.entity_manager']]
        - ["setParentRepository", ['@app.doctrine.repository.twitter.conversation']]

在管理类中使用设置器

#MessageAdmin.php
/**
 * @var EntityManager
 */
private $entityManager;

private $parentRepository;

/**
 * @param EntityManager $entityManager
 * @return self
 */
public function setEntityManager(EntityManager $entityManager): self
{
    $this->entityManager = $entityManager;
    return $this;
}

/**
 * @param $parentRepository
 * @return self
 */
public function setParentRepository($parentRepository): self
{
    $this->parentRepository = $parentRepository;
    return $this;
}

我的版本是:“symfony/symfony”:“3.2.*”、“sonata-project/admin-bundle”:“^3.10”。

希望它可以帮助某人。

于 2017-01-07T16:50:24.733 回答
1

如果您只想访问管理类中的容器,您可以简单地调用

$this->getConfigurationPool()->getContainer() 

这将简单地以正式方式返回容器为您的捆绑包创建一个基本管理类,它将扩展奏鸣曲的管理类,然后您可以在基本管理类中定义您的函数以返回一个容器并在您的子管理类中使用它,产品基本管理类看起来像

use Sonata\AdminBundle\Admin\Admin;

class ProductBaseAdmin extends Admin
{
    public function __construct($code, $class, $baseControllerName)
    {
            parent::__construct($code, $class, $baseControllerName);
    }
    public function getContainer(){
        return $this->getConfigurationPool()->getContainer();
    }
}

现在在您的子类中,您可以访问容器,通过$this->getContainer()该容器将调用您的类getContainer()的函数ProductBaseAdmin

use Tan\ProductBundle\Admin\ProductBaseAdmin
class ProductAdmin extends ProductBaseAdmin
{
    protected function configureFormFields(FormMapper $form)
    {

        $helper = $this->getContainer()->get('oneup_uploader.templating.uploader_helper');
        $endpoint = $helper->endpoint('products');

        $form
                ->add('product_name', null, array('label' => 'Nombre'))
                ->add('product_description', null, array('label' => 'Descripción'));
    }
}
于 2014-08-12T06:56:49.677 回答