尝试将Guzzle Curl客户端绑定到Laravel的服务容器 - 然后在尝试__construct()

时间:2015-06-04 21:21:23

标签: php laravel laravel-5 ioc-container type-hinting

所以我想我会尝试在Laravel中使用这个花哨的IoC容器。我从Guzzle开始,但我不能让它工作。也许我的理解存在差距。我非常感谢这里的任何帮助。

所以我有一个连接到RESTful Api的课程。这是一个样本:

    use GuzzleHttp\Exception\BadResponseException;
    use GuzzleHttp\Client;
    use GuzzleHttp\Subscriber\Oauth\Oauth1;

class EtApi {
    //you can pass in the model if you wanna
    //protected $model;

    //client Id
    protected $clientId;

    //client secret
    protected $clientSecret;

    //base_uri
    protected $getTokenUri;

    protected $client;

    //build
    function __construct(Client $client)
    {
        $this->client = $client;
        $this->clientId = 's0m3R4nd0mStr1nG';
        $this->clientSecret = 's0m3R4nd0mStr1nG';
        $this->getTokenUri = 'https://rest.api/requestToken';
        $this->accessToken = $this->getToken($this->clientId, $this->clientSecret, $this->getTokenUri);
    }

}

我已成功安装和使用Guzzle,方法是在$ client = new Client()等方法中新建它。但那不是很干,而且不是正确的做事方式。所以我在app \ Providers \ GuzzleProvider.php上创建了一个ServiceProvider。我确定这是在$providers = ['App\Providers\GuzzleProvider']下的app / config / app.php中注册的。这是提供者代码:

    <?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use GuzzleHttp\Client;
use GuzzleHttp\Subscriber\Oauth\Oauth1;

class GuzzleProvider extends ServiceProvider {

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
        $this->app->bind('Client', function () {
            return new Client;
        });
    }

}

因此,当我尝试访问我的EtApi方法时,在实例化期间加载失败(__construct),并出现以下错误。

ErrorException in EtApi.php line 23:
Argument 1 passed to App\EtApi::__construct() must be an instance of GuzzleHttp\Client, none given, called in /home/vagrant/webdocs/et_restful_test/app/Http/Controllers/EtConnectController.php on line 23 and defined

Laravel Masters是否知道为什么我不能使用此代码绑定Guzzle,而Laravel的魔法只会将obj注入构造函数中? [docs 1说我应该能够做到这一点。我肯定错过了什么。谢谢!

2 个答案:

答案 0 :(得分:3)

基于您问题中的信息,确实有点难以说明,但基于此

  

传递给App \ EtApi :: __ construct()的参数1必须是GuzzleHttp \ Client的实例,没有给出,在第23行的/home/vagrant/webdocs/et_restful_test/app/Http/Controllers/EtConnectController.php中调用和定义

听起来您直接在App\Eti的第23行直接实例化EtConnectController.php类,其代码看起来像这样

$api = new App\EtApi;

如果是这样的话,那么Laravel的依赖注入的关键部分就是你错过了。 Laravel无法改变标准PHP的行为 - 即如果你使用PHP的内置new关键字创建一个新类,那么Laravel永远不会在{{注入任何依赖项1}}。

如果您想利用依赖注入,还需要通过Laravel的应用容器实例化您的对象。有很多不同的方法 - 这里有两个

__construct

如果您这样做,Laravel将读取//$api = new App\EtApi; \App::make('App\EtApi'); //probably "the right" way $api = app()['App\EtApi'] 中的类型提示并尝试为您的对象注入依赖项。

答案 1 :(得分:0)

只需将注册功能更改为

即可
/**
 * Register the application services.
 *
 * @return void
 */
public function register()
{
    //
    $this->app->bind('GuzzleHttp\Client\Client', function () {
        return new Client;
    });
}

应该做的诀窍=&gt; IOC解析了fqcn而不是短的,所以将它暴露在你的容器中你需要将它绑定到fqcn!

希望它有所帮助!