symfony-bundle-plugins, 允许Symfony包有插件

分享于 

5分钟阅读

GitHub

  繁體 雙語
Allow Symfony bundles to have plugins
  • 源代码名称:symfony-bundle-plugins
  • 源代码网址:http://www.github.com/matthiasnoback/symfony-bundle-plugins
  • symfony-bundle-plugins源代码文档
  • symfony-bundle-plugins源代码下载
  • Git URL:
    git://www.github.com/matthiasnoback/symfony-bundle-plugins.git
    Git Clone代码到本地:
    git clone http://www.github.com/matthiasnoback/symfony-bundle-plugins
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/matthiasnoback/symfony-bundle-plugins
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    包插件

    By Noback

    Build StatusCoverage Status

    这个包通过引入一个插件系统来帮助你创建可以扩展包。 每个bundle插件都可以定义自己的服务和配置。 这基本上使你的包符合开/闭原则。

    设置

    在你的项目中运行这里库,方法是运行

    
    composer require matthiasnoback/symfony-bundle-plugins
    
    
    
    

    示例

    首先,你的包应该扩展 BundleWithPlugins。 你需要实现 getAlias 方法。 它应该返回你的bundle键( 就像它将在 config.yml 中使用的一样) 配置的NAME。

    useMatthiasBundlePluginsBundleWithPlugins;classDemoBundleextendsBundleWithPlugins{protectedfunctiongetAlias() {return'demo'; }}

    包的每个插件都应该实现 BundlePlugin:

    useMatthiasBundlePluginsBundlePlugin;useSymfonyComponentConfigDefinitionBuilderArrayNodeDefinition;useSymfonyComponentConfigFileLocator;useSymfonyComponentDependencyInjectionContainerBuilder;useSymfonyComponentDependencyInjectionContainerInterface;useSymfonyComponentDependencyInjectionLoaderYamlFileLoader;classFooPluginimplementsBundlePlugin{publicfunctionname() {return'foo'; }publicfunctionload(array$pluginConfiguration, ContainerBuilder$container ) {// load specific service definitions for this plugin,// just like you would do in a bundle extension$loader=newYamlFileLoader($container, newFileLocator(__DIR__));$loader->load('foo.yml');// $pluginConfiguration contains just the values that are relevant // for this plugin }publicfunctionaddConfiguration(ArrayNodeDefinition$pluginNode) {// add plugin-specific configuration nodes, // just like you would do in a bundle extension$pluginNode->children()->scalarNode('foo')->isRequired()->end(); }}

    AppKernel 类中实例化这个包时,你可以提供任意数量的BundlePlugin 实例:

    classAppKernelextendsKernel{publicfunctionregisterBundles() {returnarray(...,newDemoBundle(array(newFooPlugin())) ); }}

    如果需要一些插件,只需介绍一个 CorePlugin,并确保通过重写包方法的alwaysRegisteredPlugins() 来注册它:

    classDemoBundle{...protectedfunctionalwaysRegisteredPlugins() {returnarray(newCorePlugin()); }}

    register-编译器通过

    当一个包插件需要 register的编译器传递时,它可以在它的build() 方法中。

    classFooPluginimplementsBundlePlugin{...publicfunctionbuild(ContainerBuilder$container) {$container->addCompilerPass(...); }}

    启动插件

    引导主包时,插件也允许执行一些运行时初始化。 他们可以在 boot() 方法中做到这一点。 此时,完全初始化的服务容器可用:

    classFooPluginimplementsBundlePlugin{...publicfunctionboot(ContainerInterface$container) {// runtime initialization (will run when the kernel itself is // booted) }}

    简单插件

    如果你的插件非常简单( 例如。 只需要一个 load() 方法,只需让插件类扩展 SimpleBundlePlugin,其中包含接口方法中不需要的存根实现。

    谢谢

    @dennisdegreef 用于振兴这个项目的测试套件。


    相关文章