در مقاله قبل در رابطه با مسیردهی صفحات صحبت کردیم و بخش دیزاین آن را با یک قالب آماده به طور کامل پیاده سازی کردیم. در این مقاله قصد دارم اولین مطلب خودمون رو منتشر کنیم و با نحوه ثبت داده در فریمورک سیمفونی آشنا شویم.
Databases / Doctrine ORM
یکی از چالشها و کارهای مهم برای راهاندازی هر اپلیکیشنی پیاده سازی ارتباط با دیتابیس و عملیات CRUD است. فریمورک Symfony با هیچ کامپوننتی برای ارتباط با دیتابیس ترکیب (integrate) نشده است اما ارتباط بسیار نزدیکی برای ترکیب و پیاده سازی با کتابخانهای به نام Doctrine دارد. Doctrine ابزاری است که اقدامات برای ارتباط با دیتابیس را آسان و انعطاف پذیر میکند.
نکته: Doctrine از فریمورک سیمفونی کاملا جداست و استفاده از آن اختیاری است. Doctrine یک ORM است ( Object Relational Mapped ) که ارتباط با دیتابیسهای Relational همچون MySql, PostgreSQL و Microsoft SQL را فراهم میکند. ( let you map objects to a relational database )
Configuring the Database
برای شروع ابتدا تنظیمات کانکشن دیتابیس را در مسیر app/config/parameters.yml انجام میدهیم.
# app/config/parameters.yml
parameters:
database_host: localhost
database_name: helloWorld
database_user: root
database_password: password
مشخص کردن کانکشن دیتابیس در فایل parameters.yml یک قرارداد است. این تنظیماتی که در این فایل مشخص میشوند اشاره میکند به فایل کانفیگ اصلی زمانیکه تنظیمات Doctrine انجام میشود.

حالا که تنظیمات فوق انجام شدند با اجرای دستور زیر یک دیتابیس خالی با نام helloWorld ایجاد میشود.
php bin/console doctrine:database:create
یکی از اشتباهاتی که معمولا انجام میشود این است که collation دیتابیس را تنظیم نکنیم که در آینده باعث به وجود آمدن مشکلاتی میشود. با استفاده از دستور زیر میتوانیم دیتابیس را Drop کنیم.
php bin/console doctrine:database:drop --force
میتوانیم با قراردادن تنظیمات زیر در فایل کانفیگ اصلی، collation دیتابیس را تنظیم کنیم.

بعد از اجرای دستور ساخت دیتابیس اگر با خطای زیر مواجه شدید، به خاطر وجود @ در ابتدای پسورد کاربر دیتابیس است که اگر مثلا @dbexample باشه با نوشتن آن به صورت ‘@@dbexample’ این مشکل رفع میشه.

Creating an Entity Class
برای پروژه ساده وبلاگی که داریم نیاز داریم مقالات را روی وبلاگ نمایش دهیم، قبل از آنکه به دیتابیس و Doctrine فکر کنیم میدانیم که به آبجکتی به نام Post نیاز داریم که مقالات در وبلاگ نمایش داده شوند. به این صورت در BlogBundle داخل دایرکتوری Entity آن را ایجاد میکنیم.
میتوانیم به صورت دستی فایل را ایجاد کنیم و در مسیر مورد نظر قرار دهیم و یا با استفاده از دستورات console آن را ایجاد کنیم.

با اجرای دستور زیر Post را ایجاد میکنیم.
php bin/console doctrine:generate:entity

نکته جالب و فوق العاده لذت بخش استفاده از دستورات console در سیمفونی ایجاد تمام فایلها و پیاده سازی ساختار اصولی یک برنامه است. اگر به تصویر بالا دقت کنید هنگام ساخت یک Entity علاوه بر ایجاد Post Entity فایل Repository Class آن و mapping file را هم ایجاد میکند.
تا به اینجای کار این کلاس که به نام Entity شناخته میشود در حال حاضر هیچ ارتباطی با دیتابیس ندارد و صرفا یک کلاس ساده است.
Add Mapping Information
Doctrine allows you to work with databases in a much more interesting way than just fetching rows of scalar data into an array. Instead, Doctrine allows you to fetch entire objects out of the database, and to persist entire objects to the database.

برای اینکه Doctrine بتواند مطابق توضیحات بالا عمل کند باید جداول دیتابیس را به یکسری کلاسهای php خاص map کنیم و همچنین ستونهای دیتابیس به ویژگیها متناظر داخل کلاس map شوند.
این اطلاعات را داخل یک ساختار metadata مشخص میکنیم در واقع یک مجموعه از قوانین است که دقیقا برای Doctrine مشخص میکند که چگونه propertieهای یک کلاس php با جدول دیتابیس map شده اند. فرمت این فایل میتواند yml , annotate و یا xml باشد اما مهم است که برای یک Bundle برای همه کلاسها فقط از یک فرمت استفاده کنیم.

با توجه به اینکه ما با استفاده از دستور console برای ساخت Entity اقدام کردیم فایل map ما به صورت اتوماتیک ساخته میشود که برای Post به صورت زیر است.

بعد از ایجاد Entity ما باید با استفاده از دستور زیر فایل map را اعتبارسنجی کنیم تا از صحت آن و نحوه درست map شدن اطمینان حاصل کنیم.
php bin/console doctrine:schema:validate

همانطور که میبینید برای map شدن با دیتابیس با خطا روبرو شدیم به این خاطر که هنوز جداول دیتابیس ساخته نشدند و صرفا کلاسهای Entity وجود دارند.

با اجرای دستور زیر queryها برای ایجاد جداول اجرا میشوند.
php bin/console doctrine:schema:update --force

در این حالت جداول ساخته شده را مشاهده میکنیم.

با توجه به اینکه دیتابیس و جداول را ایجاد کردیم و ORM به طور درست پیاده سازی شده و فایل map با جداول اعتبارسنجی شد میتوانیم عملیات کار با دیتابیس را شروع کنیم و در کنترلرهایی که داریم داده هایی را insert و یا نمایش دهیم.