انتشار اولین مطلب در Symfony – قسمت ۱

در مقاله قبل در رابطه با مسیردهی صفحات صحبت کردیم و بخش دیزاین آن را با یک قالب آماده به طور کامل پیاده سازی کردیم. در این مقاله قصد دارم اولین مطلب خودمون رو منتشر کنیم و با نحوه ثبت داده در فریمورک سیمفونی آشنا شویم.

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 انجام می‌شود.

Doctrine config DBAL

حالا که تنظیمات فوق انجام شدند با اجرای دستور زیر یک دیتابیس خالی با نام helloWorld ایجاد می‌شود.

php bin/console doctrine:database:create

یکی از اشتباهاتی که معمولا انجام می‌شود این است که collation دیتابیس را تنظیم نکنیم که در آینده باعث به وجود آمدن مشکلاتی می‌شود. با استفاده از دستور زیر میتوانیم دیتابیس را Drop کنیم.

php bin/console doctrine:database:drop --force

میتوانیم با قراردادن تنظیمات زیر در فایل کانفیگ اصلی، collation دیتابیس را تنظیم کنیم.

 utf8 doctrine config dbal

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

Doctrine DBAL connection deafult password Error Expted scalar

Creating an Entity Class

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

میتوانیم به صورت دستی فایل را ایجاد کنیم و در مسیر مورد نظر قرار دهیم و یا با استفاده از دستورات console آن را ایجاد کنیم.

Sample Product Entity in Symfony
یک مثال از Product Entity 

با اجرای دستور زیر Post را ایجاد می‌کنیم.

php bin/console doctrine:generate:entity
create new entity in Symfony

نکته جالب و فوق العاده لذت بخش استفاده از دستورات 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 برای همه کلاس‌ها  فقط از یک فرمت استفاده کنیم.

یک مثال از metadata برای Product 

با توجه به اینکه ما با استفاده از دستور 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 و یا نمایش دهیم.

Comments