2015-12-18 2 views
3

Я использую SonataAdminBundle с MediaBundle, который имеет зависимость от ClassificationBundle. По умолчанию ClassificationBundle добавляет управление бэкэнд-админом для категорий, тегов, коллекций и контекстов, но поскольку мое приложение не использует их, я хочу удалить их из меню и панели администратора.Как удалить услугу Symfony? (Соната Классификация)

Я никогда не удалял службу раньше, поэтому я не знаю, как это сделать.

Должен быть способ удалить эти службы с SonataClassificationBundle/Resources/config/admin.xml, очевидно, без изменения самого файла, поскольку это файл поставщика.

<services> 
     <service id="sonata.classification.admin.category" class="%sonata.classification.admin.category.class%"> 
      <tag name="sonata.admin" manager_type="orm" group="sonata_classification" label="label_categories" label_catalogue="%sonata.classification.admin.category.translation_domain%" label_translator_strategy="sonata.admin.label.strategy.underscore" /> 
      <argument /> 
      <argument>%sonata.classification.admin.category.entity%</argument> 
      <argument>%sonata.classification.admin.category.controller%</argument> 
      <argument type="service" id="sonata.classification.manager.context" /> 

      <call method="setTranslationDomain"> 
       <argument>%sonata.classification.admin.category.translation_domain%</argument> 
      </call> 

      <call method="setTemplates"> 
       <argument type="collection"> 
        <argument key="list">SonataClassificationBundle:CategoryAdmin:list.html.twig</argument> 
       </argument> 
      </call> 
     </service> 

     <service id="sonata.classification.admin.tag" class="%sonata.classification.admin.tag.class%"> 
      <tag name="sonata.admin" manager_type="orm" group="sonata_classification" label="label_tags" label_catalogue="%sonata.classification.admin.tag.translation_domain%" label_translator_strategy="sonata.admin.label.strategy.underscore" /> 
      <argument /> 
      <argument>%sonata.classification.admin.tag.entity%</argument> 
      <argument>%sonata.classification.admin.tag.controller%</argument> 

      <call method="setTranslationDomain"> 
       <argument>%sonata.classification.admin.tag.translation_domain%</argument> 
      </call> 
     </service> 

     <service id="sonata.classification.admin.collection" class="%sonata.classification.admin.collection.class%"> 
      <tag name="sonata.admin" manager_type="orm" group="sonata_classification" label="label_collections" label_catalogue="%sonata.classification.admin.collection.translation_domain%" label_translator_strategy="sonata.admin.label.strategy.underscore" /> 
      <argument /> 
      <argument>%sonata.classification.admin.collection.entity%</argument> 
      <argument>%sonata.classification.admin.collection.controller%</argument> 

      <call method="setTranslationDomain"> 
       <argument>%sonata.classification.admin.collection.translation_domain%</argument> 
      </call> 
     </service> 

     <service id="sonata.classification.admin.context" class="%sonata.classification.admin.context.class%"> 
      <tag name="sonata.admin" manager_type="orm" group="sonata_classification" label="label_contexts" label_catalogue="%sonata.classification.admin.context.translation_domain%" label_translator_strategy="sonata.admin.label.strategy.underscore" /> 
      <argument /> 
      <argument>%sonata.classification.admin.context.entity%</argument> 
      <argument>%sonata.classification.admin.context.controller%</argument> 

      <call method="setTranslationDomain"> 
       <argument>%sonata.classification.admin.context.translation_domain%</argument> 
      </call> 
     </service> 
    </services> 

Возможно, существует ли способ удалить их из пула администраторов Sonata? Так как они помечены sonata.admin?

EDIT

Использование Sonata Easy Расширяет я расширил сверток и добавил Compiler Pass:

class ApplicationSonataClassificationBundle extends Bundle 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function getParent() 
    { 
     return 'SonataClassificationBundle'; 
    } 

    public function build(ContainerBuilder $container) 
    { 
     parent::build($container); 

     $container->addCompilerPass(new CustomCompilerPass()); 
    } 

} 

Перевал компилятор выглядит следующим образом

class CustomCompilerPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     $container->removeDefinition('sonata.classification.admin.category'); 
    } 
} 

Но я м получение

You have requested a non-existent service "sonata.classification.admin.cate 
    gory" in . (which is being imported from "E:\svn\parkresort\app/config\rout 
    ing/sonata.yml"). 

Этого файл импортирует маршрутизацию для всей сонаты пачки

admin: 
    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml' 
    prefix: /admin 

_sonata_admin: 
    resource: . 
    type: sonata_admin 
    prefix: /admin 

#sonata media 
media: 
    resource: '@SonataMediaBundle/Resources/config/routing/media.xml' 
    prefix: /media 

Я думаю услуга используются сонатным администратором даже после извлечения из контейнера. Как я могу это изменить?

EDIT2

Я сделал это! Мне пришлось поместить пересылку компилятора в расширение админки Sonata (с ее пространством имен), а не в Sonata Media. Очевидно, что расширение пакета Admin. После этого он отлично справился.

То, что я действительно не понимаю, почему это работает, когда исходный пакет загрузки после моего расширенного пучка:

//AppKernel.php 
new ApplicationSonataAdminBundle(),//extended 
new Sonata\AdminBundle\SonataAdminBundle(), 

Это странно.

ответ

1

Поскольку мы говорим о пакете, который является зависимостью вашего приложения, вы не можете контролировать, какие службы он определяет и регистрирует в вашем приложении.

Я считаю, что их можно удалить, используя ContainerBuilder::removeDefinition(). Он будет работать и для сервисов, определенных в других пакетах, поэтому он будет работать на комплекте Sonata.

Вы можете увидеть пример в Symfony's documentation о том, где именно поставить этот код и как получить доступ к объекту ContainerBuilder.

Однако я советую вам не делать этого. Несмотря на то, что вы не будете использовать некоторые услуги, они вас не будут беспокоить, и, учитывая, что Symfony обслуживает сервисы, они не вызовут проблем с производительностью в производстве, я обещаю.

+0

Меня это не беспокоит, но они беспокоят моего клиента. Он мог бы «играть» там и что-то сломать, или просто захотеть удалить ненужные категории. Это проблема. Кроме того, почему бы вам не посоветовать это? Какие проблемы могут быть? Службы администратора не используются нигде. –

+0

@GeorgeIrimiciuc Это похоже на машину. И вы полностью удалите заднее сиденье. Вы скажете себе, что это не проблема, в любом случае у вас не будет никаких пассажиров. И это не будет проблемой ... пока это не произойдет. Потому что в какой-то момент кто-то будет ожидать, что эти службы будут там и попытаются использовать их ... и когда они потерпят неудачу, они потеряют дни, пытаясь понять, что происходит. –

+0

Это нормально, чтобы снять заднее сиденье, если автомобиль не предназначен для пассажиров. Если это то, что спрашивает покупатель. И в этом конкретном случае никто не упустит эти услуги. –

1

Вам нужно будет создать пропуск компилятора, чтобы удалить определение. Для того, чтобы сделать это, вы должны убедиться, что ваш комплект объявлен после сонаты. Если вы не можете это контролировать, то extend пакет Sonata и определите в нем пропуск компилятора.

+0

Это странно. Если я добавлю его после, я получаю ошибку в первом редактировании моего вопроса с помощью «Вы запросили несуществующую услугу». Но если я позволю ему сначала, а затем добавлю оригинальную Sonata в AppKernel.php, он будет работать нормально. –

0

Полгода спустя я нашел гораздо более чистый способ хранения сервисов в контейнере (потому что они где-то нужны), но не показывает их на панели администратора.

$definitionsNames = array('sonata.media.admin.media', 'sonata.media.admin.gallery_has_media', 'sonata.media.admin.gallery', 
     'sonata.classification.admin.category','sonata.classification.admin.tag','sonata.classification.admin.context','sonata.classification.admin.collection'); 

    foreach ($definitionsNames as $definitionName) { 
     $definition = $container->getDefinition($definitionName); 

     $tags = $definition->getTags(); 

     $tags['sonata.admin'][0]['show_in_dashboard'] = false; 
     $definition->setTags($tags); 

    } 

К сожалению, маршруты администратора по-прежнему доступны. Не проблема для моей стороны, но я считаю, что есть способы удалить их. Дело в том, что media_widget содержит ссылку на маршрут редактирования медиаредактора, поэтому его необходимо перезаписать, чтобы больше не показывать его. Затем необходимо переопределить админы Media, Gallery и GHM и переопределить функцию configureroutes() и удалить все маршруты. Тогда я считаю, что вы не можете получить доступ к чему-либо через администратора, но приложение все равно может использовать службы администратора, если они нужны где угодно.

Таким образом, я по-прежнему придерживаюсь рекомендации Раду о том, чтобы не удалять службы из контейнера.