Я использую 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(),
Это странно.
Меня это не беспокоит, но они беспокоят моего клиента. Он мог бы «играть» там и что-то сломать, или просто захотеть удалить ненужные категории. Это проблема. Кроме того, почему бы вам не посоветовать это? Какие проблемы могут быть? Службы администратора не используются нигде. –
@GeorgeIrimiciuc Это похоже на машину. И вы полностью удалите заднее сиденье. Вы скажете себе, что это не проблема, в любом случае у вас не будет никаких пассажиров. И это не будет проблемой ... пока это не произойдет. Потому что в какой-то момент кто-то будет ожидать, что эти службы будут там и попытаются использовать их ... и когда они потерпят неудачу, они потеряют дни, пытаясь понять, что происходит. –
Это нормально, чтобы снять заднее сиденье, если автомобиль не предназначен для пассажиров. Если это то, что спрашивает покупатель. И в этом конкретном случае никто не упустит эти услуги. –