Laravel 4 - 如何将绑定到容器的东西的实例注入控制器?

时间:2014-09-26 09:58:24

标签: php laravel laravel-4 dependency-injection inversion-of-control

我试图注入通过IoC容器管理的类的实例,并使用服务提供程序绑定。 register()方法如下所示,在设置这个对象时包含很多漏洞:

  public function register()
  {
    $this->app->bind('GoogleAnalytics', function($app)
    {
      if(!\File::exists(\Config::get('analytics.certificate_path')))
      {
        throw new \Exception("Can't find the .p12 certificate in: " . \Config::get('analytics.certificate_path'));
      }

      $config = array(
        'oauth2_client_id' => \Config::get('analytics.client_id'),
        'use_objects' => \Config::get('analytics.use_objects'),
      );

      $client = new \Google_Client($config);

      // $client->setAccessType('offline');

      $client->setAssertionCredentials(
        new \Google_Auth_AssertionCredentials(
          \Config::get('analytics.service_email'),
          \Google_Service_Analytics::ANALYTICS_READONLY,
          file_get_contents(\Config::get('analytics.certificate_path'))
        )
      );

      return new Analytics($client);
    });
  }

然后在我的控制器中,我希望通过IoC自动通过构造函数传递,虽然这不起作用,但我得到一个ReflectionException:Class not found错误。

class DashboardController extends BaseController {
  protected $analytics;

  public function __construct(GoogleAnalytics $analytics) {
        $this->analytics = $analytics;      
  }

我认为这应该是可能的吗? The comment by thepsion5 here似乎也暗示这应该有效。忽略其他问题(比如使用存储库等)对我出了什么问题的想法?

一如既往,我们非常感谢任何帮助/想法,并提前表示非常感谢: - )

1 个答案:

答案 0 :(得分:4)

通过类型提示自动注入时,必须存在类型提示。您的案例中是否存在GoogleAnalytics类/接口?我不猜。

此外,如果你是命名空间,请记住你必须app->bind('Full\Namespace\ClassName', ...),因为字符串中的所有类名都被视为它们在全局命名空间中。