Dependency injection 如何在Laravel方法中使用动态类型提示

Dependency injection 如何在Laravel方法中使用动态类型提示,dependency-injection,laravel-5.1,type-hinting,Dependency Injection,Laravel 5.1,Type Hinting,基本上,我希望使代码通用,并根据给定的路由参数使用不同的服务 实现这一目标的正确和有效的方法是什么? 以下工作: 路线: 同样有效: 路线 控制器 现在我想添加facebook,想法是: 路线 控制器 由于这不起作用,我尝试了以下几点,但失败了: 现在在控制器方法的定义中,我不能再使用类型提示,如果我尝试创建单独的方法alaauthorizeTwitter,我就不能用类型提示调用它。我尝试了以下几点: 路线-是一样的吗 控制器 此处的错误是“参数1传递给…”。。。必须是…的一个实例。。。Twit

基本上,我希望使代码通用,并根据给定的路由参数使用不同的服务

实现这一目标的正确和有效的方法是什么? 以下工作:

路线:

同样有效:

路线

控制器

现在我想添加facebook,想法是:

路线

控制器

由于这不起作用,我尝试了以下几点,但失败了:

现在在控制器方法的定义中,我不能再使用类型提示,如果我尝试创建单独的方法ala
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
    }
  }
}