Created
May 25, 2010 21:40
-
-
Save webmozart/413724 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use Symfony\Components\Form\Form; | |
use Symfony\Components\Form\FieldGroup; | |
use Symfony\Components\Form\ChoiceField; | |
use Symfony\Components\Form\TextField; | |
use Symfony\Components\Form\CheckboxField; | |
use Symfony\Components\Form\NumberField; | |
use Symfony\Components\Form\PasswordField; | |
use Symfony\Components\Form\DoubleTextField; | |
use Symfony\Components\Validator\Validator; | |
use Symfony\Components\Validator\ConstraintValidatorFactory; | |
use Symfony\Components\Validator\Constraints\Min; | |
use Symfony\Components\Validator\Constraints\Max; | |
use Symfony\Components\Validator\Constraints\MinLength; | |
use Symfony\Components\Validator\Constraints\MaxLength; | |
use Symfony\Components\Validator\Constraints\AssertType; | |
use Symfony\Components\Validator\Constraints\Email; | |
use Symfony\Components\Validator\Constraints\Choice; | |
use Symfony\Components\Validator\Constraints\Valid; | |
use Symfony\Components\Validator\Mapping\ClassMetadataFactory; | |
use Symfony\Components\Validator\Mapping\ClassMetadata; | |
use Symfony\Components\Validator\Mapping\Loader\LoaderChain; | |
use Symfony\Components\Validator\Mapping\Loader\StaticMethodLoader; | |
use Symfony\Components\Validator\Mapping\Loader\XmlFileLoader; | |
use Symfony\Components\Validator\MessageInterpolator\XliffMessageInterpolator; | |
use Symfony\Foundation\UniversalClassLoader; | |
// path pointing to Symfony 2 | |
define('SYMFONY_DIR', __DIR__); | |
require_once SYMFONY_DIR.'/src/Symfony/Foundation/UniversalClassLoader.php'; | |
class User | |
{ | |
public $firstName; | |
public $lastName; | |
public $email; | |
public $married = false; | |
public $age = 3; | |
public $gender = 'male'; | |
public $address; | |
public static function loadValidatorMetadata(ClassMetadata $metadata) | |
{ | |
$metadata->addPropertyConstraint('firstName', new MinLength(2)); | |
$metadata->addPropertyConstraint('lastName', new MinLength(2)); | |
$metadata->addPropertyConstraint('email', new Email()); | |
$metadata->addPropertyConstraint('age', new Min(6)); | |
$metadata->addPropertyConstraint('gender', new Choice(array('choices' => self::getGenders()))); | |
$metadata->addPropertyConstraint('address', new Valid()); | |
} | |
public static function getGenders() | |
{ | |
return array('male', 'female'); | |
} | |
} | |
class Address | |
{ | |
public $street; | |
public $zipCode; | |
public $city; | |
public static function loadValidatorMetadata(ClassMetadata $metadata) | |
{ | |
$metadata->addPropertyConstraint('street', new MinLength(6)); | |
$metadata->addPropertyConstraint('zipCode', new MinLength(4)); | |
$metadata->addPropertyConstraint('zipCode', new MaxLength(5)); | |
$metadata->addPropertyConstraint('zipCode', new AssertType('numeric')); | |
$metadata->addPropertyConstraint('city', new MinLength(3)); | |
} | |
} | |
class UserAdmin | |
{ | |
public $user; | |
public $hasAddress; | |
public $address; | |
public static function loadValidatorMetadata(ClassMetadata $metadata) | |
{ | |
$metadata->addPropertyConstraint('user', new Valid()); | |
$metadata->addPropertyConstraint('address', new Valid()); | |
} | |
public function __construct(User $user) | |
{ | |
$this->user = $user; | |
$this->hasAddress = ($this->user->address !== null); | |
$this->address = $this->hasAddress ? $this->user->address : new Address(); | |
} | |
public function persist() | |
{ | |
$this->user->address = $this->hasAddress ? $this->address : null; | |
// etc | |
var_dump($this->user); | |
} | |
} | |
\Locale::setDefault('de_AT'); | |
// initialize autoloader | |
$loader = new UniversalClassLoader(); | |
$loader->registerNamespace('Symfony', SYMFONY_DIR.'/src'); | |
$loader->register(); | |
// initialize validator | |
$metadataFactory = new ClassMetadataFactory(new LoaderChain(array( | |
new StaticMethodLoader('loadValidatorMetadata'), | |
new XmlFileLoader(SYMFONY_DIR.'/src/Symfony/Components/Form/Resources/config/validation.xml'), | |
))); | |
$validatorFactory = new ConstraintValidatorFactory(); | |
$messageInterpolator = new XliffMessageInterpolator(SYMFONY_DIR.'/src/Symfony/Components/Validator/Resources/i18n/messages.en.xml'); | |
$validator = new Validator($metadataFactory, $validatorFactory, $messageInterpolator); | |
// Note: the above code will be taken care of by the Symfony 2 core | |
// create new business object | |
$user = new User(); | |
$userAdmin = new UserAdmin($user); | |
// create form to interact with the business object | |
$form = new Form('admin', $userAdmin, $validator); | |
$userGroup = new FieldGroup('user'); | |
$userGroup->add(new TextField('firstName')); | |
$userGroup->add(new TextField('lastName')); | |
$userGroup->add(new DoubleTextField('email')); | |
$userGroup->add(new CheckboxField('married')); | |
$userGroup->add(new NumberField('age')); | |
$userGroup->add(new ChoiceField('gender', array('choices' => array_combine(User::getGenders(), User::getGenders())))); | |
$addressGroup = new FieldGroup('address'); | |
$addressGroup->add(new TextField('street')); | |
$addressGroup->add(new TextField('zipCode')); | |
$addressGroup->add(new TextField('city')); | |
$form->add($userGroup); | |
$form->add(new CheckboxField('hasAddress')); | |
$form->add($addressGroup); | |
// bind POST data to the form | |
if (isset($_POST['admin'])) | |
{ | |
$form->bind($_POST['admin']); | |
if ($form->isValid()) | |
{ | |
$userAdmin->persist(); | |
} | |
} | |
?> | |
<form action="#" method="post"> | |
<?php echo $form->renderErrors() ?> | |
<?php echo $form->render() ?> | |
<input type="submit" value="Submit" /> | |
</form> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The validator will most probably be created by the DIC and injected into the controller. When creating a form, you can thus simply refer to the controller property.
I will have a look at your project. Let me know if you find any more limitations or bugs.