Dependency injection 如何在Laravel方法中使用动态类型提示
基本上,我希望使代码通用,并根据给定的路由参数使用不同的服务 实现这一目标的正确和有效的方法是什么? 以下工作: 路线: 同样有效: 路线 控制器 现在我想添加facebook,想法是: 路线 控制器 由于这不起作用,我尝试了以下几点,但失败了: 现在在控制器方法的定义中,我不能再使用类型提示,如果我尝试创建单独的方法alaDependency injection 如何在Laravel方法中使用动态类型提示,dependency-injection,laravel-5.1,type-hinting,Dependency Injection,Laravel 5.1,Type Hinting,基本上,我希望使代码通用,并根据给定的路由参数使用不同的服务 实现这一目标的正确和有效的方法是什么? 以下工作: 路线: 同样有效: 路线 控制器 现在我想添加facebook,想法是: 路线 控制器 由于这不起作用,我尝试了以下几点,但失败了: 现在在控制器方法的定义中,我不能再使用类型提示,如果我尝试创建单独的方法alaauthorizeTwitter,我就不能用类型提示调用它。我尝试了以下几点: 路线-是一样的吗 控制器 此处的错误是“参数1传递给…”。。。必须是…的一个实例。。。Twit
authorizeTwitter
,我就不能用类型提示调用它。我尝试了以下几点:
路线-是一样的吗
控制器
此处的错误是“参数1传递给…”。。。必须是…的一个实例。。。TwitterApi,未提供。您不能对手动调用的方法使用依赖项注入。仅适用于路由方法,因为路由方法将自动解析 这意味着以下几点应该起作用:
class SocialmediaController extends Controller
{
public function authorizeAccount($type, TwitterApi $twitterClient, FacebookApi $facebookClient)
{
if($type == 'twitter') {
// do Twitter authorization using $twitterClient here
}
if($type == 'facebook') {
// do Facebook authorization using $facebookClient here
}
}
}
为什么要从泛型方法调用单独的方法?看起来你有两条路线,有两个单独的动作。单一责任将是2条路线和2种方法,而不是1条路线和3种方法。谢谢你的提示,我不太清楚你是对的。我问题的第三部分是我在失败后尝试的最佳解决方案,即一条路线,一种方法;-)多亏了Koga的回答,我通过添加
公共函数authorizeAccount($type,TwitterApi$twitterClient,FacebookApi$facebookClient)找到了解决方案。
太棒了,我花了几个小时才想到这个问题。你能编辑你的答案,去掉两个私有方法,修改两个帐户行,比如$twitterClient->do Twitter auth stuff here
?这是我的初衷,也是我最终的做法。我通过删除私有方法简化了我的答案。那么现在的答案是否符合你的初衷呢?嗨,Koga,现在的问题是(也许在我要求你修改答案之前,你已经有了答案):我在这门课上有另一个方法。我如何从这里调用$this->authorizeAccount
?使用($type)
它不起作用,我还尝试了$twitter=$this->app['TwitterApi']。。同样适用于facebook
和授权账户($type、$twitter、$facebook)代码>这也不起作用。你知道如何做到这一点吗?使用构造函数并在此处指定TwitterApi和FacbookApi是正确的方法吗?下面是修订链接。在那里你可以看到我未经编辑的答案很好,您更愿意这样做,还是将依赖项注入放在构造函数中?
Route::get('socialmediaAccount/authorize/twitter', ['uses' => 'SocialmediaController@authorizeAccount']);
class SocialmediaController extends Controller
{
public function authorizeAccount(TwitterApi $client)
{
return ['Works as well'];
}
}
Route::get('socialmediaAccount/authorize/{type}', ['uses' => 'SocialmediaController@authorizeAccount']);
class SocialmediaController extends Controller
{
public function authorizeAccount($type)
{
if($type == 'twitter') {
$client->call TwitterApi-method(); //????????????
return ['???'];
}
if($type == 'facebook') {
$client->call FacebookApi-method(); //????????????
return ['???'];
}
}
}
class SocialmediaController extends Controller
{
public function authorizeAccount($type)
{
if($type == 'twitter') {
$this->authorizeTwitter();
return ['???'];
}
if($type == 'facebook') {
$this->authorizeFacebook();
return ['???'];
}
}
private function authorizeTwitter(TwitterApi $client) //????????????
{
call TwitterApi-method();
}
private function authorizeFacebook(FacebookApi $client) //????????????
{
call TwitterApi-method();
}
}
class SocialmediaController extends Controller
{
public function authorizeAccount($type, TwitterApi $twitterClient, FacebookApi $facebookClient)
{
if($type == 'twitter') {
// do Twitter authorization using $twitterClient here
}
if($type == 'facebook') {
// do Facebook authorization using $facebookClient here
}
}
}