ساخت اولین صفحه در Symfony – مسیرهای داینامیک

ساخت اولین صفحه در Symfony – مسیرهای داینامیک

در قسمت قبل یاد گرفتیم اولین صفحه خود را در فریم ورک سیمفونی ایجاد و نمایش دهیم. همانطور که مشاهده کردید ما یک Route در آدرس /musician همراه با یک Controller به نام showAction تعریف کردیم. وقتی به آدرس http://localhost:8000/musician مراجعه می کنیم، showAction اجرا می شود که باعث ساخت یک شی Response و ارسال محتوا به کاربر می شود. اما در این بخش قصد داریم برنامه را کمی پویاتر کنیم، به عبارتی بتوان نام هر موسیقیدانی که در URL درخواست می شود را در صفحه نمایش داد (به عنوان مثال http://localhost:8000/musician/Beethoven یا http://localhost:8000/musician/Mozart).

 

قبل از هر چیز توجه داشته باشید که برای تعریف Route در برنامه که به Controller مورد نظر اشاره داشته باشد، در چهار سینتکس مختلف در قالب‌های Annotation – YAMLXMLPHP می توان نوشت. همانطور که دیدیم ما در بخش قبل برای تعریف مسیر، از سینتکس Annotation (حاشیه‌نویسی) در برنامه استفاده کرده ایم. اما به موجب بزرگ‌تر شدن برنامه بهتر است از یک از سه قالب دیگر استفاده کنیم. من در اینجا YAML را انتخاب می کنم چون از نظر من بسیار خوانا و ساده است. این کار باعث می شود کدها خوانایی بیشتر داشته باشند چون مسیرها را در یک فایل مجزا دیگر تعریف می کنیم.

 

اضافه کردن Bundle جدید در فریم ورک

 

نکته دیگر که باید به آن اشاره شود این است که:‌ در قسمت قبل ما کنترولر MusicianController.php را بطور دستی درست کردیم و کدها را نوشتیم. اما چون ما اکثرا توسعه دهنده‌ها تنبل هستیم، بهتر است از یک روش بهتر، سریعتر استفاده کنیم. شاید حدس زده باشید که چکار می خواهیم انجام دهیم (این همان چیزی است که در لاراول نیز استفاده می شود: استفاده از خط فرمان). با این حال ما در قسمت قبل از Bundle (ماژول) با نام AppBundle که بطور پیشفرض در سیمفونی برای ما تولید شده بود استفاده کردیم. ما قصد داریم تا Bundle و Namespace  (در قسمت قبل با فضای نام آشنا شدیم) خود را داشته باشیم. برای این کار خط فرمان خود را باز کرده و دستور زیر را تایپ و اجرا کنید، پس از اجرا هر سوالی که پرسیده شد با Enter پاسخ دهید:

 

 

همانطور که مشاهده می کنید دستور بسیار شبیه به artisan در لاراول است. ما در این دستور یک bundle جدید با نام MusicianBundle (به حروف بزرگ توجه داشته باشید) با فرمت yml ایجاد کرده ایم:

 

ساخت Bundle در Symfony

 

حال اگر به پروژه خود در ویرایشگر مراجعه کنید خواهید دید که Bundle جدید برای ما تولید شده است و آماده نوشتن کدهای مورد نظر برنامه است:

 

آموزش symfony

 

توجه داشته باشید که Bundle جدید باید در هسته فریم ورک نیز تعریف شود. برای این کار مطمئن شوید MusicianBundle در فایل app/AppKernel.php اضافه شده است:

 

 

همانطور که مشاهده می کنید Symfony بسیار جذاب است. هر ماژولی را که می خواهید می توانید به هسته سیمفونی اضافه یا حذف کنید.

 

تعریف Route به برنامه

 

برای اضافه کردن مسیر جدید به برنامه به فایل MusicianBundle/Resrouces/config/routing.yml مراجعه کنید. همانطور که مشاهده می کنید یک نام پیشفرض برای مسیر در خط اول مشخص شده است.

 

  • path: آدرس URL خود را وارد می کنیم
  • defaults: آدرس کنترولری که در path مشخص شده است را اجرا می کند.

 

path  را بصورت زیر ویرایش کنید:

 

 

همانطور که مشاهده می کنید در defaults، به آدرس کنترولر index اشاره می کند.

 

به سینتکسی که در این کار استفاده شده است دقت کنید! بعد از _controller ابتدا نام باندل (MusicianBundle) و بعد نام کلاس کنترلر (Default) و بعد نام متد (index) با : جدا می شود.

 

name می تواند هر نامی باشد! نکته مهم این است که باید بین آکولاد قرار گیرد. همانطور که در ادامه خواهید دید $name می تواند به عنوان آرگومان به controller ارسال شود. به عنوان مثال وقتی به آدرس /musician/Beethoven مراجعه می کنید، در صفحه Beethoven چاپ خواهد شد و این یعنی برنامه داینامیک شده است.

 

برای این کار به فایل MusicainBundle/Controller/DefaultController.php مراجعه کنید. بله این همان چیزی است که در قسمت قبل آن را بطور دستی نوشتیم. اما در اینجا با دستوری که قبلا اجرا کرده ایم این کار را برای ما بطور خودکار انجام می دهد. در چند خط اول namespace و کلاس‌هایی که باید به آنها در هنگام کد نوشتن دسترسی داشته باشیم آمده است.

 

در ادامه، یک کلاس DefaultController که از کلاس Controller به ارث برده است تعریف شده است.

 

هر نامی که برای controller برنامه تعریف می شود باید با پسوند Controller باشد. به عنوان مثال DefaultController یا HelloWorldController

 

درون این controller یک متد به نام indexAction تعریف شده است که می تواند به دلخواه تغییر دهید. اما در این مثال indexAction کافیست. این متد را بصورت زیر تغییر دهید:

 

 

توجه داشته باشید چون ما در این مثال از شی Response استفاده می کنیم پس باید کلاس آن را نیز به فایل اضافه کنیم تا در سرتاسر فایل قابل دسترسی باشد:

 

 

در آخر باید فایل شما بصورت زیر باشد:

 

 

حال می توانید به آدرس های مختلف مثل http://localhost:8000/musician/Rachmaninoff مراجعه کنید. با تغییر نام می توانید نام‌های مختلف را مشاهده کنید. به عنوان مثال خروجی URL فوق خروجی زیر را خواهد داد:

 

 

فهرست تمام مسیرهای برنامه

 

شاید در Laravel دیده باشید که با یک دستور در خط فرمان می توانیم تمام مسیر‌هایی که در برنامه وجود دارد را بصورت لیست مشاهده کنیم. در سیمفونی نیز همین روال وجود دارد. اما چه اتفاقی می افتد که خروجی مورد نظر به کاربر ارسال می شود؟ 

 

وقتی صفحه را بارگذاری می کنید، Symfony یک حلقه اجرا می کند تا تمام مسیر‌های (route) موجود در برنامه را پیدا و با URL مقایسه کند، آیا /musician/Beethoven است؟ آیا musician/Mozart است؟ اما وقتی route مشابه با URL را پیدا می کند اجرا حلقه را متوقف می کند.

 

با این حال برنامه ما بسیار کوچک است و دارای یک مسیر است. اما اگر برنامه توسعه داده شود لازم می شود که تمام مسیرها را بررسی کنیم. سیمفونی همراه با یک ابزار اشکلال‌زدایی به نام console منتشر می شود. برای استفاده به خط فرمان مراجعه کنید و دستور زیر را اجرا کنید:

 

 

این دستور لیست بزرگی را که می توانید اجرا کنید را نمایش می دهد. بیشتر اینها برای debug کردن برنامه کاربرد دارند و بقیه برای تولید کد و چیزهایی مثل پاک کردن cache استفاده می شوند. در اینجا از debug:router استفاده می کنیم:

 

 

توجه داشته باشید که اگر در این مرحله یا در مرحله قبل با خطایی روبرو شدید، فایل app/config/routing.yml مراجعه کنید و چیزهایی که وجود ندارند را پاک کنید. مسیرهایی در این فایل وجود دارد که بطور پیشفرض تولید شده اند که باعث خطا در برنامه می شود

 

بهترین فریم ورک php

 

همانطور که می بینید مسیر جدیدی که به برنامه اضافه کرده ایم را در خروجی فوق مشاهده می کنیم.

 

در اینجا فایل app/config/routing.yml من بصورت زیر است:

 

 

برای یادگیری مثال‌های زیاد در مورد Controller به مستندات سیمفونی مراجعه کنید!

 

تا اینجا چیزهای سرگرم کننده ای را یاد گرفتیم! شما حالا 50% سیمفونی را یاد گرفتید! آیا سخت بود؟ توجه داشته باشید که مثلث طلایی در سیمفونی routing-controller-response است که حالا درباره آن می دانیم.