はじめに
DBAL Type を独自に増やした場合などの、フォームの作り方です。
※ EC-CUBE 特有の機能ではなく、Symfony の機能です。
※ DBAL Types を増やす方法はこちらから
ファイルの準備
app/Customize/Domain/Gender/Gender.php
<?php
declare(strict_types=1);
namespace Customize\Gender;
class Gender
{
public const MALE = 'male';
public const FEMALE = 'female';
/** @var string */
private $value;
public static function reconstruct(string $value): Gender
{
$gender = new self();
$gender->value = $value;
return $gender;
}
public function toScalar(): string
{
return $this->value;
}
}
app/Customize/Form/DataTransformer/GenderToStringTransformer.php
<?php
declare(strict_types=1);
namespace Customize\Form\DataTransformer;
use Customize\Gender;
use Symfony\Component\Form\DataTransformerInterface;
class GenderToStringTransformer implements DataTransformerInterface
{
/**
* Transforms an object (Gender) to a string.
*
* @param Gender|null $value
*/
public function transform($value): string
{
if ($value === null) {
return '';
}
return $value->toScalar();
}
/**
* Transforms a string to an object (Gender).
*
* @param string $value
*/
public function reverseTransform($value): ?Gender
{
if ($value === '' || $value === null) {
return null;
}
return Gender::reconstruct($value);
}
}
<?php
declare(strict_types=1);
namespace Customize\Form\Extension\Front;
use Customize\Gender;
use Customize\Entity\MyEntity;
use Customize\Form\DataTransformer\GenderToStringTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
class MyEntityType extends AbstractType
{
/** @var GenderToStringTransformer */
private $genderTransformer;
public function __construct(GenderToStringTransformer $genderTransformer)
{
$this->genderTransformer = $genderTransformer;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('gender', ChoiceType::class, [
'choices' => [
'男' => Gender::MALE,
'女' => Gender::FEMALE,
],
]);
$builder
->get('gender')
->addModelTransformer($this->genderTransformer);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => MyEntity::class,
]);
}
}
できあがり
GenderToStringTransformer
クラスが重要で、オブジェクトと文字列の変換が自動的に行われます。
この設定がない場合は、Catchable Fatal Error: Object of class Customize\Gender could not be converted to string
のようなエラーが発生します。