Php 依赖项注入-调用未定义的方法-Laravel 4

Php 依赖项注入-调用未定义的方法-Laravel 4,php,dependency-injection,laravel-4,ioc-container,Php,Dependency Injection,Laravel 4,Ioc Container,我有一个Facade播放器,在那里我设置了一个函数信息,这个函数会给我播放器的信息,我的问题是当我通过依赖注入调用该函数时,它会抛出错误: 调用未定义的方法Team\Player\Facades\Player::info() 相反,如果我调用函数doingPlayer::info()它工作!为什么依赖性会让我犯这样的错误 跟着我班的球员 class Player { use Team\Player\Models\User; use Team\Player\Models\Team; use Te

我有一个Facade播放器,在那里我设置了一个函数信息,这个函数会给我播放器的信息,我的问题是当我通过依赖注入调用该函数时,它会抛出错误:

调用未定义的方法Team\Player\Facades\Player::info()

相反,如果我调用函数doing
Player::info()它工作!为什么依赖性会让我犯这样的错误

跟着我班的球员

class Player {

use Team\Player\Models\User;
use Team\Player\Models\Team;
use Team\Player\Models\Fighter;

  public function info($user_id)
  {
    return Fighter::with('team','user')->where('player_id','=',$user_id)->first();
  }

}
我试图呼叫dependecy的控制器

class MatchController extends BaseController {

    protected $match;
    protected $player;

    function __construct(Match $match,Player $player) { // dependency injection
        $this->match = $match;
        $this->player = $player;
    }

    public function getInfoPlayer() 
    {
        $player_id = Input::get('user_id');
        $player = $this->player->info($player_id);
        return View::make('site/team/event/scripts/infoPlayer')->withPlayer($player);
    }


}
以及我绑定类的服务提供商

public function register()
    {

         $this->app['player'] = $this->app->share(function($app)
      {
        return new Player;
      });

         $this->app->booting(function()
        {
          $loader = \Illuminate\Foundation\AliasLoader::getInstance();
          $loader->alias('Player', 'Team\Player\Facades\Player');
        });
    }

您没有显示文件中的所有名称空间和uses子句,冲突就在这里

但我可以从你给我们的信息中猜出一点:

如果你收到

 Call to undefined method Team\Player\Facades\Player::info()
当你这样做的时候

$player = $this->player->info($player_id);
是因为

function __construct(Match $match, Player $player) { // dependency injection
}
不知何故,是在告诉拉威尔实例化

Team\Player\Facades\Player
而不是使用已实例化的:

Team\Player\Player
那是

$this->app['player'];
所以,一种可能性是有一个

uses Team\Player\Facades\Player;
MatchController
类中。你应该去哪里

use Player;

但这将使Laravel注入一个新的
Team\Player\Player
实例,而不是
$this->app['Player']
,要做到这一点,您必须

function __construct(Match $match, PlayerInterface $player) {}
然后

App::bind('PlayerInterface', function($app) {
    return $app['player'];
});
嗯。。。差不多吧

编辑

您必须创建该接口,因为PHP会抱怨找不到它

放置此绑定的最佳位置是它自己的“app/bindings.php”文件,但您必须将其加载到
app/start/global.php

require app_path().'/filters.php';
require app_path().'/bindings.php';
您的控制器应如下所示:

uses Team\Player\PlayerInterface;

class MatchController extends BaseController {

    ...

    function __construct(Match $match, PlayerInterface $player) 
    {
       ...
    }

    public function getInfoPlayer() 
    {
       ...
    }

}
玩家类必须实现该接口:

class Player implements PlayerInterface {

    ...

}

我只能说非常感谢!!!!这是一个很好的解释,但我必须问一些关于它的问题。你绑定了PlayerInterface,但我没有应该创建的接口?哪里是绑定播放器界面的最佳位置?在serviceProvider文件上可以吗?是的,您必须创建一个(空)接口,因为PHP会抱怨找不到那个类或接口。刚刚编辑好以正确回答您的问题。好的,谢谢!但是我创建了这个接口,并按照您在答案中添加正确名称空间的方式对其进行了绑定,但它出现了一个错误,类PlayerInterface不存在,illumb\\Container\\Container.php,line":522. 对不起,我只是想更好地理解。干杯看起来您现在缺少一个用户,请再次编辑。谢谢!!非常感谢您的耐心,但现在出现了以下错误:参数2传递给MatchController::\uu construct()必须实现接口Team\\Player\\PlayerInterface,即Team\\Player\\Player的实例
class Player implements PlayerInterface {

    ...

}