Php 依赖项注入-调用未定义的方法-Laravel 4
我有一个Facade播放器,在那里我设置了一个函数信息,这个函数会给我播放器的信息,我的问题是当我通过依赖注入调用该函数时,它会抛出错误: 调用未定义的方法Team\Player\Facades\Player::info() 相反,如果我调用函数doingPhp 依赖项注入-调用未定义的方法-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
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 {
...
}