在Symfony2中,如何在Factory类中使用服务?

时间:2015-03-03 02:09:18

标签: symfony service factory guzzle chargify

我正在尝试为Chargify设置这个PHP库的Symfony实现https://github.com/johannez/chargify

我有点失去了最佳/正确的方法来设置它。

我认为我需要将Guzzle设置为服务,然后创建一个Chargify工厂并将其添加为服务。

我的问题是,在工厂类中,当我尝试使用Guzzle服务时,我收到致命错误

Fatal error: Using $this when not in object context in /symfony/src/Acme/ChargifyBundle/Factory/ChargifyFactory.php on line 8

这是我的工厂类

<?php
namespace Acme\ChargifyBundle\Factory;

class ChargifyFactory implements ChargifyFactoryInterface
{
    public static function build($type)
    {
        $client = $this->get('chargify.guzzle.client');

        $className = 'Chargify\\Controller\\' . ucfirst($type);

        if (class_exists($className)) {
            return new $className($client);
        }
        else {
            throw new Exception("Invalid controller type given.");
        }
    }
}

如果看到一些配置很有用,这是我的捆绑服务。

services:
    chargify.guzzle.client.curl_auth:
        class: %guzzle.plugin.curl_auth.class%
        arguments:
            api_key: %chargify_api_key%
    chargify.guzzle.client:
        class: %guzzle.client.class%
        tags:
            - { name: guzzle.client }
        calls:
            - [setBaseUrl, [%chargify_domain%]]
            - [addSubscriber, [@chargify.guzzle.client.curl_auth]]
        argument: %chargify_domain%
    chargify.factory:
        class: Acme\ChargifyBundle\Factory\ChargifyFactory
        arguments:
            - ["type"]
    chargify.customer:
        class: Acme\ChargifyBundle\Controller\CustomerController
        factory_class: Acme\ChargifyBundle\Factory\ChargifyFactory
        factory_method: build
        arguments:
            type: "customer"

如何使用

中的工厂中的guzzle客户端
$client = $this->get('chargify.guzzle.client');

编辑:

我根据@ alex的答案更改了代码,但我仍然收到错误。我认为这是因为该功能是静态的。我查看了文档,但是我无法看到我可以在没有静态函数的情况下设置工厂,当我摆脱静态时,我会遇到不同的错误。

Runtime Notice: Non-static method Acme\ChargifyBundle\Factory\ChargifyFactory::build() should not be called statically, assuming $this from incompatible context

这是从某些生成的代码抛出的

protected function getChargify_CustomerService()
{
    return $this->services['chargify.customer'] = \Acme\ChargifyBundle\Factory\ChargifyFactory::build('customer');
}

0 个答案:

没有答案