2014-01-22 3 views
1

У меня есть плеер Facade, где я настраивал информацию о функции, эта функция даст мне информацию о игроках, моя проблема заключается в том, что я вызываю эту функцию путем инъекции зависимостей бросить мне ошибку:Зависимость впрыска - вызов неопределенного метода - Laravel 4

вызов неопределенной метода Команда \ игрока \ \ Фасады игрока :: информация()

вместо этого, если я называю, что функция делает 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(); 
    } 

} 

Мой контроллер, где я стараюсь называть зависимые пакеты

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

ответ

3

Вы не отображая ВСЕ пространства имен и применяя предложения из ваших файлов, где конфликт.

Но я могу сделать немного догадку от того, что вы дали нам:

Если вы получаете

Call to undefined method Team\Player\Facades\Player::info() 

Когда вы

$player = $this->player->info($player_id); 

Это потому, что

function __construct(Match $match, Player $player) { // dependency injection 
} 

Говорит, почему-то, Laravel инстанцировать

Team\Player\Facades\Player 

Вместо того, чтобы использовать уже инстанцирован:

Team\Player\Player 

Что

$this->app['player']; 

Таким образом, одна возможность, имеющий

uses Team\Player\Facades\Player; 

В вашем MatchController классе , Где вы должны иметь

use Player; 

или

use Team\Player\Player; 

Но это заставит Laravel придать новый экземпляр Team\Player\Player и не $this->app['player'], чтобы сделать это, вам придется

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

И затем

App::bind('PlayerInterface', function($app) { 
    return $app['player']; 
}); 

Ну ... что-то в этом роде.

EDIT

Вы должны создать эту inteface, потому что 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 { 

    ... 

} 
+0

Я могу только сказать спасибо очень MUC час!!!! Это хорошее объяснение, но я должен кое-что спросить. Вы связываете PlayerInterface, но у меня нет этого Inteface, я должен его создать? который является лучшим местом для привязки интерфейса проигрывателя? это нормально в файле serviceProvider? – Fabrizio

+1

Да, вам нужно создать (пустой) интерфейс, потому что PHP будет жаловаться на то, что не найдет этот класс или интерфейс. Просто отредактирован, чтобы правильно ответить на ваши вопросы. –

+0

Хорошо, спасибо! Но я создал этот интерфейс и связал его с тем, как вы это сделали, отвечая на добавление правильного пространства имен, но он пришел с ошибкой, Class PlayerInterface не существует, Illuminate \\ Container \\ Container.php "," line ": 522. Извините, но я пытаюсь понять лучше. Cheers! – Fabrizio

Смежные вопросы