【问题标题】:symfony 3.1 Check if a bundle is installedsymfony 3.1 检查是否安装了一个包
【发布时间】:2016-08-11 08:10:02
【问题描述】:

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

为了处理未安装基本包的情况,我想在控制器中执行“bundle_exists()”函数。

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

谢谢。

【问题讨论】:

  • 您可以在 app/AppKernel.php 文件中找到包含的捆绑包列表
  • 你在你的 bundle 的 composer.json 文件中声明了 bundle 为依赖吗?
  • 为了处理这种情况,将依赖项添加到 bundle 的 composer 文件中。

标签: symfony symfony-3.1


【解决方案1】:

除了@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.'
            );
        }
    }
}

【讨论】:

  • 这可以用来确保一个包在 AppKernel 中的另一个之前注册?
  • @ChristopheWillemsen 没有。但是注册的顺序不应该影响任何事情
  • 我同意,有些项目虽然有这样的强制措施(如 Akeneo Enterprise),然后可以作为其他解决方案的集成商进入循环。感谢您的回复。祝你有美好的一天和最美好的祝愿
  • 在 Symfony 4.x 中,参数是kernel.bundles
【解决方案2】:

您的类需要能够访问容器对象(通过扩展或 DI)。
那你就可以了;

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

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

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

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

否则@Wouter J 的答案是您的最佳答案。

【讨论】:

  • 扩展听起来真的很吓人,最好注入参数而不是注入完整的容器。
  • @WouterJ,公平点(我会给你一个赞成票)-我只是提供选择。如果这是一个控制器,它通常会扩展主控制器(除非设置为服务),而后者又会扩展 ContainerAware。
【解决方案3】:

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

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

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

}

【讨论】:

    【解决方案4】:

    来自 Andrey 的这个问题:How do I get a list of bundles in symfony2?

    如果要调用已注册的捆绑对象(不是类)的非静态方法,则可以执行以下操作:

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

    'YourBundleName' 是你的包的名称,你可以从控制台调用它:

    php app/console config:dump-reference
    

    【讨论】:

    • 为什么要将原始答案复制/粘贴到重复的问题中?
    • 如果重复的标志不被接受,答案可能很有用。你认为我不应该有?
    • 来自Help center:“关闭重复问题的基本目标是通过在一个地方获得所有这些答案来帮助人们找到正确的答案”这显然是这里的问题是:问题是:如何获得已安装捆绑包的列表?。我想补充一点,这个问题“没有显示任何研究工作”,因为只需在 symfony2 标记中使用“bundles list”进行搜索,它就会显示为第一个结果。也许像@Wouter_J 这样的专家用户可以给我们一个更好的解释。
    • 我真的很抱歉重复了一个已经回答的话题。当然,我对 Symfony 的了解不足并没有让我看到答案就在那里。再次抱歉。说到这里,我发现一些答案比上一个主题中的答案更具解释性,例如,我可以说 Rooneyl's、Wouter J's 和 Veas 给了我一个整体的想法。
    • 我想补充一点,有时如果您不知道如何在搜索中询问某些内容,则会导致您处于“没有显示任何研究工作”的位置。请不要对新手这么严格。
    猜你喜欢
    • 2013-03-23
    • 2010-11-06
    • 2020-10-01
    • 2011-07-08
    • 2015-03-06
    • 1970-01-01
    • 2021-11-23
    • 2017-04-13
    • 2012-03-28
    相关资源
    最近更新 更多