2017-10-31 19 views
2

mySQLからENUMフィールドをシミュレートする検証のライフサイクルコールバックを持つようにEntityをセットアップしました。symfony検証コールバック - エラー時にプロパティ名を取得する方法?

エラーがスローされたときにプロパティ名が提供されず、その結果、Assertからのエラーの形式と一致しない点を除いて、正常に動作します。

UsedBundle \ AdController

:余りをアサートすることによって生成され、問題の性質を含んでいる間、最初のエラー以下の例で

は、コールバックから来ているとプロパティに関する情報を持っていません

$errors = $this->form_errors->getErrorMessages($form); 
     \Doctrine\Common\Util\Debug::dump($errors); 

array(3){[0] => string(14) "無効なドアです!" ["powerHp"] => array(1){[0] => string(32) "この値は50以上でなければなりません。 } ["price"] => array(1){[0] => string(34) "この値は1000以上にする必要があります。 }}

メッセージのためにエラーが発生している場所を知ることができますが、これはユーザーに出力するためにエラー変数を生成する関数をスローします。以下のように設定

は次のとおりです。

あなたのケースでは

UsedBundle \エンティティ\広告

namespace UsedBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Gedmo\Mapping\Annotation as Gedmo; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\Context\ExecutionContextInterface; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
/** 
* @ORM\Entity(repositoryClass="UsedBundle\Repository\AdRepository") 
* @ORM\HasLifecycleCallbacks 
* @ORM\Table(name="ads") 
*/ 
class Ad 
{ 

/** 
* @var integer 
* 
* @ORM\Id 
* @ORM\Column(type="smallint",length=4,unique=true,options={"unsigned":true}) 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

...... 

public static $valid_doors = array(
    '2' => '2', 
    '3' => '3', 
    '4' => '4', 
    '5' => '5', 
); 

/** 
* @Assert\Callback 
*/ 
public function validate(ExecutionContextInterface $context, $payload) 
{ 
    if (!in_array($this->getdoors(), self::$valid_doors)) { 
     $context->buildViolation('Invalid doors!') 
      ->atPath('doors') 
      ->addViolation(); 
    } 
} 
} 

答えて

0

(もちろん、あなたのsymfonyのバージョンは2.4その後、古いではない場合)、私が使用することを提案することができます静的な検証関数。静的関数を使うときは$オブジェクトを渡す必要があります!

/** 
* @static validate 
* 
* @param $object 
* @param ExecutionContextInterface $context 
*/ 
public static function validate($object, ExecutionContextInterface $context) 
{ 
    if (!in_array($object->getdoors(), self::$valid_doors)) { 
     $context->buildViolation('Invalid doors!') 
      ->atPath('doors') 
      ->addViolation(); 
    } 
} 

ご覧のとおり、注釈はありません/** @Assert\Callback */! さらに、クラス注釈@ORM\HasLifecycleCallbacksを書く必要はありません。 お手伝い願います!

Also - this is a link to official Symfony documentation

+0

ありがとう@staskrak。私はこれを動作させることはできませんでした。 $ objectパラメータを渡す方法は不明です。それかもしれない。私はバージョン3.2を使用しています。私はリンクされたドキュメントを知っていましたが、プロパティ名の問題は解決しません。 – BernardA

+0

@BernardA - > atPath( 'doors') - これはプロパティですが、エラーは関連します。 フォームが埋め込まれている場合は、Assert \ Valid()を使用する必要があります。アノテーション内の – staskrak

関連する問題