シムノート

PHPフレームワークSymfonyの学習帳

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



このエントリーをはてなブックマークに追加

blog:2015-12-29:doctrine入門_implementing_more_requirements

Doctrine入門 : (4) 要件の実装を進める

前回に追加したUserとBugエンティティのCRUD処理を追加します。

メニューの修正

メニューを以下のように修正します。

<nav class="navbar navbar-default">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      {# ... #}
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li><a href="{{ path('product_index') }}">Product</a></li>
        <li><a href="{{ path('user_index') }}">User</a></li>
        <li><a href="{{ path('bug_index') }}">Bug</a></li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        {# ... #}
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>

User CRUD

UserエンティティのCRUDを生成します。

$ bin/console doctrine:generate:crud

The Entity shortcut name: AppBundle:User [Enter]
Do you want to generate the "write" actions [no]? yes [Enter]
Configuration format (yml, xml, php, or annotation) [annotation]: [Enter]
Routes prefix [/user]: [Enter]
Do you confirm generation [yes]? [Enter]

http://localhost:8000/user にアクセスしてUser CRUDの動作確認を行います。

Bug CRUD

BugエンティティのCRUDを生成します。

$ bin/console doctrine:generate:crud

The Entity shortcut name: AppBundle:Bug [Enter]
Do you want to generate the "write" actions [no]? yes [Enter]
Configuration format (yml, xml, php, or annotation) [annotation]: [Enter]
Routes prefix [/bug]: [Enter]
Do you confirm generation [yes]? [Enter]

Bug Createの修正

CRUDジェネレータで作成したBugの作成処理を修正して行きます。
新規作成フォームでreporter,engineer,productsを選択できる様にします。

Bugエンティティにstatusの定数を定義します。

// ...
class Bug
{
    const STATUS_OPEN = "OPEN";
    const STATUS_CLOSE = "CLOSE";
    const STATUSES = [self::STATUS_OPEN, self::STATUS_CLOSE];
    
    // ...
}

Formクラスを以下のように修正します。
DBのデータを選択肢にしたい場合は入力フィールドタイプにEntityTypeを使用します。
入力フィールドタイプやオプションの詳細はこちらを参照してください。

// ...
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use AppBundle\Entity\Bug;

class BugType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // 更新の時だけ、Statusを設定可能とする
        // 新規の時はStatusは"OPEN"をセットする為
        if ($builder->getData()->getId() !== null) {
            $builder->add('status', ChoiceType::class, [
                'choices' => Bug::STATUSES,
                'choice_label' => function ($value, $key, $index) {
                    return $value;
                },
            ]);
        }
        
        $builder
            ->add('description', TextareaType::class)
            ->add('engineer', EntityType::class, [
                'class' => 'AppBundle:User',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->orderBy('u.name', 'ASC');
                },
                'choice_label' => 'name',
                'placeholder' => '担当者を選択してください',
            ])
            ->add('reporter', EntityType::class, [
                'class' => 'AppBundle:User',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->orderBy('u.name', 'ASC');
                },
                'choice_label' => 'name',
                'placeholder' => '報告者を選択してください',
            ])
            ->add('products', EntityType::class, [
                'class' => 'AppBundle:Product',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('p')
                        ->orderBy('p.name', 'ASC');
                },
                'choice_label' => 'name',
                'expanded' => true,
                'multiple' => true,
            ])
        ;
    }    
    // ...    
}

Controller内のnewAction()statuscreatedをセットします。

// ...
class BugController extends Controller
{
    // ...
    public function newAction(Request $request)
    {
        // ...
        $form->handleRequest($request);
                
        if ($form->isSubmitted() && $form->isValid()) {
            $bug->setStatus(Bug::STATUS_OPEN);
            $bug->setCreated(new \DateTime("now"));

            $em = $this->getDoctrine()->getManager();
            $em->persist($bug);
            $em->flush();

            return $this->redirectToRoute('bug_show', array('id' => $bug->getId()));
        }
        // ...
    }
    // ...
}

フォームからPOSTされたパラメータは8行目のhandleRequest()の中で、$bugオブジェクトにセットされます。$engineer$reporter, $products等のエンティティのリファレンスもhandleRequest()が全てセットしてくれます。

動作確認

http://localhost:8000/user にアクセスして、UserのCRUDの動作確認を行います。
http://localhost:8000/bug/new にアクセスして、Bug Createの動作確認を行います。


Comments



210 -7 = ?
blog/2015-12-29/doctrine入門_implementing_more_requirements.txt · 最終更新: 2016/01/20 06:56 by tsubo