2014-12-22 37 views
2

我有這樣一個類:Laravel自動分辨率參數

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

我讀到的IoC自動解析Laravel文檔,它提供了一個例子:

class FooBar { 

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

} 

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

是否有可能只使用App::make沒有App::bind(有關閉)來實例化我的班級,同時也通過參數$data

回答

3

不,你不能那樣做。

這個想法是,你只將依賴關係傳遞給構造函數,顯然data不是。 Validator與數據一起工作,但不依賴於數據。

而是使用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