2015-10-27 56 views
1

使用validation.yml進行定義時,我的驗證沒有被調用。 使用PHP或註釋一切正常。Symfony回調Yaml驗證

namespace AppBundle\Form; 

use Symfony\Component\Validator\Context\ExecutionContextInterface; 

class LoginForm 
{ 
    private $login; 
    private $password; 

    public function __construct($login, $password) 
    { 
     $this->login = $login; 
     $this->password = $password; 
    } 

    public function validate(ExecutionContextInterface $context) 
    { 
     $context->buildViolation('Error') 
      ->atPath('login') 
      ->addViolation(); 
    } 
} 

這是我validation.yml

AppBundle\Form\LoginForm: 
    constraints: 
     - Callback: [validate] 

這是我的控制器

class LoginController extends Controller 
{ 
    public function loginAction(Request $request) 
    { 
     if ($request->isMethod('POST')) { 
      $login = $request->request->get('loginform_login'); 
      $password = $request->request->get('loginform_password'); 
      $form = new LoginForm($login, $password); 
      $errors = $this->get('validator')->validate($form); 
      if (count($errors) > 0) { 
       return $this->render('login/error.html.twig'); 
      } 
      return $this->render('login/ok.html.twig'); 
     } 
     return $this->render('login/login.html.twig'); 
    } 
} 

上面的代碼總是返回 'OK',無論哪個登錄信息或密碼i型。 任何線索?

+0

你如何用其他兩種方法添加約束?你是否將它們添加到表單的'data_class'屬性中指定的類中? 我在食譜中看到的大多數例子以及我親身遇到的大多數情況都傾向於將約束添加到*特定*字段,而不是表單。所以我問。 – ReservedDeveloper

+0

如果我說得對,回調是類範圍的。我使用了其他的方法,如下所示:http://symfony.com/doc/current/reference/constraints/Callback.html – vbsessa

+0

這是真的,但範圍是實體類,在食譜示例中,不是表單類。您是否提供了完整的登錄表單?你有爲它設置的data_class(通過'configureOptions/setDefaultOptions'設置)嗎? – ReservedDeveloper

回答

3

您需要將validation.yml文件放入您的軟件包的Resources/config目錄中。

從Symfony 2.7開始,Symfony也會從Resources/config/validation目錄加載文件。

引述official docs

由於Symfony的2.7,位於束的資源/配置/驗證子目錄XML和YAML約束文件被加載。在2.7之前,只加載了Resources/config/validation.yml(或.xml)。

的有效路徑的一些例子:

  • SRC /的appbundle /資源/配置/ validation.yml
  • SRC /的appbundle /資源/配置/驗證/ foo.yml
+0

對不起,我對'app/Resources'和'src/AppBundle/Resources'感到困惑,默認情況下它不存在。 – vbsessa

+0

它總是簡單的答案... – ReservedDeveloper

+1

@vbsessa在我的回覆中看到你的評論,但懷疑你是爲了這裏的目的。正在發生加載的文件是[here](https://github.com/symfony/framework-bundle/blob/fab6822/DependencyInjection/FrameworkExtension.php#L770)。至於爲什麼採用這種方法時,其他組件可以在應用程序中全局查看/資源是一個更高層次的問題。這是猜想,但我懷疑它是Symfony的人工產物,它正在構建用於處理> 1捆綁的項目。只在一個全球位置尋找會導致交叉捆綁混合太多。 – ReservedDeveloper

1

根據我們在評論中的回顧和所提供的示例,與目前的食譜示例相比,一切都看起來不錯。我們堅定地在頭腦風暴/「看到什麼堅持」的舞臺上。以下是一些剩餘的想法:

  1. 您的validation.yml文件不能被分析/加載?您可以嘗試向該文件添加一些其他屬性級別的約束,以便將回調排除在外。

  2. 你可以嘗試lint:yaml CLI工具,雖然從以前的遭遇我預計任何格式不正確的YAML會拋出一個更明確的解析錯誤。 (尤其是在最近的文檔閃電戰之後),但是也許菜譜示例並不是最新的,並且配置行爲已經有所改變。

  3. 啓動XDebug並開始逐步驗證過程。確保你真的打你的驗證回調。如果沒有,請嘗試使用外部或靜態回調方法,以查看是否可以緩解問題。

除了上述任何一項,我會等待比我自己的更明智的答案,非常感興趣!

+0

我試過'登錄:NotBlank',它不工作。我認爲我的validation.yml沒有被加載。我對這個問題進行了搜索,並且我看到有人說config.yml中的這一行'validation:{enabled:true,enable_annotations:false}'應該這樣做,但事實並非如此。 :/ – vbsessa

+0

一個全新的項目應該已經包含一個validation.yml?因爲我不得不手動創建一個,它根本沒有被加載。 – vbsessa

+0

爲什麼所有資源(即非PHP文件)都可以存在於除validation.yml之外的應用程序/資源中?這有點奇怪,主要是在開發一個沒有捆綁的應用程序時。 – vbsessa