我试图注入通过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似乎也暗示这应该有效。忽略其他问题(比如使用存储库等)对我出了什么问题的想法?
一如既往,我们非常感谢任何帮助/想法,并提前表示非常感谢: - )
答案 0 :(得分:4)
通过类型提示自动注入时,必须存在类型提示。您的案例中是否存在GoogleAnalytics
类/接口?我不猜。
此外,如果你是命名空间,请记住你必须app->bind('Full\Namespace\ClassName', ...)
,因为字符串中的所有类名都被视为它们在全局命名空间中。