シムノート

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

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



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

blog:2016-01-01:doctrine入門_updating_entities

Doctrine入門 : (8) エンティティの更新

Bugの表示画面にCloseボタンを追加して、StatusをCLOSEに変更する処理を追加します。

Entityの修正

Bugエンティティにメソッドを追加します。

class Bug
{
    // ...
    public function close()
    {
        $this->setStatus(self::STATUS_CLOSE);
    }

    public function isClose()
    {
        return $this->getStatus() == self::STATUS_CLOSE;
    }
}

Controllerの修正

BugController.phpにアクションメソッドを追加します。

// ...
class BugController extends Controller
{
    // ...

    /**
     * Close a Bug.
     *
     * @Route("/{id}/close", name="bug_close")
     * @Method("PUT")
     */
    public function closeAction(Request $request, $id)
    {
        $repository = $this->getDoctrine()->getRepository('AppBundle:Bug');
        $bug = $repository->find($id);

        if (!$bug) {
            throw $this->createNotFoundException('No bug found for id '.$id);
        }

        if ($this->isCsrfTokenValid('close_bug', $request->get('_token'))) {
            $em = $this->getDoctrine()->getManager();
            $bug->close();
            $em->flush();
        }

        return $this->redirectToRoute('bug_show', ['id' => $bug->getId()]);
    }
}

IdentityMap

DBからBugエンティティを取得した時、Doctrineは内部でIdentityMapにエンティティを登録します。これはエンティティが1度だけ読み込まれることを保証します。エンティティが参照された時は、まず、IdentityMapを探し、それを返します。


※上記画像はmartinfowler.comより

flush()が実行された時、EntityManagerはIdentityMap内の全てのエンティティをDBから取得した際のオリジナルのデータと比較し、変更があった項目だけを、DBにUPDATEします。

IdentityMapの概念に関しては以下のサイトが参考になります。
http://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?IdentityMap

Viewの修正

bug/show.html.twigを以下のように修正します。

{% extends 'base.html.twig' %}

{% block body %}
    {# ... #}
    
    {% if not bug.isClose %}
        <form action="{{ path('bug_close', {'id': bug.id}) }}" method="post" style="display: inline">
            {# HTTPのDELETEメソッドを指定 #}
            <input type="hidden" name="_method" value="PUT">
            {# CSRF対策のトークンを生成 #}
            <input type="hidden" name="_token" value="{{ csrf_token('close_bug') }}">

            <input class="btn btn-warning" type="submit" value="Close"/>
        </form>
    {% endif %}
{% endblock %}

動作確認

http://localhost:8000/bug にアクセスしてBug一覧からStatusがOPENのBugを表示します。Closeボタンを押してStatusが変更されるか確認します。


Comments



78 +10 = ?
blog/2016-01-01/doctrine入門_updating_entities.txt · 最終更新: 2016/01/20 06:58 by tsubo