2016-02-02 36 views
5

próbuję tworzyć custom constraint w symfony 3Ograniczenie nie można umieścić na właściwości lub pobierające

mam błędach

Ograniczenie App \ Bundle \ MyBundle \ Validator \ Ograniczenia \ kodu nie można umieścić na właściwości lub pozyskiwaniu

<?php 
// vendor/app/mybundle/Validator/Constraints/Code.php 

namespace App\Bundle\MyBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 


class Code extends Constraint 
{ 
    public $message = 'Error validate message!!!'; 
    public function validatedBy() 
    { 
     return 'alias_name'; 
    } 

    public function getTargets() 
    { 
     //return self::CLASS_CONSTRAINT; // error "The constraint cannot be put on properties or getters" 
     return array(self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT); // working, but $value is a STRING!!! 
    } 
} 

My sprzedawca/app/mybundle/Validator/Ograniczenia/CodeValidator.php

<?php 
// vendor/app/mybundle/Validator/Constraints/CodeValidator.php 

namespace App\Bundle\MyBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 

class CodeValidator extends ConstraintValidator 
{ 
    public function validate($value, Constraint $constraint) 
    { 
     $value->getId(); // this code not working, because $value is STRING!! 
     $this->context->buildViolation($constraint->message) 
      ->atPath('code') 
      ->addViolation(); 
    } 

}

gdzie popełniłem błąd?

Odpowiedz

6

Spróbuj dodać do swojej Wiązanie:

/** 
* @Annotation 
* @Target({"PROPERTY", "METHOD", "ANNOTATION"}) 
*/ 

EDIT

Dziś rano, wziąłem czasu, aby spróbować na realizację nowej instalacji symfony 3.

Ponadto, jeśli dodać @AcmeAssert\Code na nieruchomości tak:

use AppBundle\Validator\Constraints as AcmeAssert; 

// ... 

/** 
* @var string 
* @AcmeAssert\Code 
* @ORM\Column(name="code", type="string") 
*/ 
private $code; 

tylko pole zostanie potwierdzone, więc $value reprezentuje wartość pola nieruchomości.
Na przykład, jeśli przypiszesz @AcmeAssert\Code do właściwości $code w swoim podmiocie, po przesłaniu formularza wartość $value walidatora będzie reprezentować wartość pola Twojej właściwości $code).

Jeśli dodać @AcmeAssert\Code na górze jednostki jak następuje:

use AppBundle\Validator\Constraints as AcmeAssert; 

/** 
* Foo 
* 
* @ORM\Table(name="foo") 
* @AcmeAssert\Code 
* @ORM\Entity(repositoryClass="AppBundle\Repository\FooRepository") 
*/ 
class Foo 

Następnie $ wartość będzie reprezentuje pełną jednostkę, i można zrobić wszystko walidacji chcesz przy użyciu pobierające.

Dodałem mój projekt testowy w repozytorium, można go używać, aby zobaczyć w jaki sposób korzystać z dwóch alternatyw: sf3-constraint-test

w moim przykładzie, jednostka AppBundle::Bar ma ograniczenia na nieruchomości, a AppBundle::Foo ma ograniczenie na cały byt.

Nadzieja, że ​​to jest to, czego potrzebujesz!

EDIT2

Jeśli jesteś w mapowaniu YAML użyć następujących do zastosowania ograniczenie na całej swojej jednostki oraz dostęp do pełnej obiektu przez $value w ograniczeniu:

AppBundle\Entity\AcmeEntity: 
    constraints: 
     - App\Bundle\MyBundle\Validator\Constraints\Code: ~ 

Na górę twojego mapowania.

A jeśli chcesz po prostu zastosować ograniczenie do jednej właściwości i uzyskać dostęp do wartości pola przy użyciu $value, pozostaw to, jak się masz i wykonaj swoją logikę na $value, która jest łańcuchem (wartość pola odpowiadającego właściwości entity ograniczone w mapowaniu), to coś takiego:

AppBundle\Entity\AcmeEntity: 
    properties: 
      # ... 
      code: 
       - App\Bundle\MyBundle\Validator\Constraints\Code: ~ 
+0

To nie pomogło :( – Neokortex

+0

Zmieniam mój wygląd @chalasr ponownie proszę – Neokortex

+0

Wprowadziłem zmiany dopasowane do Twoich potrzeb. – chalasr

4

Stworzyliście ograniczenie, które powinny być stosowane tylko do całej jednostki, takie jak:

/** 
* @AppAssert\SectionCode 
*/ 
class MyEntity 
{ 
    // ... 
} 

Jeśli chcesz, aby ograniczenie stosuje się do członków klasy, usunąć funkcję getTargets() całkowicie.

+0

co z @AppAssert \ SectionCode ("propertyName")? – chalasr

+0

nie sądzę, że będzie działać –

+0

@ Jason-rzymskiego mogę zmienić getTargets getTargets public function() { \t \t \t return array (self :: PROPERTY_CONSTRAINT, self :: CLASS_CONSTRAINT); \t} ale w metodzie validate() zmienna wartości $ nie jest obiektem mojego Podmiotu, jest ciągiem – Neokortex