Как удалить сервис Symfony? (Соната Классификация)

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

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

Должен быть способ удалить эти сервисы из 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?

РЕДАКТИРОВАТЬ

Используя Sonata Easy Extends, я расширил пакет и добавил пропуск компилятора:

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

Я это сделал! Пришлось поставить Compiler Pass в расширение Sonata Admin (с его пространством имен), а не в Sonata Media. Также расширение пакета администратора, очевидно. Сработало очень хорошо потом.

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

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

Это странно.

3

Решение

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

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

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

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

1

Другие решения

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

1

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

   $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 () и удалить все маршруты. Тогда я считаю, что вы не можете получить доступ к чему-либо через администратора, но приложение все равно может использовать службы администратора, если они нужны где-либо.

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

0
По вопросам рекламы [email protected]