2014-03-18 63 views
14

問題標題如下: 如何在使用Validator :: extend時訪問其他輸入屬性?如何訪問Validator :: extend中的其他輸入屬性?

在檢查了Laravel的內置Validator類後,我可以看到它使用$this->data來訪問其他屬性;但是您不能在Validator :: extend需要的閉包中直接使用$this

似乎手動擴展Validator類(通過自定義類)是唯一的選擇...我是否正確?如果是這樣的話,這對我來說就像是將驗證程序轉換爲包的嚴重限制,因爲每個包都會擴展基本Validator類,PHP最終會保留最後定義的擴展名(從而使其他驗證程序包不可用)。或者我錯過了什麼?

謝謝。

編輯

我也試圖把它包起來賈森·劉易斯以下this method一個包,但我不斷收到一個BadMethodCallException指出的驗證方法找不到......包是PSR-0我很確定這不是一個命名空間問題。

+2

你能夠使用'Input :: get()'來獲取你的閉包內的其他字段嗎? – duellsy

+0

我沒有真正考慮過直接通過它的外觀獲取輸入。而令人驚訝的是,這**做**工作......如果將它包裝在一個包中,我不太確定依賴於外觀是否可行? – Propaganistas

+0

使用'Input :: get()'的IMO非常黑客。如果您不想驗證不是來自請求的數據,會發生什麼情況?不完全是一個可重用的自定義驗證規則.. – SamV

回答

15

經過一些測試後,如果使用類而不是回調,則可以訪問數組。因爲它延伸了Validator類。

class TestRulesValidator extends \Illuminate\Validation\Validator 
{ 

    public function validateTestRule($attribute, $value, $parameters) 
    { 
     var_dump($this->data); 

     exit(); 
    } 

} 

validation documentation,使用方法:

Validator::resolver(function($translator, $data, $rules, $messages) { 
    return new TestRulesValidator($translator, $data, $rules, $messages); 
}); 

您的規則名稱將是test_rule。刪除validate關鍵字並轉換爲下劃線大小寫。

剛剛在新鮮安裝上測試過,它可以正常工作。

編輯 - 您也可以使用正常的extend方法並傳遞一個額外的參數。

class TestRulesValidator 
{ 

    public function validateTestRule($attribute, $value, $params, $validator) { 
     var_dump($validator->getData()); 
    } 

} 

Validator::extend('test_rule', '[email protected]'); 
+0

感謝您的回答。我早些時候探索了這個建議的解決方案,但是我偶然發現了一個'BadMethodCallException',說明找不到validateTestRule方法... – Propaganistas

+0

您是否嘗試過閱讀文檔並遵循那裏的示例? – SamV

+0

我目前無法對其進行測試,但我確實注意到您的答案和文檔中的答案有一點區別。您完全限定驗證方法爲Validator :: extend('bar','FooValidator @ validateBar')'而文檔只是指向'validate'前綴'Validator :: extend('bar','FooValidator @ validate' )'。 – Propaganistas

相關問題