Chapter 16

エンティティの数だけ13〜15を繰り返し

たつきち
たつきち
2022.07.29に更新

この章に対応するコミット

デモアプリは日本語と英語に対応するためすべての文字列リテラルを翻訳しているので、コミットの内容は本文の解説と若干異なります。

エンティティの数だけ13〜15を繰り返し

ここまでで、

  1. エンティティを作って
  2. CRUDを作って
  3. 機能テストを書く

という基本的な流れを見てきましたが、あとはこれをエンティティの数だけ繰り返していけばアプリの骨子は完成です👍

今回は例としてもう1つ 案件Project)というエンティティを作って、顧客 の配下に紐づきつつ、ユーザー が担当者として紐づくようにしてみましょう。

エンティティ

エンティティ関連のコードは以下のようになります。

// src/Entity/Project.php

namespace App\Entity;

use App\EntityConstant\ProjectConstant;
use App\EntityListener\ProjectListener;
use App\Repository\ProjectRepository;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass=ProjectRepository::class)
 * @ORM\EntityListeners({ProjectListener::class})
 */
class Project
{
    use TimestampableEntity;

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity=Customer::class, inversedBy="projects")
     * @ORM\JoinColumn(nullable=false)
     */
    public ?Customer $customer;

    /**
     * @ORM\Column(type="string", length=255)
     *
     * @Assert\NotBlank()
     * @Assert\Choice(callback={ProjectConstant::class, "getValidStates"})
     */
    public ?string $state = null;

    /**
     * @ORM\Column(type="string", length=255)
     *
     * @Assert\NotBlank()
     */
    public ?string $name = null;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    public ?string $note = null;

    /**
     * @ORM\ManyToOne(targetEntity=User::class, inversedBy="projects")
     */
    public ?User $user = null;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function __toString(): string
    {
        return $this->name;
    }
}
// src/EntityConstant/ProjectConstant.php

namespace App\EntityConstant;

final class ProjectConstant
{
    const STATE_INITIAL = '未着手';
    const STATE_WIP = '作業中';
    const STATE_COMPLETE = '完了';
    const STATE_CANCELED = '注意';

    public static function getValidStates(): array
    {
        return [
            self::STATE_INITIAL,
            self::STATE_WIP,
            self::STATE_COMPLETE,
            self::STATE_CANCELED,
        ];
    }
}
// src/EntityListener/ProjectListener.php

namespace App\EntityListener;

use App\Entity\Project;
use App\Service\Namer;
use Doctrine\ORM\Event\PreFlushEventArgs;

class ProjectListener
{
    private Namer $namer;

    public function __construct(Namer $namer)
    {
        $this->namer = $namer;
    }

    public function preFlush(Project $project, PreFlushEventArgs $event)
    {
        $project->name = $this->namer->beautify($project->name);
    }
}

CRUD・機能テスト

CRUDの実装と機能テストの作成については、これまで見てきた内容となんら変わりがないので解説は割愛します🙏

実際のコードを眺めてみてください。

動作確認

以下のような感じで、問題なくCRUDが出来上がりました🙌