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

时间:2015-12-11 23:38:57

标签: dependency-injection laravel-5.1 type-hinting

基本上我想使代码通用,并在给定的Route参数上使用不同的服务。

实现这一目标的正确和有效方法是什么?

以下作品:

路线:

Route::get('socialmediaAccount/authorize/twitter', function(TwitterApi $client){ return ['Works'];});

同样有效:

路线

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 ['???'];
    }
  }
}

由于这项工作没有成功,我尝试了以下操作失败:

现在在我的Controller方法的定义中,我不能再使用Type Hint了,如果我尝试创建单独的方法ala authorizeTwitter,我就无法使用Type Hint调用它。我试过以下:

路线 - 是相同的

控制器

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();
  }
}

这里的错误是'传递给...的参数1必须是... TwitterApi的实例,没有给出。

1 个答案:

答案 0 :(得分:1)

您无法在手动调用的方法上使用依赖项注入。仅适用于路线方法,因为路线方法将自动解决。

这说以下应该有效:

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
    }
  }
}