2014-12-22 2 views
2

У меня есть класс, как это:Laravel автоматическое разрешение с параметрами

class PostValidator 
{ 
    public function __construct(Validator $validator, $data) 
    { 
      $this->validator = $validator; 
      $this->data = $data; 
    } 
} 

Я прочитал Laravel документ об автоматическом разрешении IoC, он дает пример:

class FooBar { 

    public function __construct(Baz $baz) 
    { 
     $this->baz = $baz; 
    } 

} 

$fooBar = App::make('FooBar'); 

Можно ли использовать App::make только без App::bind (с закрытием) для создания экземпляра класса, над которым также передается параметр $data?

ответ

3

Нет, вы не можете этого сделать.

Идея состоит в том, что вы передаете только зависимости конструктору, и, очевидно, data не один. Валидатор работает с данными, но не зависит от данных.

Вместо этого используйте setter для данных.

class PostValidator 
{ 
    public function __construct(Validator $validator) 
    { 
      $this->validator = $validator; 
    } 

    public function setData($data) 
    { 
      $this->data = $data; 
    } 
} 

и просто назвать это явно:

$validator = App::make('PostValidator'); 
$validator->setData($data); 

// or in the controller, which is what you're doing most likely 
public function __construct(PostValidator $validator) 
{ 
    $this->validaotr = $validator; 
} 

public function update($id) 
{ 
    $data = Input::only([ input that you need ]); 

    $this->validator->setData($data); 

    // run the validation 
    ... 
} 

редактировать: согласно комментарию, это то, что второй аргумент $parameters делает:

// Foo class with Eloquent Models as dependencies 
public function __construct(User $user, Category $category, Post $post) 
{ 
$this->user = $user; 
$this->category = $category; 
$this->post = $post; 
} 

затем IoC контейнер разрешить зависимостей в качестве вновь созданных моделей:

$foo = App::make('Foo'); 
$foo->user; // exists = false 
$foo->category; // exists = false 
$foo->post; // exists = false 

, но вы можете это сделать, если вы хотите:

$user = User::first(); 
$cat = Category::find($someId); 

$foo = App::make('Foo', ['category' => $cat, 'user' => $user]); 
$foo->user; // exists = true, instance you provided 
$foo->category; // exists = true, instance you provided 
$foo->post; // exists = false, newly instantiated like before 
+0

Спасибо за ваш ответ. Может быть, еще одна вещь, «App :: make» позволяет нам передать второй аргумент, для чего он используется? – xdim222

+0

Он используется для предоставления конкретных экземпляров, если вы хотите - проверьте редактирование. –

+0

Большое спасибо за ваше объяснение, я ценю это. – xdim222

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