symfony 3.1 检查是否安装了一个包

symfony 3.1 Check if a bundle is installed

我正在开发一个依赖于另一个的包。

为了处理未安装基本包的情况,我想在控制器中执行 "bundle_exists()" 功能。

问题是:如何获得已安装捆绑包的列表或如何检查捆绑包的名称(最终也是版本)。

谢谢。

您的 class 需要访问容器对象(通过扩展或 DI)。
那你可以做;

$this->container->getParameter('kernel.bundles');

这将为您提供已安装的捆绑包列表。

更新;
如果您在扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 的控制器中或在扩展 Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand 的命令 class 中,您可以只获取参数。

$this->getParameter('kernel.bundles').

Else @Wouter J 的回答是您的最佳答案。

您可以像这样从内核中获取所有 Bundle 的列表:

public function indexAction () 
{
    $arrBundles = $this->get("kernel")->getBundles();

    if (!array_key_exists("MyBundle", $arrBundles))
    {
        // bundle not found
    }

}

除了@Rooneyl 的回答:

进行此类检查的最佳位置是在 your DI extension 内(例如 AcmeDemoExtension)。一旦构建容器并将其转储到缓存,就会执行此操作。没有必要在每个请求上检查这样的东西(容器在缓存时不会改变),它只会减慢你的缓存。

// ...
class AcmeDemoExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $bundles = $container->getParameter('bundles');
        if (!isset($bundles['YourDependentBundle'])) {
            throw new \InvalidArgumentException(
                'The bundle ... needs to be registered in order to use AcmeDemoBundle.'
            );
        }
    }
}

安德烈在这个问题上:How do I get a list of bundles in symfony2?

如果你想调用注册包对象的非静态方法(不是class)那么你可以这样做:

$kernel = $this->container->get('kernel');
$bundles = $kernel->getBundles();
$bundles['YourBundleName']->someMethod();

其中 'YourBundleName' 是您的包的名称,您可以通过从控制台调用来获取:

php app/console config:dump-reference