2016-03-24 7 views
0

У меня есть фасад классDependency Injection Laravel

use App\Http\Response 

class RUser 
{ 
    public function signup(TokenGenerator $token_generator, $data) 
    { 
     $response = []; 
     $access_token = $token_generator->generate(32); 
     dd($access_token); 
     $user = User::create($data); 
     $response['user_id'] = $user->_id; 
     $response['']; 
    } 
} 

Теперь из моего UserController Я пытаюсь использовать функцию RUser::signup(), как показано ниже

class UserController extends Controller 
{ 
    public function store(Request $request) 
    { 
     $this->request = $request; 
     $payload = json_decode($this->request->getContent()); 
     if($this->validateJson('user.create', $payload)) { 
      $validator = Validator::make((array) $payload, User::$rules); 
      if ($validator->fails()) { 
       $messages = $validator->errors(); 
       return $this->sendResponse(false, $messages); 
      } 
      FUser::signup($payload); 
      return $this->sendResponse(true, $response); 
     } 
    } 
} 

Я думаю Laravel автоматически решает эту зависимость и я не shound пропустите экземпляр TokenGenerator явно. Но я получаю следующую ошибку.

Argument 1 passed to App\Http\Responses\RUser::signup() must be an instance of App\Utils\TokenGenerator, instance of stdClass given, called in 
+0

необходимо передать объект «TokenGenerator» в качестве первого параметра функции 'signup' –

+0

Есть ли что-то вроде привязки к Laravel IOC? –

ответ

0

Я думаю, вы смущены использованием фасадов и инъекций зависимостей. Вещь, за которой вы должны следовать, - это инъекция зависимости до моего знания, что вы можете использовать этот класс прямо здесь, и он будет работать без проблем TO have a clear idea of when to use facades and when to use dependency injection check this link

1

Laravel вводит экземпляры в пользовательские классы только в конструкторах по умолчанию. Действия контроллера также будут получать инъецируемые экземпляры.

Так что ваш пример будет нуждаться такие изменения, чтобы работать должным образом:

class RUser 
{ 
    protected $token_generator; 

    public function __construct(TokenGenerator $token_generator) 
    { 
     $this->token_generator = $token_generator; 
    } 

    public function signup($data) 
    { 
     $response = []; 
     $access_token = $this->token_generator->generate(32); 
     dd($access_token); 
     $user = User::create($data); 
     $response['user_id'] = $user->_id; 
     $response['']; 
    } 
} 

и

class UserController extends Controller 
{ 
    public function store(Request $request, RUser $ruser) 
    { 
     $this->request = $request; 
     $payload = json_decode($this->request->getContent()); 
     if($this->validateJson('user.create', $payload)) { 
      $validator = Validator::make((array) $payload, User::$rules); 
      if ($validator->fails()) { 
       $messages = $validator->errors(); 
       return $this->sendResponse(false, $messages); 
      } 
      $ruser->signup($payload); 
      return $this->sendResponse(true, $response); 
     } 
    } 
} 

Чтобы вызвать зависимость инъекций снаружи, когда вы экземпляр класса по своему усмотрению вам нужно вызвать make() метод Illuminate \ Foundation \ Application, например:

$fooBar = $this->app->make('FooBar'); 

См. Laravel docs

+0

Не работает: S 'Аргумент 1 передан в приложение \ Http \ Responses \ RUser :: __ construct() должен быть экземпляром App \ Utils \ TokenGenerator, не указанным, вызываемым в/var/www/html/myapp/app /Providers/RUserServiceProvider.php в строке 29 и define' –

+0

Возможно, вы инициализируете его вызывающим конструктором непосредственно в Провайдере. В таком случае инъекции зависимостей не произойдет. Вы можете создать его с помощью '$ ruser = $ this-> app-> make ('RUser');' construction. –

+0

Где я должен это делать? Если вы свободны, я создал новый вопрос со всеми кодами, чтобы люди могли знать, что происходит на http://stackoverflow.com/questions/36203271/laravel-di-not-working-when-using-in-facades- базовый класс –