c33s/propel-di-behavior-bundle

该包已被弃用且不再维护。没有建议替代包。

为您的Propel模型提供干净的Symfony2依赖注入

v0.1.1 2015-05-08 15:35 UTC

This package is not auto-updated.

Last update: 2022-02-01 12:47:02 UTC


README

为您的Propel模型提供干净的Symfony2依赖注入

安装

此包依赖于 GlorpenPropelBundle。请先安装它。

在您的 composer.json 文件中需要 c33s/propel-di-behavior-bundle

{
    "require": {
        "c33s/propel-di-behavior-bundle": "@stable",
    }
}

将propel行为添加到您的propel配置中

# app/config/config.yml

propel:
    # ...
    
    behaviors:
        c33s_di:        vendor.c33s.propel-di-behavior-bundle.src.C33sPropelDependencyCollectorBehavior
        
        # Optional: add another "instance" for global usage that does not interfere with model-specific behavior instances
        c33s_di_global: vendor.c33s.propel-di-behavior-bundle.src.C33sPropelDependencyCollectorBehavior

app/AppKernel.php 中注册此包

    // app/AppKernel.php

    public function registerBundles()
    {
        return array(
            // ...

            new C33s\PropelDIBehaviorBundle\C33sPropelDIBehaviorBundle(),
        );
    }

用法

将行为添加到您的propel模型中 - 全局(使用 c33s_di_global 名称)或特定模型。您可以将Symfony2服务或参数注入任何 ModelQuery 类。每个定义由要注入的服务或参数名称(参数用%字符包围)组成,后面跟可选的getter方法和该方法的类型提示,用冒号分隔

  • logger:getLogger:\Psr\Log\LoggerInterface 注入Symfony2日志服务,通过 $model->getLogger()(或 $query->getLogger())使其可访问,并为getter提供 \Psr\Log\LoggerInterface 类型提示
  • logger 注入没有明确getter的Symfony2日志服务。使用 $model->getInjectedDependency('logger') 来访问它。
  • %locale%:getLocale:string 注入 locale 参数,提供访问它的 getLocale() 方法。

示例模式

<!-- my/Bundle/Resources/config/schema.xml -->

    <!-- this will inject the logger into ALL Propel model and query instances -->
    <behavior name="c33s_di_global">
        <parameter name="model" value="logger:getLogger:\Psr\Log\LoggerInterface" />
        <parameter name="query" value="logger:getLogger:\Psr\Log\LoggerInterface" />
    </behavior>

    <table name="book">
        <!-- this will inject the mailer and session into the Book instances and request_stack into BookQuery instances -->
        <behavior name="c33s_di">
            <parameter name="model" value="
                mailer:getMailer:\Swift_Mailer,
                session:getSession:\Symfony\Component\HttpFoundation\Session\Session,
            " />
            <parameter name="query" value="request_stack:getRequestStack:\Symfony\Component\HttpFoundation\RequestStack" />
        </behavior>
        
        <...>
    </table>

它如何工作

C33sPropelDIBehaviorBundlemodel.createquery.create 注册事件监听器,这些事件由 GlorpenPropelBundle 处理。在每次模型或查询创建时,将注入每个服务的匿名回调函数到类中,确保只能访问在模式中指定的服务。回调函数还确保不会实例化未实际使用的任何服务。

到目前为止,这是我在不干涉整个DI容器的情况下将特定的Symfony2依赖注入到Propel模型中的最干净的方法。