في هذا الفصل سنقوم بتطبيق شامل، سنهدف و نصل لإنجاز موقع إخباري. فلنبدأ إذن:

 

  1. تعريف الانماط Entity و الربط بينها

 

بالنسبة لموقع إخباري، سنحتاج النمط "مقال" Article الذي قمنا بخلقه في الدرس السابق، كما سنحتاب نمطا آخر "تعليق" Comment الذي سيمثل التعاليق التي يمكن للزوار وضعها. نحتاج كذلك لنمط "صوره" Image بحيث ان كل مقال سيتوفر على صورة مصاحبة. قوموا إذن بذلك بإتباع الخطوات المبينة في فصل تسيير قواعد البيانات.

من جهة أخرى، كل "تعليق" يرتبط بمقال معين؛ و عكسيا كل مقال يرتبط بمجموعة من التعاليق. نستطيع أن نقول ذلك لسيمفوني، بتضمين الفئة Article كخاصية للفئة Comment، و كذلك بتضمين مجموعة تعاليق كخاصية للفئة Article

مثلا في الفئة Comment نفعل كما يلي:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Comment
 *
 * @ORM\Table("comment")
 * @ORM\Entity(repositoryClass="AppBundle\Entity\CommentRepository")
 */
class Comment {

    // باقي الخاصيات 

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Article", inversedBy="comment")
     * @ORM\JoinColumn(name="article_id", referencedColumnName="id")
     */
    private $article;


   // بقية الخاصيات و الطرق
   
    /**
     * Get article
     *
     * @return AppBundle\Entity\Article 
     */
    public function getArticle() {
        return $this->article;
    }

    /**
     * Set article
     *
     */
    public function setArticle(Article $article) {
        $this->article = $article;
        return $this;
    }


    //
}

 

ثم في الفئة Article نضيف الخاصية و الطرق التالية:

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="article")
     */
    private $comments;
    
    
    /**
     * Add comment
     *
     * @param AppBundle\Entity\Comment $comment
     * @return Article
     */
    public function addComment(AppBundle\Entity\Comment $comment) {
        $this->comment[] = $comment;
        return $this;
    }

    /**
     * Remove comment
     *
     * @param AppBundle\Entity\Comment $comment
     */
    public function removeComment(AppBundle\Entity\Comment $comment) {
        $this->comment->removeElement($comment);
    }

    /**
     * Get comment
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getComment() {
        return $this->comment;
    }

ثم نطلب من سيمفوني/ORM تحديث الجداول ( سيقوم بإضافة مفتاح خارجي).

 

  1. تصميم إدارة الموقع

 

يفترض بالموقع ان يوفر صفحات للإدارة للتمكن من تحرير المقالات و الإشراف على قبول او رفض التعاليق. لذلك سنستعين بسوناتا ادمنز التي نشرح في درس تصميم الإدارة سيمفوني كيفية تثبيته.

 

  1. انجاز الكونترولر Controller

 

نقوم بخلق كونترولر جديد إسمه ArticleController ( نجعل ملفا src/AppBundle/Controller/ArticleController.php )، أبسط ما يمكن كتابته هو أن تكتفي الطريقة بالبحث عن المقال ذو id المدخل، إن لم تجده تكون النتيجة هي الخطأ ( مقال غير موجود ) و إن وجد المقال يتم إستخاجه و بعثه مع التومبليت المناسب.

 

<?php

namespace AppBundle\Controller;

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class ArtefactsController extends Controller {

    public function viewAction($id) {

        $artf = $this->getDoctrine()
                      ->getManager()
                      ->getRepository('AppBundle:Article')
                      ->find($id);


        if (null === $artf) {
            throw new NotFoundHttpException("Article with " . $id . " not found");
        }


        return $this->render('AppBundle:Article:view.html.twig', array(
                    'artf' => $artf
        ));
    }

}

لن يبقى لنا إلا أن نكتب التومبليت تويغ ( الرجوع للفصل المخصص لشرح التويغ )، ثم نجعل عنوانا مخصصا لهذه الصفحات، بإضافة ما يلي في الملف app/config/routing.yml

aticle_view:
    path:     /article/{id}
    defaults: { _controller: AppBundle:Article:view }

 

  1. ماذا بعد؟

 

الخطوة التالية هي وضع إدارة نظام للمستعملين كما هو مشروح في الرابط.