__construct()必须实现接口错误

时间:2017-02-22 06:42:54

标签: php symfony sonata-admin

我使用symfony2和SonataAdminBundle,SonataMediaBundle和SonataClassificationBundle

现在我想要管理员面板的custmize设置,但我有这个错误。

 [Symfony\Component\Config\Exception\FileLoaderLoadException]                 
  Catchable Fatal Error: Argument 5 passed to Sonata\MediaBundle\Admin\BaseMe  
  diaAdmin::__construct() must implement interface Sonata\ClassificationBundl  
  e\Model\CategoryManagerInterface, none given, called in /Users/whitebear/Codin  
  gWorks/httproot/myapp/app/cache/de_/appDevDebugProjectContaine_.php on l  
  ine 9494 and defined in . (which is being imported from "/Users/whitebear/Codi  
  ngWorks/httproot/myapp/app/config/routing.yml").       

我所做的是两件事。

制作了DependencyInjection文件

应用程序/奏/ MediaBundle / DependencyInjection / ApplicationSonataMediaExtension.php

  <?php

namespace Application\Sonata\MediaBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */
class ApplicationSonataMediaExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}

然后为admin提供了services.yml

应用程序/奏/ MediaBundle /资源/配置/ services.yml

#Disable gallery & media menu from admin panel
services:
    sonata.media.admin.media:
        class: %sonata.media.admin.media.class%
        tags:
            - { name: sonata.admin, manager_type: orm, show_in_dashboard: false, label_catalogue: %sonata.media.admin.media.translation_domain% , label_translator_strategy: sonata.admin.label.strategy.underscore }
        arguments:
            - ~
            - %sonata.media.admin.media.entity%
            - %sonata.media.admin.media.controller%
            - "@sonata.media.pool"
            - %sonata.classification.manager.category% # add here.

        calls:
            - [setModelManager, ["@sonata.media.admin.media.manager"]]
            - [setTranslationDomain, [%sonata.media.admin.media.translation_domain%]]
            - [setTemplates, [{ inner_list_row: SonataMediaBundle:MediaAdmin:inner_row_media.html.twig , base_list_field: SonataAdminBundle:CRUD:base_list_flat_field.html.twig , list: SonataMediaBundle:MediaAdmin:list.html.twig , edit: SonataMediaBundle:MediaAdmin:edit.html.twig }]]

    sonata.media.admin.gallery:
        class: %sonata.media.admin.gallery.class%
        tags:
            - { name: sonata.admin, manager_type: orm, show_in_dashboard: false, label_catalogue: %sonata.media.admin.media.translation_domain% , label_translator_strategy: sonata.admin.label.strategy.underscore }
        arguments:
            - ~
            - %sonata.media.admin.gallery.entity%
            - %sonata.media.admin.gallery.controller%
            - "@sonata.media.pool"
        calls:
            - [setTranslationDomain, [%sonata.media.admin.media.translation_domain%]]
            - [setTemplates, [{ list: SonataMediaBundle:GalleryAdmin:list.html.twig }]]

在Sonata \ MediaBundle \ Admin \ BaseMediaAdmin

abstract class BaseMediaAdmin extends AbstractAdmin
{
    /**
     * @var Pool
     */
    protected $pool;

    /**
     * @var CategoryManagerInterface
     */
    protected $categoryManager;

    /**
     * @param string                   $code
     * @param string                   $class
     * @param string                   $baseControllerName
     * @param Pool                     $pool
     * @param CategoryManagerInterface $categoryManager
     */
    public function __construct($code, $class, $baseControllerName, Pool $pool, CategoryManagerInterface $categoryManager)
    {
        parent::__construct($code, $class, $baseControllerName);

        $this->pool = $pool;

        $this->categoryManager = $categoryManager;
    }

感谢@mdma 我想我必须将第5个参数作为CategoryManagerInterface传递给BaseMediaAdmin构造函数。

然后我更新了service.yml,但是我有这样的错误。

 [Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException]  
  The service "sonata.media.admin.media" has a dependency on a non-existent p   
  arameter "sonata.classification.manager.category". Did you mean one of thes   
  e: "sonata.classification.manager.category.class", "sonata.classification.m   
  anager.tag.class", "sonata.classification.manager.context.class", "sonata.c   
  lassification.manager.tag.entity", "sonata.classification.manager.category.   
  entity", "sonata.classification.manager.context.entity", "sonata.classifica   
  tion.admin.category.class"? 

它解决了。 我改变了这句话inservices.yml

- %sonata.classification.manager.category%"@sonata.classification.manager.category"

1 个答案:

答案 0 :(得分:2)

错误说:Sonata \ MediaBundle \ Admin \ BaseMediaAdmin :: __ construct()

中不存在参数5

因此,请查看sonata.media.admin.media服务配置中的参数。只有4个参数。你需要添加第5个。

在bundle config(https://github.com/sonata-project/SonataMediaBundle/blob/master/Resources/config/doctrine_orm_admin.xml)中,有5个参数:

<argument/>
<argument>%sonata.media.admin.media.entity%</argument>
<argument>%sonata.media.admin.media.controller%</argument>
<argument type="service" id="sonata.media.pool"/>
<argument type="service" id="sonata.media.manager.category" on-invalid="null"/>

所以,我认为你可以添加@ sonata.media.manager.category作为第五个参数。