在Factory.xml中将工厂级和工厂方法转换为工厂

时间:2016-01-19 16:10:01

标签: php ffmpeg symfony

我正在使用Symfony3和noticed factory-classfactory-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]

问题:

如何更新services.xml以使其与Symfony3一起正常工作?

我尝试了什么:

我尝试将两者结合起来并没有取得多大成功,而是使用factory代替。但也不允许“工厂”。

错误:

$ php bin/console server:run 

我得到的错误:

  

不允许使用'factory-class'属性。

error

3 个答案:

答案 0 :(得分:4)

捆绑包的缺点,特别是当前从2切换到3,是因为您依赖维护者来更新代码以支持新版本。

解决此问题的正常程序:

  • 分叉存储库
  • 在services.xml
  • 中应用此修复程序
  • 提交拉动请求
  • 等待维护者合并。

如果维护者没有响应您的请求,或者您现在真的需要它。您可以在composer.json存储库列表中添加指向fork的链接。 https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository

然后它会安装你的分叉版本,其中包含修复程序。

答案 1 :(得分:3)

由于Symfony中不推荐factory-classfactory-method,因此 你必须使用:

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

答案 2 :(得分:0)

我添加了<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>