
éšåããã²ãŒã·ã§ã³
Githubãããžã§ã¯ã
å¿ èŠãªããã¥ã¢ã«ã®äžéšãã€ã³ã¹ããŒã«ããæ¹æ³ã«ã€ããŠã¯ã ãªã³ã¯ã§ãªããžããªã®èª¬æãåç §ããŠãã ãã ã ïŒããšãã°ãåã®ã¬ãã¹ã³ãçµãã«ãã®ã¬ãã¹ã³ããå§ãããå ŽåïŒ
ããŒã ããŒãž
ãã®éšåã¯ãããŒã ããŒãžãäœæããããšããå§ããŸãã éåžžã®ããã°ã§ã¯ããšã³ããªã¯éåžžãæ°ãããã®ããå€ããã®ãžãšäžŠã¹æ¿ããããŸãã ããã°ããŒãžã®ãªã³ã¯ããæçš¿å šäœãå©çšã§ããŸãã ãã§ã«ããŒã ããŒãžã®ã«ãŒããã³ã³ãããŒã©ãŒããã£ã¹ãã¬ã€ãäœæããŠãããããç°¡åã«æŽæ°ã§ããŸãã
ã¬ã³ãŒããååŸããŸãã ããŒã¿ããŒã¹ã¯ãšãªã®å®è¡ã
ããã°ãšã³ããªã衚瀺ããã«ã¯ãããŒã¿ããŒã¹ããããããæœåºããå¿ èŠããããŸãã Doctrine 2ã¯ãã®ç®æšãéæããããã«Doctrine Query LanguageïŒDQLïŒãšQueryBuilderãæäŸããŸãïŒDoctrine 2ãä»ããŠéåžžã®SQLã¯ãšãªãäœæããããšãã§ããŸãããDoctrine 2ãæäŸããããŒã¿ããŒã¹æœè±¡åããç§ãã¡ãé ãããããããã®æ¹æ³ã¯æšå¥šãããŸãããããŒã¿ããŒã¹ã¯ãšãªã«äœ¿çšã§ããDQLãçæããããã®åªãããªããžã§ã¯ãæåã®æ¹æ³ãæäŸãããããQueryBuilderã䜿çšããŸããsrc
src/Blogger/BlogBundle/Controller/PageController.php
ã«ããããŒãžã³ã³ãããŒã©ãŒã®indexActionã¡ãœãããæŽæ°ããŸãããã ba ããŒã¿ããã
次ã®ã³ãŒãã貌ãä»ããŸã
// src/Blogger/BlogBundle/Controller/PageController.php class PageController extends Controller { public function indexAction() { $em = $this->getDoctrine() ->getManager(); $blogs = $em->createQueryBuilder() ->select('b') ->from('BloggerBlogBundle:Blog', 'b') ->addOrderBy('b.created', 'DESC') ->getQuery() ->getResult(); return $this->render('BloggerBlogBundle:Page:index.html.twig', array( 'blogs' => $blogs )); } // .. }
ãŸããManagerããQueryBuilderã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸããã ããã«ãããQueryBuilderãæäŸããå€ãã®ã¡ãœããã䜿çšããŠã¯ãšãªã®äœæãéå§ã§ããŸãã å©çšå¯èœãªã¡ãœããã®å®å šãªãªã¹ãã«ã€ããŠã¯ãQueryBuilderã®ããã¥ã¡ã³ããåç §ããŠãã ããã ãã«ããŒã¡ãœããããå§ããã®ãæåã§ãã ãããã®ã¡ãœããã¯ãselectïŒïŒãfromïŒïŒãããã³addOrderByïŒïŒã§ãã 以åã®Doctrine 2ãšã®ããåããšåæ§ã«ãçã泚éã䜿çšããŠBloggerBlogBuâândleçµç±ã§Blogãšã³ãã£ãã£ãåç §ã§ããŸãïŒBlog ïŒããã¯Blogger \ BlogBuâândle \ Entity \ Blogãšåãã§ãïŒ ã å®äºããããã¯ãšãªã®æ¡ä»¶ãæå®ããDQLã€ã³ã¹ã¿ã³ã¹ãè¿ãgetQueryïŒïŒã¡ãœãããåŒã³åºããŸãã QueryBuilderãªããžã§ã¯ãããçµæãååŸããããšã¯ã§ããŸãã;åžžã«æåã«ãããDQLã€ã³ã¹ã¿ã³ã¹ã«å€æããå¿ èŠããããŸãã DQLãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã¯ãããã°ãšã³ããªã®ã³ã¬ã¯ã·ã§ã³ãè¿ãgetResultïŒïŒã¡ãœãããæäŸããŸãã DQLãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãgetSingleResultïŒïŒãgetArrayResultïŒïŒãªã©ãçµæãè¿ãããã®ã¡ãœãããå€æ°ããããšãåŸã§ããããŸãã
ãã£ã¹ãã¬ã€
ã¬ã³ãŒãã®ã³ã¬ã¯ã·ã§ã³ãã§ããã®ã§ããããã衚瀺ããå¿ èŠããããŸãã
src/Blogger/BlogBundle/Resources/views/Page/index.html.twig
ã«ããããŒã ããŒãžã®ã³ã³ãã³ãã眮ãæã
src/Blogger/BlogBundle/Resources/views/Page/index.html.twig
次ã®ããã«
{# src/Blogger/BlogBundle/Resources/views/Page/index.html.twig #} {% extends 'BloggerBlogBundle::layout.html.twig' %} {% block body %} {% for blog in blogs %} <article class="blog"> <div class="date"><time datetime="{{ blog.created|date('c') }}">{{ blog.created|date('l, F j, Y') }}</time></div> <header> <h2><a href="{{ path('BloggerBlogBundle_blog_show', { 'id': blog.id }) }}">{{ blog.title }}</a></h2> </header> <img src="{{ asset(['images/', blog.image]|join) }}" /> <div class="snippet"> <p>{{ blog.blog(500) }}</p> <p class="continue"><a href="{{ path('BloggerBlogBundle_blog_show', { 'id': blog.id }) }}">Continue reading...</a></p> </div> <footer class="meta"> <p>Comments: -</p> <p>Posted by <span class="highlight">{{blog.author}}</span> at {{ blog.created|date('h:iA') }}</p> <p>Tags: <span class="highlight">{{ blog.tags }}</span></p> </footer> </article> {% else %} <p>There are no blog entries for symblog</p> {% endfor %} {% endblock %}
Twigå¶åŸ¡æ§é ã®1ã€ã for..else..endforãå°å ¥ããŸãã ã ãã³ãã¬ãŒããšã³ãžã³ã䜿çšããããšããªãå Žåã¯ããããã次ã®PHPã³ãŒãã«ç²ŸéããŠããã§ãããã
<?php if (count($blogs)): ?> <?php foreach ($blogs as $blog): ?> <h1><?php echo $blog->getTitle() ?><?h1> <!-- rest of content --> <?php endforeach ?> <?php else: ?> <p>There are no blog entries</p> <?php endif ?>
Twig for..else..endforå¶åŸ¡æ§é ã¯ããããå®çŸããç°¡åãªæ¹æ³ã§ãã ããŒã ããŒãžãã³ãã¬ãŒãã®ã»ãšãã©ã®ã³ãŒãã¯ãHTML圢åŒã®ããã°æ å ±ã®åºåã«é¢ãããã®ã§ãã ãã ããèæ ®ãã¹ãç¹ãããã€ããããŸãã æåã«ãTwigãã¹é¢æ°ã䜿çšããŠã«ãŒããäœæããŸãã ããã°ããŒãžã«ã¯URLã«æž¡ããããšã³ããªã®IDãå¿ èŠãªã®ã§ãåŒæ°ãšããŠãã¹é¢æ°ã«æ¿å ¥ããå¿ èŠããããŸãã ããã¯ã次ã®ã³ãŒãã¹ããããã§ç¢ºèªã§ããŸãã
<h2><a href="{{ path('BloggerBlogBundle_blog_show', { 'id': blog.id }) }}">{{ blog.title }}</a></h2>
次ã«ã次ã䜿çšããŠã³ã³ãã³ããè¿ããŸã
<p>{{blog.blog(500) }}</p>
æ°å€500ã¯ãé¢æ°ããååŸãããæ倧ã®ãã¹ãã®é·ãã§ãã ãããè¡ãã«ã¯ãDoctrine 2ã以åã«çæããgetBlogã¡ãœãããæŽæ°ããå¿
èŠããããŸãã èŠã€ãã£ãããã°ãšã³ãã£ãã£ã®getBlogã¡ãœãããæŽæ°ããŸã src/Blogger/BlogBundle/Entity/Blog.php
// src/Blogger/BlogBundle/Entity/Blog.php public function getBlog($length = null) { if (false === is_null($length) && $length > 0) return substr($this->blog, 0, $length); else return $this->blog; }
getBlogã¡ãœããã¯ããã°æçš¿å šäœãè¿ãå¿ èŠããããããããã©ã«ãå€nullãæã€ãã©ã¡ãŒã¿ãŒ$ lengthãèšå®ããŸãã nullãæž¡ããããšãã¬ã³ãŒãå šäœãè¿ãããŸãã
ãã©ãŠã¶ã«localhostïŒ8000ãšå ¥åãããšãããŒã ããŒãžã«ææ°ã®ããã°ãšã³ããªã衚瀺ãããŸãã ãŸãããšã³ããªã®ã¿ã€ãã«ãã¯ãªãã¯ããããã Continue reading ... ããªã³ã¯ãã¯ãªãã¯ããŠãå®å šãªããã°ãšã³ããªã«ç§»åããæ©äŒãå¿ èŠã§ã ã

ã³ã³ãããŒã©ã®ãšã³ããªããªã¯ãšã¹ãã§ããŸãããããã¯ããã«æé©ãªå Žæã§ã¯ãããŸããã ãªã¯ãšã¹ãã¯ãããã€ãã®çç±ã«ãããã³ã³ãããŒã©ãŒã®å€éšã«é 眮ããæ¹ãé©åã§ãã
QueryBuilderã³ãŒããè€è£œããã«ãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®å Žæã§ã¯ãšãªãåå©çšããããšã¯ã§ããŸããã
QueryBuilderã³ãŒããè€è£œããå Žåãã¯ãšãªãå€æŽããå¿ èŠãããå Žåãå°æ¥çã«ããã€ãã®å€æŽãè¡ãå¿ èŠããããŸãã
ãªã¯ãšã¹ããã³ã³ãããŒã©ãŒããåé¢ããããšã§ãã³ã³ãããŒã©ãŒãšã¯ç¬ç«ããŠãªã¯ãšã¹ãããã¹ãã§ããŸãã
Doctrine 2ã¯ãã®ã¿ã¹ã¯ã容æã«ãããªããžããªã¯ã©ã¹ãæäŸããŸãã
Doctrine 2ãªããžããª
åã®ç« ã§ããã°ããŒãžãäœæãããšãã«ãDoctrine 2ãªããžããªã¯ã©ã¹ã«ã€ããŠå°ã話ããŸããã findïŒïŒã¡ãœããã䜿çšããŠããŒã¿ããŒã¹ããããã°ãšã³ããªãååŸããããã«ã Doctrine \ ORM \ EntityRepositoryã¯ã©ã¹ã®ããã©ã«ãå®è£ ã䜿çšããŸããã ã«ã¹ã¿ã ããŒã¿ããŒã¹ã¯ãšãªãå¿ èŠãªã®ã§ãã«ã¹ã¿ã ãªããžããªãäœæããå¿ èŠããããŸãã Doctrine 2ã¯ãã®ã¿ã¹ã¯ã«åœ¹ç«ã¡ãŸãã src / Blogger / BlogBuâândle / Entity / Blog.phpã§ããã°ãšã³ãã£ãã£ã¡ã¿ããŒã¿ãæŽæ°ããŸã
// src/Blogger/BlogBundle/Entity/Blog.php /** * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\Repository\BlogRepository") * @ORM\Table(name="blog") * @ORM\HasLifecycleCallbacks() */ class Blog { // .. }
ãã®ãšã³ãã£ãã£ãé¢é£ä»ããããŠããBlogRepositoryã¯ã©ã¹ã®ããŒã ã¹ããŒã¹ãå®çŸ©ãããŠããããšãããããŸãã Blogãšã³ãã£ãã£ã®Doctrine 2ã¡ã¿ããŒã¿ãæŽæ°ããããã次ã®ããã«doctrineïŒgenerateïŒentitiesã³ãã³ããåå®è¡ããå¿ èŠããããŸãã
$ php app/console doctrine:generate:entities Blogger\BlogBundle
Doctrine 2ã¯
src/Blogger/BlogBundle/Entity/Repository/BlogRepository.php
ããBlogRepositoryã¯ã©ã¹ã®ã©ãããŒãäœæããŸã
<?php namespace Blogger\BlogBundle\Entity\Repository; /** * BlogRepository * * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class BlogRepository extends \Doctrine\ORM\EntityRepository { }
BlogRepositoryã¯ã©ã¹ã¯ã以åã«äœ¿çšããfindïŒïŒã¡ãœãããæäŸããEntityRepositoryã¯ã©ã¹ãæ¡åŒµããŸãã QueryBuilderã³ãŒããããŒãžã³ã³ãããŒã©ãŒãããã®äžã«ç§»åããŠãBlogRepositoryã¯ã©ã¹ãæŽæ°ããŸãããã
<?php namespace Blogger\BlogBundle\Entity\Repository; /** * BlogRepository * * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class BlogRepository extends \Doctrine\ORM\EntityRepository { public function getLatestBlogs($limit = null) { $qb = $this->createQueryBuilder('b') ->select('b') ->addOrderBy('b.created', 'DESC'); if (false === is_null($limit)) $qb->setMaxResults($limit); return $qb->getQuery() ->getResult(); } }
QueryBuilderã³ãŒããã³ã³ãããŒã©ãŒã§ãããå®è¡ããã®ãšåãæ¹æ³ã§ãææ°ã®ããã°ãšã³ããªãè¿ãgetLatestBlogsã¡ãœãããäœæããŸããã ãªããžããªã¯ã©ã¹ã§ã¯ãcreateQueryBuilderïŒïŒã¡ãœããã䜿çšããŠQueryBuilderã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã ãŸããããã©ã«ãã®ãã©ã¡ãŒã¿ãŒ$ limitãè¿œå ãããããè¿ãããçµæã®æ°ãå¶éã§ããŸãã ã¯ãšãªçµæã¯ãã³ã³ãããŒã©ãŒã®å Žåãšåãã«ãªããŸãã fromïŒïŒã¡ãœããã䜿çšããŠãªããžã§ã¯ããæå®ããå¿ èŠããªãããšã«æ°ã¥ãããããããŸããã ããã¯ãBlogãšã³ãã£ãã£ã«é¢é£ä»ããããŠããBlogRepositoryã«ããããã§ãã EntityRepositoryã¯ã©ã¹ã®createQueryBuilderã¡ãœããã®å®è£ ãèŠããšãfromïŒïŒã¡ãœãããåŒã³åºãããŠããããšãããããŸãã
// Doctrine\ORM\EntityRepository public function createQueryBuilder($alias, $indexBy = null) { return $this->_em->createQueryBuilder() ->select($alias) ->from($this->_entityName, $alias, $indexBy); }
æåŸã«ãBlogRepositoryã䜿çšããããã«ããŒãžã³ã³ãããŒã©ãŒã®indexActionã¡ãœãããæŽæ°ããŸãããã
// src/Blogger/BlogBundle/Controller/PageController.php class PageController extends Controller { public function indexAction() { $em = $this->getDoctrine() ->getManager(); $blogs = $em->getRepository('BloggerBlogBundle:Blog') ->getLatestBlogs(); return $this->render('BloggerBlogBundle:Page:index.html.twig', array( 'blogs' => $blogs )); } // .. }
ããã§ãããŒã ããŒãžãæŽæ°ãããšã以åãšãŸã£ããåããã®ã衚瀺ãããŸãã é©åã«èšèšãããã¯ã©ã¹ãã¿ã¹ã¯ãæ£ããå®è¡ã§ããããã«ãã³ãŒããåç·šæããŸããã
ã¢ãã«ã®è©³çŽ°ïŒã³ã¡ã³ããšã³ãã£ãã£ã®äœæ
ãšã³ããªãŒã¯ããã°ã«é¢ããŠã¯ã¹ããŒãªãŒã®ååã«ãããŸããã ãŸããèªè ãããã°æçš¿ã«ã³ã¡ã³ãããæ©äŒãèš±å¯ããå¿ èŠããããŸãã æçš¿ã«ã¯å€ãã®ã³ã¡ã³ããå«ããããšãã§ããããããããã®ã³ã¡ã³ããä¿åããŠBlogãšã³ãã£ãã£ã«ãªã³ã¯ããå¿ èŠããããŸãã
åºç€ãšãªããšã³ãã£ãã£ã¯ã©ã¹Commentãå®çŸ©ããããšããå§ããŸãã
src/Blogger/BlogBundle/Entity/Comment.php
æ°ãããã¡ã€ã«ãäœæããŠè²Œãä»ããŸã
次ã®
<?php // src/Blogger/BlogBundle/Entity/Comment.php namespace Blogger\BlogBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\Repository\CommentRepository") * @ORM\Table(name="comment") * @ORM\HasLifecycleCallbacks */ class Comment { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string") */ protected $user; /** * @ORM\Column(type="text") */ protected $comment; /** * @ORM\Column(type="boolean") */ protected $approved; /** * @ORM\ManyToOne(targetEntity="Blog", inversedBy="comments") * @ORM\JoinColumn(name="blog_id", referencedColumnName="id") */ protected $blog; /** * @ORM\Column(type="datetime") */ protected $created; /** * @ORM\Column(type="datetime") */ protected $updated; public function __construct() { $this->setCreated(new \DateTime()); $this->setUpdated(new \DateTime()); $this->setApproved(true); } /** * @ORM\preUpdate */ public function setUpdatedValue() { $this->setUpdated(new \DateTime()); } }
ããã§èŠããã®ã®ã»ãšãã©ã¯åã®éšåã§ãã§ã«èª¬æããŸããããã¡ã¿ããŒã¿ã䜿çšããŠBlogãšã³ãã£ãã£ãžã®ãªã³ã¯ãäœæããŸããã ã³ã¡ã³ãã¯æçš¿ãåç §ãããããCommentãšã³ãã£ãã£ã«ããããå±ããBlogãšã³ãã£ãã£ãžã®ãªã³ã¯ãèšå®ããŸãã ãããè¡ãã«ã¯ãManyToOneãªã³ã¯ãBlogãšã³ãã£ãã£ã«åç §ããŸãã ãŸãããã®ãªã³ã¯ãžã®ãã£ãŒãããã¯ã¯ã³ã¡ã³ããéããŠå©çšã§ããããšã瀺ããŸããã å転ããã«ã¯ãDoctrine 2ãæçš¿ã«å€ãã®ã³ã¡ã³ããå«ããããšãã§ããããã«Blogãšã³ãã£ãã£ãæŽæ°ããå¿ èŠããããŸãã ãšã³ãã£ãã£ã®æŽæ°Blog
src/Blogger/BlogBundle/Entity/Blog.php
ã³ãŒãã貌ãä»ã
<?php // src/Blogger/BlogBundle/Entity/Blog.php namespace Blogger\BlogBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\Repository\BlogRepository") * @ORM\Table(name="blog") * @ORM\HasLifecycleCallbacks */ class Blog { // .. /** * @ORM\OneToMany(targetEntity="Comment", mappedBy="blog") */ protected $comments; // .. public function __construct() { $this->comments = new ArrayCollection(); $this->setCreated(new \DateTime()); $this->setUpdated(new \DateTime()); } // .. }
ææããå¿ èŠãããããã€ãã®å€æŽããããŸãã æåã«ã$ commentsãªããžã§ã¯ãã«ã¡ã¿ããŒã¿ãè¿œå ããŸããã åã®ç« ã§ã¯ãDoctrine 2ã«ä¿åãããããªãã®ã§ããã®ãªããžã§ã¯ãã®ã¡ã¿ããŒã¿ãè¿œå ããªãã£ãããšãèŠããŠããŸããïŒ ããã§ãããã¯åœãŠã¯ãŸããŸãããDoctrine 2ããã®ãªããžã§ã¯ãã«é©åãªã³ã¡ã³ããšã³ããªãè¿œå ã§ããããã«ãããã®ã§ãã ãããã¡ã¿ããŒã¿ã®éæãå¯èœã«ãããã®ã§ãã 第äºã«ãDoctrine 2ã§ã¯ArrayCollectionã®$ commentsãªããžã§ã¯ãã®ããã©ã«ãå€ãèšå®ããå¿ èŠããããŸãã ããã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã§è¡ããŸãã ãŸããArrayCollectionã¯ã©ã¹ãã€ã³ããŒãããuseã¹ããŒãã¡ã³ãã«æ³šæããŠãã ããã
Commentãšã³ãã£ãã£ãäœæããBlogãšã³ãã£ãã£ãæŽæ°ããã®ã§ãã¢ã¯ã»ã¹ã¡ãœãããäœæããŸãããã 次ã®Doctrine 2ã³ãã³ããå®è¡ããŸãã
$ php app/console doctrine:generate:entities Blogger\BlogBundle
äž¡æ¹ã®ãšã³ãã£ãã£ãæ£ããã¢ã¯ã»ã¹æ¹æ³ã§æŽæ°ãããŸãã ãŸãã
src/Blogger/BlogBundle/Entity/Repository/CommentRepository.php
ã¡ã¿ããŒã¿ã§ããã瀺ãããããCommentRepositoryã¯ã©ã¹ãäœæãããŸããã
æåŸã«ããšã³ãã£ãã£ã®å€æŽãåæ ããããã«ããŒã¿ããŒã¹ãæŽæ°ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã以äžã«ç€ºãdoctrineïŒschemaïŒupdateã³ãã³ãã䜿çšã§ããŸããã代ããã«Doctrine 2 Migrationsã«ã€ããŠèª¬æããŸãã
$ php app/console doctrine:schema:update --force
Doctrine 2ã®ç§»è¡
Doctrine 2 Migration Extensionãšãã³ãã«ã«ã¯Symfony2ãä»å±ããŠããŸãããæåã§ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ãããžã§ã¯ãã®ã«ãŒãã«ããcomposer.jsonãã¡ã€ã«ãéãã以äžã«ç€ºãããã«Doctrine 2 Migrationsã®äŸåé¢ä¿ãšãã³ãã«ãæ¿å ¥ããŸãã
"require": { // ... "doctrine/doctrine-migrations-bundle": "dev-master", "doctrine/migrations": "dev-master" }
次ã«ãã³ãã³ãã䜿çšããŠã©ã€ãã©ãªãæŽæ°ããŸãã
$ composer update
ããã«ããããã¹ãŠã®ã©ã€ãã©ãªãGithubã§æŽæ°ãããå¿ èŠãªãã£ã¬ã¯ããªã«ã€ã³ã¹ããŒã«ãããŸãã
app / AppKernel.phpã«ããã«ãŒãã«ã«ãã³ãã«ãç»é²ããŸããã
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle(), // ... ); // ... }
ããã§ãããŒã¿ããŒã¹ãæŽæ°ããŠãšã³ãã£ãã£ã®å€æŽãåæ ããæºåãã§ããŸããããã®ããã»ã¹ã¯2段éã§è¡ãããŸãã æåã«ããšã³ãã£ãã£ãšçŸåšã®ããŒã¿ããŒã¹ã¹ããŒãã®éããåŠçããããDoctrine 2 Migrationsã«æ瀺ããå¿ èŠããããŸãã ããã¯doctrineïŒmigrationsïŒdiffã³ãã³ãã§å®è¡ãããŸãã 次ã«ãæåã®ããŒã ãäœæããããŒã¿ã«åºã¥ããŠç§»è¡ãå®è¡ããå¿ èŠããããŸãã ããã¯doctrineïŒmigrationsïŒmigrateã³ãã³ãã§å®è¡ãããŸãã
次ã®2ã€ã®ã³ãã³ããå®è¡ããŠãããŒã¿ããŒã¹ã¹ããŒããæŽæ°ããŸãã
$ php app/console doctrine:migrations:diff $ php app/console doctrine:migrations:migrate
以äžã«ç€ºãèŠåã¯yesãšçããŸã ã
èŠåïŒ ã¹ããŒãã®å€æŽãšããŒã¿ã®æ倱ãåŒãèµ·ããå¯èœæ§ã®ããããŒã¿ããŒã¹ç§»è¡ãå®è¡ããããšããŠããŸãã ç¶è¡ããŸããïŒ ïŒy / nïŒïŒ ã¯ã
ããã§ãããŒã¿ããŒã¹ã«ææ°ã®ãšã³ãã£ãã£ã®å€æŽãåæ ãããæ°ããã³ã¡ã³ãããŒãã«ãå«ãŸããŸãã
ã泚æ
ãŸããããŒã¿ããŒã¹ã«migration_versionsãšããæ°ããããŒãã«ã衚瀺ãããŸãã 移è¡ããŒãžã§ã³çªå·ãä¿åããããããçŸåšããŒã¿ããŒã¹ã®ããŒãžã§ã³ã確èªã§ããã³ãã³ãããããŸãã
ãã³ã
Doctrine 2ã®ç§»è¡ã¯ãããã°ã©ã ã§å€æŽãå ããããšãã§ãããããæ¬çªããŒã¿ããŒã¹ãã¢ããã°ã¬ãŒãããçŽ æŽãããæ¹æ³ã§ãã ã€ãŸãããã®ã¿ã¹ã¯ããããžã§ã¯ãå±éã·ããªãªã«çµ±åã§ãããããã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ãå±éãããšãããŒã¿ããŒã¹ãèªåçã«æŽæ°ãããŸãã ãŸããDoctrine 2ã®ç§»è¡ã§ã¯ãããããã®ç§»è¡ã«ã¢ãããšããŠã³ã®æ¹æ³ããããããå€æŽãããŒã«ããã¯ã§ããŸãã åã®ããŒãžã§ã³ã«ããŒã«ããã¯ããã«ã¯ãæ»ãããŒãžã§ã³çªå·ãæå®ããå¿ èŠããããŸãã以äžã«ç€ºãããã«ããããè¡ãããšãã§ããŸãã
$ php app/console doctrine:migrations:migrate 20110806183439
ããŒã¿ãã£ã¯ã¹ãã£
ããã§Commentãšã³ãã£ãã£ãã§ããŸãããããŒã¿ãã£ã¯ã¹ãã£ãè¿œå ããŸãããã ããã¯ããšã³ãã£ãã£ãäœæããè¯ãæ©äŒã§ãã ã¡ã¿ããŒã¿ã§ç€ºããããã«ãã³ã¡ã³ãã«ã¯Blogãšã³ãã£ãã£ãšã®æ¥ç¶ãå¿ èŠã§ããããšãããã£ãŠãããããCommentãšã³ãã£ãã£ã®ãã£ã¯ã¹ãã£ãäœæãããšãã¯ãBlogãšã³ãã£ãã£ãæå®ããå¿ èŠããããŸãã Blogãšã³ãã£ãã£ã®ãã£ã¯ã¹ãã£ã¯ãã§ã«äœæãããŠããããããã®ãã¡ã€ã«ãæŽæ°ããŠCommentãšã³ãã£ãã£ãè¿œå ããã ãã§ãã ä»ã¯ç®¡çå¯èœãããããŸããããåŸã§ãŠãŒã¶ãŒãä»ã®ãšã³ãã£ãã£ããã³ãã«ã«è¿œå ãããšã©ããªããŸããïŒ Commentãšã³ãã£ãã£ã®ãã£ã¯ã¹ãã£çšã«æ°ãããã¡ã€ã«ãäœæããããšããå§ãããŸãã ãã®ã¢ãããŒãã®åé¡ã¯ãããã°ã®ãã£ã¯ã¹ãã£ããããã°ã®æçš¿ã«ã¢ã¯ã»ã¹ããæ¹æ³ã§ãã
幞ããªããšã«ãããã¯ãä»ã®ãã£ã¯ã¹ãã£ãã¡ã€ã«ãã¢ã¯ã»ã¹ã§ãããã£ã¯ã¹ãã£ãã¡ã€ã«å ã®ãªããžã§ã¯ããžã®åç §ãè¿œå ããããšã§ç°¡åã«å®çŸã§ããŸãã
src/Blogger/BlogBundle/DataFixtures/ORM/BlogFixtures.php
ããããã°ãšã³ãã£ãã£ããŒã¿ãã£ã¯ã¹ãã£ãæŽæ°ããŸãã
次ã®ããã«
<?php // src/Blogger/BlogBundle/DataFixtures/ORM/BlogFixtures.php namespace Blogger\BlogBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Doctrine\Common\Persistence\ObjectManager; use Blogger\BlogBundle\Entity\Blog; class BlogFixtures extends AbstractFixture implements OrderedFixtureInterface { public function load(ObjectManager $manager) { // .. $manager->flush(); $this->addReference('blog-1', $blog1); $this->addReference('blog-2', $blog2); $this->addReference('blog-3', $blog3); $this->addReference('blog-4', $blog4); $this->addReference('blog-5', $blog5); } public function getOrder() { return 1; } }
ããã§æ³šç®ã«å€ããå€æŽã¯ãAbstractFixtureã¯ã©ã¹ã®æ¡åŒµãšOrderedFixtureInterfaceã®å®è£ ã§ãã ãããã®ã¯ã©ã¹ãã€ã³ããŒããã2ã€ã®æ°ããuseã¹ããŒãã¡ã³ãã«ã泚æããŠãã ããã
addReferenceïŒïŒã¡ãœããã䜿çšããŠããã°ãšã³ãã£ãã£ãªã³ã¯ãè¿œå ããŸãã ãã®æåã®ãã©ã¡ãŒã¿ãŒã¯ãåŸã§ãªããžã§ã¯ããååŸããããã«äœ¿çšã§ãããªã³ã¯ã®èå¥åã§ãã æåŸã«ããã£ã¯ã¹ãã£ã®ããŒãé åºãæå®ããgetOrderïŒïŒã¡ãœãããå®è£ ããå¿ èŠããããŸãã ãšã³ããªã¯ã³ã¡ã³ãã®åã«ã¢ããããŒãããå¿ èŠãããããã1ãè¿ããŸãã
ååã³ã¡ã³ã
ããã§ãCommentãšã³ãã£ãã£ã®ãã£ã¯ã¹ãã£ãå®çŸ©ããæºåãã§ããŸããã ãã£ã¯ã¹ãã£ãã¡ã€ã«ã®äœæ
src/Blogger/BlogBundle/DataFixtures/ORM/CommentFixtures.php
ãããŠè²Œãä»ã
次ã®
<?php // src/Blogger/BlogBundle/DataFixtures/ORM/CommentFixtures.php namespace Blogger\BlogBundle\DataFixtures\ORM; use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Doctrine\Common\Persistence\ObjectManager; use Blogger\BlogBundle\Entity\Comment; use Blogger\BlogBundle\Entity\Blog; class CommentFixtures extends AbstractFixture implements OrderedFixtureInterface { public function load(ObjectManager $manager) { $comment = new Comment(); $comment->setUser('symfony'); $comment->setComment('To make a long story short. You can\'t go wrong by choosing Symfony! And no one has ever been fired for using Symfony.'); $comment->setBlog($manager->merge($this->getReference('blog-1'))); $manager->persist($comment); $comment = new Comment(); $comment->setUser('David'); $comment->setComment('To make a long story short. Choosing a framework must not be taken lightly; it is a long-term commitment. Make sure that you make the right selection!'); $comment->setBlog($manager->merge($this->getReference('blog-1'))); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Dade'); $comment->setComment('Anything else, mom? You want me to mow the lawn? Oops! I forgot, New York, No grass.'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Kate'); $comment->setComment('Are you challenging me? '); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-23 06:15:20")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Dade'); $comment->setComment('Name your stakes.'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-23 06:18:35")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Kate'); $comment->setComment('If I win, you become my slave.'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-23 06:22:53")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Dade'); $comment->setComment('Your SLAVE?'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-23 06:25:15")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Kate'); $comment->setComment('You wish! You\'ll do shitwork, scan, crack copyrights...'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-23 06:46:08")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Dade'); $comment->setComment('And if I win?'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-23 10:22:46")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Kate'); $comment->setComment('Make it my first-born!'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-23 11:08:08")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Dade'); $comment->setComment('Make it our first-date!'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-24 18:56:01")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Kate'); $comment->setComment('I don\'t DO dates. But I don\'t lose either, so you\'re on!'); $comment->setBlog($manager->merge($this->getReference('blog-2'))); $comment->setCreated(new \DateTime("2011-07-25 22:28:42")); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Stanley'); $comment->setComment('It\'s not gonna end like this.'); $comment->setBlog($manager->merge($this->getReference('blog-3'))); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Gabriel'); $comment->setComment('Oh, come on, Stan. Not everything ends the way you think it should. Besides, audiences love happy endings.'); $comment->setBlog($manager->merge($this->getReference('blog-3'))); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Mile'); $comment->setComment('Doesn\'t Bill Gates have something like that?'); $comment->setBlog($manager->merge($this->getReference('blog-5'))); $manager->persist($comment); $comment = new Comment(); $comment->setUser('Gary'); $comment->setComment('Bill Who?'); $comment->setBlog($manager->merge($this->getReference('blog-5'))); $manager->persist($comment); $manager->flush(); } public function getOrder() { return 2; } }
BlogFixturesã¯ã©ã¹ã«å ããå€æŽã«ãããCommentFixturesã¯ã©ã¹ã¯AbstractFixtureã¯ã©ã¹ãæ¡åŒµããOrderedFixtureInterfaceãå®è£ ããŸãã ããã¯ãgetOrderïŒïŒã¡ãœãããå®è£ ããå¿ èŠãããããšãæå³ããŸããä»åã¯å€2ãè¿ããããã¬ã³ãŒãã®ãã£ã¯ã¹ãã£ã®åŸã«ãã£ã¯ã¹ãã£ã確å®ã«ããŒãã§ããŸãã
ãŸããåã«äœæããBlogãšã³ãã£ãã£ãžã®ãªã³ã¯ãã©ã®ããã«äœ¿çšãããã確èªã§ããŸãã
$comment->setBlog($manager->merge($this->getReference('blog-2')));
ããã§ããã£ã¯ã¹ãã£ãããŒã¿ããŒã¹ã«ããŒãããæºåãã§ããŸããã
$ php app/console doctrine:fixtures:load
èŠåã«å¯Ÿå¿ããŸããã¯ãã
泚æããŠãã ãããããŒã¿ããŒã¹ã¯åé€ãããŸããy / Nãç¶è¡ããŸããïŒã¯ã
ã³ã¡ã³ãã衚瀺
ããã§ãåããã°æçš¿ã«é¢é£ä»ããããã³ã¡ã³ãã衚瀺ã§ããŸãããŸããããã°ã«å¯ŸããŠæ¿èªãããææ°ã®ã³ã¡ã³ããåãåãã¡ãœããã§CommentRepositoryãæŽæ°ããŸãã
ã³ã¡ã³ããªããžããª
èŠã€ãã£ãCommentRepositoryã¯ã©ã¹ãéããŠ
src/Blogger/BlogBundle/Entity/Repository/CommentRepository.php
貌ãä»ããŸã
次ã®
<?php // src/Blogger/BlogBundle/Entity/Repository/CommentRepository.php namespace Blogger\BlogBundle\Entity\Repository; use Doctrine\ORM\EntityRepository; /** * CommentRepository * * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class CommentRepository extends EntityRepository { public function getCommentsForBlog($blogId, $approved = true) { $qb = $this->createQueryBuilder('c') ->select('c') ->where('c.blog = :blog_id') ->addOrderBy('c.created') ->setParameter('blog_id', $blogId); if (false === is_null($approved)) $qb->andWhere('c.approved = :approved') ->setParameter('approved', $approved); return $qb->getQuery() ->getResult(); } }
äœæããã¡ãœããã¯ãããã°æçš¿ã§ã³ã¡ã³ããåãåããŸãããããè¡ãã«ã¯ãã¯ãšãªã«whereå¥ãè¿œå ããå¿ èŠããããŸããwhereç¯ã¯ãsetParameterïŒïŒã¡ãœããã䜿çšããŠèšå®ãããååä»ããã©ã¡ãŒã¿ãŒã䜿çšããŸããã¯ãšãªã§å€ãçŽæ¥èšå®ããã®ã§ã¯ãªããåžžã«ãã©ã¡ãŒã¿ãŒã䜿çšããå¿ èŠããããŸã
->where('c.blog = ' . blogId)
ãã®äŸã§ã¯ã$ blogIdã®å€ã¯å®å šã§ã¯ãªããSQLã€ã³ãžã§ã¯ã·ã§ã³æ»æã«å¯ŸããŠã¯ãšãªãéãããŸãŸã«ãªãå ŽåããããŸãã
ããã°ã³ã³ãããŒã©ãŒ
次ã«ãBlogã³ã³ãããŒã©ãŒã®showActionã¡ãœãããæŽæ°ããŠã³ã¡ã³ããååŸããå¿ èŠããããŸããããã°ã³ã³ãããŒã©ãŒã®æŽæ°
src/Blogger/BlogBundle/Controller/BlogController.php
æ¿å
¥
// src/Blogger/BlogBundle/Controller/BlogController.php public function showAction($id) { // .. if (!$blog) { throw $this->createNotFoundException('Unable to find Blog post.'); } $comments = $em->getRepository('BloggerBlogBundle:Comment') ->getCommentsForBlog($blog->getId()); return $this->render('BloggerBlogBundle:Blog:show.html.twig', array( 'blog' => $blog, 'comments' => $comments )); }
CommentRepositoryã®æ°ããã¡ãœããã䜿çšããŠãæ¿èªæžã¿ã®ã³ã¡ã³ããååŸããŸãã$ commentsã³ã¬ã¯ã·ã§ã³ããã³ãã¬ãŒãã«æž¡ãããŸãã
ããã°ã·ã§ãŒãã³ãã¬ãŒã
ããã§ããã°ã®ã³ã¡ã³ãã®ãªã¹ããã§ããŸãããããã°ã®è¡šç€ºãã³ãã¬ãŒããæŽæ°ããŠã³ã¡ã³ãã衚瀺ã§ããŸããã³ã¡ã³ãã®åºåãããã°ã·ã§ãŒãã³ãã¬ãŒãã«çŽæ¥å ¥åããããšãã§ããŸãããã³ã¡ã³ãã«ã¯ç¬èªã®æ¬è³ªããããããå¥ã®ãã³ãã¬ãŒãã§è¡šç€ºãåé¢ãããã®ãã³ãã¬ãŒãã«å«ããããšããå§ãããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³å ã®ä»»æã®å Žæã§ã³ã¡ã³ãåºåãã³ãã¬ãŒããåå©çšã§ããŸããããã°ãã³ãã¬ãŒããæŽæ°
show src/Blogger/BlogBundle/Resources/views/Blog/show.html.twig
æ¿å
¥ãã
{# src/Blogger/BlogBundle/Resources/views/Blog/show.html.twig #} {# .. #} {% block body %} {# .. #} <section class="comments" id="comments"> <section class="previous-comments"> <h3>Comments</h3> {% include 'BloggerBlogBundle:Comment:index.html.twig' with { 'comments': comments } %} </section> </section> {% endblock %}
æ°ããTwig includeã¿ã°ã衚瀺ãããŸããããã«ã¯ãBloggerBlogBuâândleãã³ãã¬ãŒãã®ã³ã³ãã³ãïŒã³ã¡ã³ãïŒindex.html.twigïŒãå«ãŸããŸãããŸãããã³ãã¬ãŒãã«åŒæ°ãããã€ã§ãæž¡ãããšãã§ããŸãããã®å ŽåãèŠèŠåã®ããã«ãšã³ãã£ãã£ã®ã³ã¡ã³ãã³ã¬ã¯ã·ã§ã³ã調ã¹ãå¿ èŠããããŸãã
ã³ã¡ã³ãã·ã§ãŒãã³ãã¬ãŒã
BloggerBlogBuâândleïŒã³ã¡ã³ãïŒäžèšã«å«ããindex.html.twigã¯ãŸã ååšããªããããäœæããå¿ èŠããããŸããããã¯åãªããã³ãã¬ãŒãã§ããããããã®ããã®ã«ãŒããã³ã³ãããŒã©ãŒãäœæããå¿ èŠã¯ãããŸããããã³ãã¬ãŒããã¡ã€ã«ã®ã¿ãå¿ èŠã§ããæ°ãããã¡ã€ã«
src/Blogger/BlogBundle/Resources/views/Comment/index.html.twig
ãäœæããŠè²Œãä»ã
次ã®
{# src/Blogger/BlogBundle/Resources/views/Comment/index.html.twig #} {% for comment in comments %} <article class="comment {{ cycle(['odd', 'even'], loop.index0) }}" id="comment-{{ comment.id }}"> <header> <p><span class="highlight">{{ comment.user }}</span> commented <time datetime="{{ comment.created|date('c') }}">{{ comment.created|date('l, F j, Y') }}</time></p> </header> <p>{{ comment.comment }}</p> </article> {% else %} <p>There are no comments for this post. Be the first to comment...</p> {% endfor %}
ã芧ã®ãšãããCommentãšã³ãã£ãã£ã®ã³ã¬ã¯ã·ã§ã³ãå埩åŠçããã³ã¡ã³ãã衚瀺ããŸããå¥ã®è¯ãTwigã§ãããµã€ã¯ã«é¢æ°ã«ã€ããŠè©±ããŸãããããã®é¢æ°ã¯ãã«ãŒãã®åå埩äžã«æž¡ãé åã®å€ãå埩åŠçããŸããã«ãŒãå埩ã®çŸåšã®å€ã¯ãç¹æ®å€æ°loop.index0ããååŸãããŸããããã¯ã0ããå§ãŸãã«ãŒãã®ç¹°ãè¿ããã«ãŠã³ãããŸããã«ãŒãå ã«ããå Žåãä»ã®å€ãã®ç¹æ®å€æ°ã䜿çšã§ããŸãããŸããèšäºèŠçŽ ã®HTML-IDèšå®ã«æ°ä»ããããããŸãããããã«ãããäœæããã³ã¡ã³ããžã®ãªã³ã¯ãåŸã§äœæã§ããŸãã
CSSã®ã³ã¡ã³ã衚瀺
æåŸã«ãã³ã¡ã³ããã¹ã¿ã€ãªãã·ã¥ã«èŠããããã«CSSãè¿œå ããŸããããã«ããã¹ã¿ã€ã«ãæŽæ°
src/Blogger/BlogBundle/Resouces/public/css/blog.css
/** src/Blogger/BlogBundle/Resorces/public/css/blog.css **/ .comments { clear: both; } .comments .odd { background: #eee; } .comments .comment { padding: 20px; } .comments .comment p { margin-bottom: 0; } .comments h3 { background: #eee; padding: 10px; font-size: 20px; margin-bottom: 20px; clear: both; } .comments .previous-comments { margin-bottom: 20px; }
泚
ã·ã³ããªãã¯ãªã³ã¯æ¹åŒã䜿çšããŠWebãã©ã«ããŒå ã®ãã³ãã«è³ç£ã«ã¢ã¯ã»ã¹ããªãå Žåã¯ãè³ç£ã€ã³ã¹ããŒã«ã³ãã³ããåå®è¡ããŠå€æŽãã³ããŒããå¿ èŠããããŸãã
$ php app/console assets:install web
ããšãã°ãhttpïŒ// localhostïŒ8000/2ãªã©ã®showããŒãžã®1ã€ãèŠããšããšã³ããªã®ã³ã¡ã³ãã®åºåã衚瀺ãããŸãã

ã³ã¡ã³ããè¿œå
ãã®ç« ã®æåŸã®éšåã§ã¯ããŠãŒã¶ãŒåãã®æ©èœãæ¡åŒµããããã°ãšã³ããªã«ã³ã¡ã³ããè¿œå ããŸããããã¯ãããã°ã®ã·ã§ãŒããŒãžã®ãã©ãŒã ã®ãããã§å¯èœã«ãªããŸããã³ã³ã¿ã¯ãããŒãžã§ãã©ãŒã ãäœæãããšãã«ãSymfony 2ã§ãã©ãŒã ãäœæããããšã«ã€ããŠæ¢ã«èª¬æããŸãããã³ã¡ã³ããã©ãŒã ãæåã§äœæãã代ããã«ãSymfony2ã䜿çšããŠäœæã§ããŸãã次ã®ã³ãã³ããå®è¡ããŠãCommentãšã³ãã£ãã£ã®CommentTypeã¯ã©ã¹ãçæããŸãã
$ php app/console generate:doctrine:form BloggerBlogBundle:Comment
ã³ã¡ã³ããšã³ãã£ãã£ãå®çŸ©ããããã«ãéèšã®äœ¿çšã«åã³æ°ä»ãã§ãããã
ãã³ã
doctrineïŒgenerateïŒformã³ãã³ããå©çšã§ããããšã«æ°ã¥ãããããããŸãããããã¯ãååãç°ãªãåãããŒã ã§ãã
ããŒã ã¯ãCommentTypeã¯ã©ã¹ãäœæããŸãã
src/Blogger/BlogBundle/Form/CommentType.php
ã³ãŒãã衚瀺
<?php namespace Blogger\BlogBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class CommentType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('user') ->add('comment') ->add('approved') ->add('created', 'datetime') ->add('updated', 'datetime') ->add('blog') ; } /** * @param OptionsResolver $resolver */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'Blogger\BlogBundle\Entity\Comment' )); } }
åã®ã¯ã©ã¹ã§ããRequest Typeã§ãããã§äœãèµ·ãããããã§ã«èª¿ã¹ãŸãããä»ãããã®ã¯ã©ã¹ãã«ã¹ã¿ãã€ãºããããšããå§ããããŸãããæåã«ãã©ãŒã ã衚瀺ããããšã«åãããããŸãããã
ã³ã¡ã³ããã©ãŒã ã衚瀺ããŸãã
ãŠãŒã¶ãŒã«ã·ã§ãŒããã°ããŒãžããã³ã¡ã³ããè¿œå ããŠã»ããã®ã§ãããã°ã³ã³ãããŒã©ãŒã®showActionã¡ãœããã§ãã©ãŒã ãäœæããã·ã§ãŒãã³ãã¬ãŒãã«çŽæ¥ãã©ãŒã ã衚瀺ã§ããŸãããã ããã³ã¡ã³ãã®è¡šç€ºã§è¡ã£ãããã«ããã®ã³ãŒããåé¢ããããšããå§ãããŸããã³ã¡ã³ãã®è¡šç€ºãšã³ã¡ã³ããã©ãŒã ã®è¡šç€ºã®éãã¯ãã³ã¡ã³ããã©ãŒã ã®åŠçãå¿ èŠãªãããã³ã³ãããŒã©ãŒãå¿ èŠãªããšã§ãã
ã«ãŒã
ãã©ãŒã ãåŠçããããã®æ°ããã«ãŒããäœæããå¿ èŠããããŸããèŠã€ãã£ãæ°ããã«ãŒããè¿œå ããŸã
src/Blogger/BlogBundle/Resources/config/routing.yml
BloggerBlogBundle_comment_create: path: /comment/{blog_id} defaults: { _controller: "BloggerBlogBundle:Comment:create" } requirements: methods: POST blog_id: \d+
ã³ã³ãããŒã©ãŒ
次ã«ãåè¿°ã®æ°ããCommentControlerãäœæããå¿ èŠããããŸããsrc / Blogger / BlogBuâândle / Controller / CommentController.phpã«æ°ãããã¡ã€ã«ãäœæããŠè²Œãä»ããŸã
次ã®
<?php // src/Blogger/BlogBundle/Controller/CommentController.php namespace Blogger\BlogBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Blogger\BlogBundle\Entity\Comment; use Blogger\BlogBundle\Form\CommentType; use Symfony\Component\HttpFoundation\Request; /** * Comment controller. */ class CommentController extends Controller { public function newAction($blog_id) { $blog = $this->getBlog($blog_id); $comment = new Comment(); $comment->setBlog($blog); $form = $this->createForm(CommentType::class, $comment); return $this->render('BloggerBlogBundle:Comment:form.html.twig', array( 'comment' => $comment, 'form' => $form->createView() )); } public function createAction(Request $request, $blog_id) { $blog = $this->getBlog($blog_id); $comment = new Comment(); $comment->setBlog($blog); $form = $this->createForm(CommentType::class, $comment); $form->handleRequest($request); if ($form->isValid()) { // TODO: Persist the comment entity return $this->redirect($this->generateUrl('BloggerBlogBundle_blog_show', array( 'id' => $comment->getBlog()->getId())) . '#comment-' . $comment->getId() ); } return $this->render('BloggerBlogBundle:Comment:create.html.twig', array( 'comment' => $comment, 'form' => $form->createView() )); } protected function getBlog($blog_id) { $em = $this->getDoctrine() ->getManager(); $blog = $em->getRepository('BloggerBlogBundle:Blog')->find($blog_id); if (!$blog) { throw $this->createNotFoundException('Unable to find Blog post.'); } return $blog; } }
Commentã³ã³ãããŒã©ãŒã«ã¯ãæ°èŠäœæçšãšäœæçšã®2ã€ã®ã¡ãœãããäœæããŸãããæ°ããã¡ãœããã¯ã³ã¡ã³ãã®ãã©ãŒã ã®è¡šç€ºã«é¢é£ä»ããããäœæã¡ãœããã¯ã³ã¡ã³ããã©ãŒã ã®åŠçã«é¢é£ä»ããããŸããããã¯å€§ããªã³ãŒãã®ããã«æãããããããŸããããããã§ã¯æ°ããããšã¯äœããããŸãããé£çµ¡ãã©ãŒã ãäœæãããšãã«ããã¹ãŠã2çªç®ã®éšåã§èª¬æãããŸããããã ããå ã«é²ãåã«ãã³ã¡ã³ãã³ã³ãããŒã©ãŒã§äœãè¡ãããŠããããå®å šã«ç解ããŠãã ããã
ãã©ãŒã æ€èšŒ
ãŠãŒã¶ãŒãšã³ã¡ã³ãã®ãã©ã¡ãŒã¿ãŒã«ç©ºã®å€ã䜿çšããŠã³ã¡ã³ããæ®ãããšã¯ã§ããŸããããããå®çŸããããã«ããªã¯ãšã¹ããã©ãŒã ãäœæãããšãã«2çªç®ã®éšåã§æ€èšããæ€èšŒãæãåºããŸããèŠã€ãã£ãã³ã¡ã³ããšã³ãã£ãã£ã®æŽæ°
src/Blogger/BlogBundle/Entity/Comment.php
ã³ãŒãã衚瀺
<?php // src/Blogger/BlogBundle/Entity/Comment.php // .. use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints\NotBlank; // .. class Comment { // .. public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('user', new NotBlank(array( 'message' => 'You must enter your name' ))); $metadata->addPropertyConstraint('comment', new NotBlank(array( 'message' => 'You must enter a comment' ))); } // .. }
ããã§ã¯ããŠãŒã¶ãŒãã£ãŒã«ããšã³ã¡ã³ããã£ãŒã«ããå ¥åãããŠãããã©ããããã§ãã¯ãããŸããããã©ã«ãã®ã¡ãã»ãŒãžãåå®çŸ©ããŸãããäžèšã®ããã«ãClassMetadataããã³NotBlankåå空éãå¿ããã«è¿œå ããŠãã ããã
ãã£ã¹ãã¬ã€
次ã«ãã³ã³ãããŒã©ãŒã®æ°ããã¡ãœãããšã¡ãœãããäœæããããã®2ã€ã®ãã³ãã¬ãŒããäœæããå¿ èŠããããŸããã«ããæ°ãããã¡ã€ã«ãäœæã
src/Blogger/BlogBundle/Resources/views/Comment/form.html.twig
ãŠè²Œãä»ããŸã
次ã®
{# src/Blogger/BlogBundle/Resources/views/Comment/form.html.twig #} {{ form_start(form, { 'action': path('BloggerBlogBundle_comment_create' , { 'blog_id' : comment.blog.id }), 'method': 'POST', 'attr': {'class': 'blogger'} }) }} {{ form_widget(form) }} <p> <input type="submit" value="Submit"> </p>
ãã®ãã³ãã¬ãŒãã®ç®çã¯éåžžã«ã·ã³ãã«ã§ãã³ã¡ã³ããã©ãŒã ã衚瀺ããã ãã§ãããŸãããã©ãŒã ã®ã¢ã¯ã·ã§ã³ã¡ãœãããPOSTã§ãããBloggerBlogBuâândle_comment_createãäœæããæ°ããã«ãŒããåç §ããŠããããšã«ãæ°ä»ãã§ãããã
次ã«ãäœæã¡ãœããã®ãã³ãã¬ãŒããäœæããŸããããã«ããæ°ãããã¡ã€ã«ãäœæã
src/Blogger/BlogBundle/Resources/views/Comment/create.html.twig
ãŠè²Œãä»ããŸã
次ã®
{% extends 'BloggerBlogBundle::layout.html.twig' %} {% block title %}Add Comment{% endblock%} {% block body %} <h1>Add comment for blog post "{{ comment.blog.title }}"</h1> {% include 'BloggerBlogBundle:Comment:form.html.twig' with { 'form': form } %} {% endblock %}
Commentã³ã³ãããŒã©ãŒã®createActionã¡ãœããã¯ãã©ãŒã ã®åŠçãåŠçããããããšã©ãŒãçºçããå¯èœæ§ãããããããã©ãŒã ã衚瀺ã§ããå¿ èŠããããŸããBloggerBlogBuâândleïŒCommentïŒform.html.twigãåå©çšããŠãã³ãŒããè€è£œããªãããã«ãã©ãŒã ã衚瀺ããŸãã
ããã°ã®ã·ã§ãŒãã³ãã¬ãŒããæŽæ°ããŠããã©ãŒã ã衚瀺ããŸãããããã³ãã¬ãŒããæŽæ°
src/Blogger/BlogBundle/Resources/views/Blog/show.html
{# src/Blogger/BlogBundle/Resources/views/Blog/show.html.twig #} {# .. #} {% block body %} {# .. #} <section class="comments" id="comments"> {# .. #} <h3>Add Comment</h3> {{ render(controller('BloggerBlogBundle:Comment:new',{ 'blog_id': blog.id })) }} </section> {% endblock %}
ããã§ã¯å¥ã®Twigã¿ã°ãrenderã䜿çšããŸããããã®ã¿ã°ã¯ããã³ãã¬ãŒãå ã®ã³ã³ãããŒã©ãŒã®ã³ã³ãã³ãã衚瀺ããŸãããã®å ŽåãBloggerBlogBuâândleã®å 容ã衚瀺ããŸããCommentïŒnew httpïŒ// localhostïŒ8000/2
ãªã©ã®ããã°ããŒãžã®1ã€ãèŠããšã次ã®ãããªéç¥ã衚瀺ãããŸãããã®æçš¿ã¯ãBloggerBlogBuâândleïŒBlogïŒshow.html.twigãã³ãã¬ãŒãã«ãã£ãŠããªã¬ãŒãããŸããBloggerBlogBuâândleïŒBlogïŒshow.html.twigãã³ãã¬ãŒãã®23è¡ç®ãèŠããšããã®è¡ã¯åé¡ãå®éã«BloggerBlogBuâândleïŒCommentïŒcreate controllerã®åã蟌ã¿ããã»ã¹ã«ããããšã瀺ããŠããŸãã

{{ render(controller('BloggerBlogBundle:Comment:new',{ 'blog_id': blog.id })) }}
ãšã©ãŒã¡ãã»ãŒãžããã詳ããèŠããšããšã©ãŒãçºçããçç±ã«é¢ãã詳现æ å ±ãåŸãããŸãã
圌女ã¯ãåŒã³åºãããšããŠãããã£ãŒã«ãã«ã¯ãé¢é£ãããšã³ãã£ãã£ã®__toStringïŒïŒã¡ãœããããªãããšãæããŠãããŸããéžæãã£ãŒã«ãã¯ããŠãŒã¶ãŒã«ããã€ãã®ãªãã·ã§ã³ïŒéžæèŠçŽ ïŒããããããŠã³ãªã¹ãïŒãªã©ïŒã®éžæè¢ãæäŸãããã©ãŒã èŠçŽ ã§ãããã®ãããªãã£ãŒã«ããã³ã¡ã³ãã®åœ¢åŒã§ã©ãã«è¡šç€ºããã®ãçåã«æããããããããŸãããã³ã¡ã³ããã©ãŒã ãã³ãã¬ãŒããããäžåºŠèŠããšãTwig {{form_widgetïŒformïŒ}}é¢æ°ã䜿çšããŠãã©ãŒã ã衚瀺ããŠããããšãããããŸãããã®é¢æ°ã¯ããã©ãŒã å šäœã衚瀺ããŸãã CommentTypeã¯ã©ã¹ããäœæããããã©ãŒã ã¯ã©ã¹ã«æ»ããŸãããã FormBuilderãªããžã§ã¯ãã䜿çšããŠãå€ãã®ãã£ãŒã«ãããã©ãŒã ã«è¿œå ãããŠããããšãããããŸããç¹ã«ãããã°ãã£ãŒã«ããè¿œå ããŠããŸãã
ã¬ã€ãã®ç¬¬2éšã§ã¯ãFormBuilderããã£ãŒã«ãã«é¢é£ããã¡ã¿ããŒã¿ã«åºã¥ããŠåºåçšã®ãã£ãŒã«ãã®ã¿ã€ããæšæž¬ããããšããæ¹æ³ã«ã€ããŠèŠããŠããŸããã³ã¡ã³ããšã³ãã£ãã£ãšããã°ãšã³ãã£ãã£ã®éã®é¢ä¿ã確ç«ãããããFormBuilderã¯ãã³ã¡ã³ããããŠãŒã¶ãŒãã³ã¡ã³ããæ·»ä»ãããšã³ããªãæå®ã§ããéžæãã£ãŒã«ãã«ããããšãææ¡ããŸããããã®ããããã©ãŒã ã«éžæè¢ãã£ãŒã«ãããããSymfony 2ãšã©ãŒãããªã¬ãŒãããŸããããã®åé¡ã¯ãBlogãšã³ãã£ãã£ã«__toStringïŒïŒã¡ãœãããå®è£ ããããšã§è§£æ±ºã§ããŸãã
// src/Blogger/BlogBundle/Entity/Blog.php public function __toString() { return $this->getTitle(); }
ãã³ã
Symfony2ã®ãšã©ãŒã¡ãã»ãŒãžã¯ãçºçããåé¡ã説æããéã«éåžžã«æçã§ããéåžžããšã©ãŒã¡ãã»ãŒãžãèªããšããããã°ããã»ã¹ãéåžžã«ç°¡åã«ãªããŸãããšã©ãŒã¡ãã»ãŒãžã«ã¯ãã«ãã¹ã衚瀺ãããããããšã©ãŒã®åå ãšãªã£ãæé ã確èªã§ããŸãã
ããã§ãããŒãžãæŽæ°ãããšãã³ã¡ã³ããã©ãŒã ã®åºåã衚瀺ãããŸãããŸããæ¿èªãäœæãæŽæ°ãããã°ãªã©ã®äžèŠãªãã£ãŒã«ããåºåãããŠããããšã«ãæ°ä»ãã§ããããããã¯ã以åã«çæãããCommentTypeã¯ã©ã¹ãæ§æããªãã£ãããã§ãã
ãã³ã
衚瀺ããããã¹ãŠã®ãã£ãŒã«ãã¯æ£ããã¿ã€ãã§ãããŠãŒã¶ãŒãã£ãŒã«ãããã¹ããã³ã¡ã³ããã£ãŒã«ãããã¹ããšãªã¢ã2ã€ã®DateTimeãã£ãŒã«ãã䜿çšãããšãæå»ãªã©ãæå®ã§ããŸãã
ããã¯ãFormBuilderã衚瀺ãããã£ãŒã«ãã®ã¿ã€ããæšæž¬ã§ããããã§ãã圌ã¯ããªããæäŸããã¡ã¿ããŒã¿ã«åºã¥ããŠãããè¡ãããšãã§ããŸããCommentãšã³ãã£ãã£ã«å¯ŸããŠéåžžã«å ·äœçãªã¡ã¿ããŒã¿ãå®çŸ©ãããããFormBuilderã¯ãã£ãŒã«ãã®ã¿ã€ãã«ã€ããŠæ£ç¢ºãªä»®å®ãç«ãŠãããšãã§ããŸãã
src / Blogger / BlogBuâândle / Form / CommentType.phpã«ããã¯ã©ã¹ãæŽæ°ããŠãå¿ èŠãªãã£ãŒã«ãã®ã¿ã衚瀺ããŸãã
æ¿å
¥ãã
<?php namespace Blogger\BlogBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class CommentType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('user'); $builder->add('comment'); } /** * @param OptionsResolver $resolver */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'Blogger\BlogBundle\Entity\Comment' )); } public function getBlockPrefix() { return 'blogger_blogbundle_commenttype'; } }
ããã§ãããŒãžãæŽæ°ãããšããŠãŒã¶ãŒåã®ãã£ãŒã«ããšã³ã¡ã³ãã®ãã£ãŒã«ãã®ã¿ã衚瀺ãããŸããä»ãããã©ãŒã ãéä¿¡ãããšãã³ã¡ã³ãã¯ããŒã¿ããŒã¹ã«ä¿åãããŸããããã©ãŒã ãæ€èšŒã«åæ Œããå Žåããã©ãŒã ã³ã³ãããŒã©ãŒã¯ã³ã¡ã³ããšã³ãã£ãã£ã«å¯ŸããŠäœãããªãããã§ããã§ã¯ãã©ã®ããã«ã³ã¡ã³ããããŒã¿ããŒã¹ã«ä¿åããã®ã§ããããïŒãã£ã¯ã¹ãã£ããŒã¿ãäœæãããšãã«ããããè¡ãæ¹æ³ã¯æ¢ã«èª¬æããŸããã以äžã«ç€ºãããã«createActionã¡ãœãããæŽæ°ããŸãã
// src/Blogger/BlogBundle/Controller/CommentController.php public function createAction(Request $request, $blog_id) { //.. if ($form->isValid()) { $em = $this->getDoctrine() ->getManager(); $em->persist($comment); $em->flush(); return $this->redirect($this->generateUrl('BloggerBlogBundle_blog_show', array( 'id' => $comment->getBlog()->getId())) . '#comment-' . $comment->getId() ); } //.. }
persistïŒïŒããã³flushïŒïŒã¡ãœãããåŒã³åºããšãCommentãšã³ãã£ãã£ãä¿åãããŸãããã©ãŒã ã¯PHPãªããžã§ã¯ããåŠçããDoctrine 2ã¯ãããã®ãªããžã§ã¯ãã管çããã³ä¿åããããšã«æ³šæããŠãã ããããã©ãŒã ã®éä¿¡ãšéä¿¡ãããããŒã¿ã®ããŒã¿ããŒã¹ãžã®ä¿åãšã®éã«ã¯çŽæ¥çãªé¢ä¿ã¯ãããŸããã
ããã§ãããã°æçš¿ã«ã³ã¡ã³ããè¿œå ã§ããã¯ãã§ãã

ãããã«
ãã®ç¹ã§ç§ãã¡ã¯å€§ããªé²æ©ãéããŸãããããã°ã¯æåŸ ã©ããã«æ©èœãå§ããŠããŸãããŠãŒã¶ãŒã¯ãããã°æçš¿ã«ã³ã¡ã³ããæçš¿ããããä»ã®ãŠãŒã¶ãŒãæçš¿ããã³ã¡ã³ããé²èŠ§ã§ããããã«ãªããŸãããè€æ°ã®ãã£ã¯ã¹ãã£ãã¡ã€ã«ãåç §ã§ãããã£ã¯ã¹ãã£ãäœæããæ¹æ³ã確èªããDoctrine 2 Migrationsã䜿çšããŠããšã³ãã£ãã£ãå€æŽãããšãã«çµã¿èŸŒã¿ã®ããŒã¿ããŒã¹ã¹ããŒããä¿æããŸãã
次ã«ãã¿ã°ã¯ã©ãŠããšæè¿ã®ã³ã¡ã³ããé 眮ããããã®ãµã€ãããŒã®äœæã«ã€ããŠèŠãŠãããŸãããŸããTwigã®ç¥èãæ¡åŒµããããã䜿çšããŠã«ã¹ã¿ã ãã£ã«ã¿ãŒãäœæããæ¹æ³ã確èªããŸããçµè«ãšããŠãã¢ã»ããã©ã€ãã©ãªã®äœ¿çšãæ€èšããŸããããã¯ãã¢ã»ããã®ç®¡çã«åœ¹ç«ã¡ãŸãã
ãœãŒã¹ãšãµããŒãè³æïŒhttps :
//symfony.com/
http://tutorial.symblog.co.uk/
http://twig.sensiolabs.org/
http://www.doctrine-project.org/
http://odiszapc.ru/doctrine/
ãã¹ãå°æ¬
, , , .
ããŒã1-Symfony2ãšãã³ãã¬ãŒãã®æ§æ
ããŒã2-é£çµ¡å ããŒãžïŒããªããŒã¿ãŒããã©ãŒã ãããã³ã¡ãŒã«
ããŒã3-Doctrine 2ãšããŒã¿ãã£ã¯ã¹ãã£
ããŒã5-Twigæ¡åŒµããµã€ãããŒãããã³è³ç£
ããŒã6-ãŠãããããã³æ©èœãã¹ã
ãŸããããã¥ã¢ã«ãæ°ã«å ¥ã£ããããããžã§ã¯ããªããžããªã«ã¹ã¿ãŒãä»ãããã賌èªããããšãã§ããŸããããããšã