【问题标题】:Symfony2 - something other than bundleSymfony2 - 捆绑以外的东西
【发布时间】:2012-06-11 18:20:53
【问题描述】:

我目前正在处理我需要的东西而不是捆绑的项目。我称之为“模块”的东西。 它应该与捆绑包不同,因为当项目启动时系统不知道将使用哪个“模块” 以及它们将如何配置。

我还将使用这些类似于捆绑包的模块

$response = $this->forward('AcmeHelloModule:Hello:fancy');

$response = $this->forward('Acme/Hello:Hello:fancy');

这里是 HelloController->fancyAction();将被执行。这个控制器在文件 /src/modules/Acme/Hello/Controller/HelloController.php 中描述了说

那么问题是如何实现呢?

【问题讨论】:

  • 为什么不使用捆绑包? symfony 唯一知道的另一件事是供应商库,但它们不应该包含控制器代码。
  • 创建动态 CMS 需要“模块”,模块将安装在其中,例如在 Wordpress 中,也就是说,它们将由用户用鼠标完成
  • 这不能解释“为什么不捆绑”?实际上 Symfony2 只是将其模块称为“捆绑包”,但它们只不过是一种模块。 S2 没有提供在运行时包含捆绑包的解决方案并不意味着它完全错误(取决于实现;))
  • 那么,forward() 和 render() 方法的扩展存在问题?

标签: php frameworks symfony


【解决方案1】:

一种解决方案是实现一个可以动态安装、加载和运行您所谓的模块的 PluginBundle。

PluginBundle 根本不包含特定的插件代码,而是您的模块/插件的运行时环境。然后,您可以将启用的插件/模块保存在数据库中,并在运行时动态加载它们。

有了这个解决方案,应该可以创建一个动态插件机制,就像在 wordpress 中一样。在运行时修改 AppKernel 不是一个好的解决方案,因为您还必须在禁用包时清除缓存。

【讨论】:

    【解决方案2】:

    在 AppKernel 中添加如下方法:

    public function getBundle($name, $first = true)
    {
        if (substr($name, -6) == 'Module')) {
            return $this->getBundle('ModuleBundle')->getModule($name, $first);
        }
    
        return parent::getBundle($name, $first);
    }
    

    所有的逻辑都在 ModuleBundle 中运行。 但要确保响应的类型与 Kernel->getBundle();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2012-04-07
      相关资源
      最近更新 更多