代码之家  ›  专栏  ›  技术社区  ›  kockburn

在Services.xml中将工厂类和工厂方法转换为工厂

  •  1
  • kockburn  · 技术社区  · 10 年前

    我正在使用Symfony3,我 noticed 那个 factory-class factory-method 不再存在,但 factory 确实存在。

    这相当令人沮丧,因为我想使用 pulse00/ffmpeg-bundle ,但是 services.xml 似乎是3.0之前的版本。

    factory-class and factory-method

    如您所见,4个红色标记的属性是问题所在:

    factory-class="%dubture_ffmpeg.ffmpeg.class%" factory-method="create"
    factory-class="%dubture_ffmpeg.ffprobe.class%" factory-method="create"
    

    示例(Symfony3版本):

    services:
        newsletter_manager:
            class:   NewsletterManager
            factory: [NewsletterManagerFactory, createNewsletterManager]
    

    问题:

    如何更新服务。xml,以便它与Symfony3正确工作?

    我所尝试的:

    我尝试过将两者结合起来,但没有太大成功 工厂 相反但显然,“工厂”也是不允许的。

    错误:

    $ php bin/console server:run 
    

    我得到的错误是:

    不允许属性“factory class”。

    error

    3 回复  |  直到 10 年前
        1
  •  4
  •   Nico Kaag    10 年前

    bundle的缺点,尤其是当前从2切换到3的情况下,您需要依赖它们的维护人员来更新代码以支持新版本。

    修复此问题的正常程序:

    • 分叉存储库
    • 在services.xml中应用修复程序
    • 提交拉取请求
    • 等待维护人员将其合并。

    如果维护人员没有响应您的拉取请求,或者您现在确实需要它。您可以将链接添加到作曲器中的分叉。json存储库列表。 https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository

    然后它将安装包含修复程序的分叉版本。

        2
  •  3
  •   chalasr    10 年前

    自从 factory-class factory-method 在Symfony中被弃用,
    您必须使用:

    XML:

    <services>
        <service id="dubture_ffmpeg.ffmpeg" class="NewsletterManager">
            <factory class="%dubture_ffmpeg.ffmpeg.class%" method="create" />
        </service>
    </services>
    

    或YAML:

    services:
        dubture_ffmpeg.ffmpeg:
            class:   NewsletterManager
            factory: [%dubture_ffmpeg.ffmpeg.class%, create]
    

    第一个参数表示 class 属性,第二个参数表示 method 属性

    看见 http://symfony.com/doc/current/components/dependency_injection/factories.html

        3
  •  0
  •   kockburn    10 年前

    我添加了 <factory></factory> 元素,并在其中定义了属性类和方法。现在,我能够毫无问题地运行服务器。

    <service id="dubture_ffmpeg.ffmpeg" class="%dubture_ffmpeg.ffmpeg.class%" lazy="true">
        <factory class="%dubture_ffmpeg.ffmpeg.class%" method="create"></factory>
        <argument type="collection">
            <argument key="ffmpeg.binaries">%dubture_ffmpeg.binary%</argument>
            <argument key="ffprobe.binaries">%dubture_ffprobe.binary%</argument>
            <argument key="timeout">%dubture_ffmpeg.binary_timeout%</argument>
            <argument key="ffmpeg.threads">%dubture_ffmpeg.threads_count%</argument>
        </argument>
        <argument id="logger" type="service"/>
    </service>
    
    <service id="dubture_ffmpeg.ffprobe" class="%dubture_ffmpeg.ffprobe.class%" lazy="true">
        <factory class="%dubture_ffmpeg.ffprobe.class%" method="create"></factory>
        <argument type="collection">
            <argument key="ffmpeg.binaries">%dubture_ffmpeg.binary%</argument>
            <argument key="ffprobe.binaries">%dubture_ffprobe.binary%</argument>
        </argument>
        <argument id="logger" type="service"/>
    </service>