عندما ستصبحون ملمين بالبرمجة في فريمورك سيمفوني، و ستنكبون على إنجاز تطبيق أو موقع جديد، ستكون أول خطوة تقومون بها هي تصميم النموذج Model الأنسب لما أنتم بصدده.

العارفون بالبرمجة كائنية التوجه يفهمون الأمر، إذ أن وضع تصميم الهندسة الذي يجرد الفئات و خاصياتها و طرقها و العلاقات بينها (UML Diagram) يكون سابقا لأي برمجة، هذا رابط لمن من يريد فهم ماهية البرمجة كائنية التوجه  من خلال مثلا بسيط  (الفصل مخصص لجافا لكن المفاهيم لا تتعلق بلغة البرمجة). نتحدث عن كائنات علائقية، لأنها كائنات ذات تمثيل معين في قاعدة البيانات العلائقية .. كلما تعلق الأمر بترسيخ معطيات معينة سيقودنا لإستعمال قاعدة البيانات. في php كما في java توجد مكتبات متخصصة في ربط الفئات التي نعرفها بجداول موجودة في قاعدة البيانات. سيمفوني يتضمن إحدى هذه المكتبات إسمها Doctrine2 و هي التي سنتحدث عنها بتفصيل في هذا الفصل.

 

  1. التهيئة


حسنا، فلنبدأ بالتهيئة .. تذكروا اننا حين قمنا بتثبيت سيمفوني، طلب منا إعطاء قيمة لبعض المتغيرات، حينها طلبت منكم عدم الإكتراث لأننا نستطيع تعديلها يدويا، فلنفعل ذلك، كل شيء موجود في الملف : app\config\parameters.yml

 

# This file is auto-generated during the composer install
parameters:
    database_host: localhost
    database_port: null
    database_name: symf3
    database_user: root
    database_password: null
    mailer_transport: smtp
    mailer_host: 127.0.0.1
    mailer_user: null
    mailer_password: null
    secret: 8t8t

قوموا إذن بخلق قاعدة بيانات عبر PHPMyadmin  و كذلك مستعمل مع كلمة السر، و عدلوا قيم database_name و database_user و database_password في الملف أعلاه. ثم تسلحوا بموجهات أوامركم لأننا سنستعمل الكمبوزر composer. الإنتباه مع اليامل ( اربع فراغات بالضبط قبل إسم الخاصية و فراغ واحد بالضبط بعد النقطتين).

 

  1. خلق Entity

 

هنا سنحاول خلق فئة مقال لإدخال مقالاتنا لقاعدة البيانات.

في موجه الاوامر نتمركز في ملف المشروع ثم ندخل الأمر أسفله :

C:\xampp\htdocs\symf3>php bin/console doctrine:generate:entity


  Welcome to the Doctrine2 entity generator



This command helps you generate Doctrine2 entities.

First, you need to give the entity name you want to generate.
You must use the shortcut notation like AcmeBlogBundle:Post.

The Entity shortcut name:

 

فيطلب منا البرنامج إعطاء إسم للكيان (entity) الذي نريد خلقه، يجب أن يكتب الإسم بكتابة إسم البندل متبوعا بنقطتين يليهما إسم الكيان، كما هو مشروح بالإنجريزية أعلاه، في مثالنا أدخلنا AppBundle:Article لنستعمل البندل الموجود إعتباطيا. بعدها سيسئلكم البرنامج عن أي لغة كتابة تستعملون، سنختار annotation المقترح إعتباطيا (أدخل دون وضع أي قيمة.

Determine the format to use for the mapping information.

Configuration format (yml, xml, php, or annotation) [annotation]:

ثم سيطلب منكم إدخال إسم خاصيات الكائن و صنف هذه الخاصيات

New field name (press <return> to stop adding fields): title
Field type [string]:
Field length [255]: 100
Is nullable [false]: false
Unique [false]: false

New field name (press <return> to stop adding fields):

 

إستمروا على هذا المنوال، و عندما تنتهون من إدخال جميع الفئات، ضعوا ادخل على السؤال New field name دون وضع قيمة

بعدها إذهبوا و انظروا مذا صنع البرنامج داخل هذا الملف :  src\AppBundle ، لقد خلق الملفين Entity و Repository و داخلهما ملفات تمثل ما أدخلناه عبر موجه الأوامر ، شاهدوا مثلا بداية محتوى الملف src\AppBundle\Entity\Article.php

 

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Article
 *
 * @ORM\Table(name="article")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ArticleRepository")
 */
class Article
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=100)
     */
    private $title;

التعليقات التي نشاهد ليست تعليقات بشرية و لا يجب مساسها لأنها جزء من الكود، هذه التعليقات هي التي تخلق العلاقة بين الفئة Article في PHP و الجدول article في قاعدة بيانات .. بالمناسبة، لم نخلق بعد الجدول، فلنعد الى موجه الأوامر و نقم بما يلي :

 

C:\xampp\htdocs\symf3>php bin/console doctrine:schema:update --dump-sql

الجواب سيكون بمثابة مجموعة الجداول التي سيتم خلقها، مثلا بالنسبة للمقالات:

CREATE TABLE article (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(100) NOT NUL
L, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE =
InnoDB;
...

لتفعيل خلق الجداول نقوم ب

C:\xampp\htdocs\symf3>php bin/console doctrine:schema:update --force
Updating database schema...
Database schema updated successfully! "x" query was executed

 

يمكنكم التأكد مما قام به سيمفوني بإطلالة عبر قاعدة بياناتكم، لقد قام بخلق الجداول

من جهة أخرى، قد نود لاحقا إضافة خاصيات للفئة، لا مشكل نقوم بإضافة الخاصية في الكود سورس مع وضع annotation المناسب ثم إجراء الامرين اعلاه ( مع dump-sql للتأكد و force للتفعيل ). لن يكتفي البرنامج بتعديل الجدول في Mysql، بل سيقوم كذلك بإضافة الطرق getxxxx و setxxxx الخاصة بالخاصية المضافة xxxx.

 

  1. ترسيخ الكائنات في قاعدة البيانات

 

نحن بصدد العمل في هندسة من نوع MVC، لذلك سنتوجه للكونترولر للقيام بعملياتنا و نترك النموذج ليبقى نموذجا. سيكون هدفنا إضافة مقال، و الإضطلاع عليه. مثال الإضافة الذي سنعرضه ( غير دينامي ) لا ينفي الهدف الذي يبقى التعرف على كيفية الترسيخ. إذ في الحياة الواقعية سنقوم بتثبيت بندل Bundle أو أكثر مختصين في الإدارة و التحرير.

<?php

namespace AppBundle\Controller;

use AppBundle\Entity\Article;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
  public function addAction(Request $request)
  {

    $article = new Advert();
    $article->setTitle('Hello');
    $article->setContent("This is the first persistance");

    // em : EntityManager
    $em = $this->getDoctrine()->getManager();
    $em->persist($article);
    $em->flush();

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

حسنا، كما بينا سابقا يمكنكم خلق طريق في الروتر router يناسب الطريقة add المعرفة أعلاه، عندما ستنادون على الصفحة المعرفة ستقوم الطريقة addAction اعلاه بخلق مقال جديد بعنوان و مضمون معينين ثم تدخلهما في قاعدة البيانات. و في الاخير تحولنا على صفحة التويغ add.html.twig مع المعامل article بقيمة article$( اي المقال ذاته الذي ادخلناه للتو). بطبيعة الحال، إذا قمتم بإستدعاء نفس الصفحة سيقوم بنفس الشيء. نترك للقارئ خلق هذا الملف و التعامل مع المعاملات، مثلا للولوج لقيمة X للمقال سنكتب في تويغ :

{{article.title}}

 

  1. إستخراج البيانات من القاعدة

 

لإستكمال فصل الإنطلاقة مع Doctrine لا بد من التطرق لكيفية الولوج للبيانات في قاعدة البيانات. سنستعمل ابسط وسيلة لولوج عنصر معين في جدول قاعدة البيانات، سنستعمل الخاصية id التي يضمنها سيمفوني لكل الفئات. العنصر الذي أخلناه للقاعدة في الفقرة السابقة يأخذ الآي دي 1

  public function viewAction($id)

  {


    $repository = $this->getDoctrine()
                      ->getManager()
                  ->getRepository('OCPlatformBundle:Advert')
    ;

    $article = $repository->find($id);


    if (null === $advert) {

      throw new NotFoundHttpException("Article with id =".$id." not found ");

    }


    return $this->render('AppBundle:Article:view.html.twig', array(

      'article' => $article

    ));

  }

طبعا، يجب خلق الطريق في الروتر و خلق ملف التويغ