LoginSignup
1
1

More than 1 year has passed since last update.

EC-CUBE4 form 項目に独自の型を使う

Last updated at Posted at 2022-01-30

はじめに

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 のようなエラーが発生します。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1