Symfony در مقابل PHP خالص – بخش دوم

Symfony در مقابل PHP خالص – بخش دوم

اضافه کردن صفحه برای نمایش بلاگ

در بخش قبل صفحه list بازنویسی شد به طوری که کد قابل استفاده مجدد و سازماندهی شد. برای اثبات آن یک صفحه “show” ایجاد کنید که پست منحصر بفرد از بلاگ را از طریق پارامتر id نمایش دهد.

برای شروع، یک تابع جدید فایل model.php ایجاد کنید که با دادن id مورد نظر، یک پست منحصر بفرد از بلاگ را از دیتابیس بازیابی کند:

حال یک فایل show.php که کنترلری برای این صفحه جدید است ایجاد کند:

در آخر یک قالب جدید templates/show.php برای نمایش پست مورد نظر ایجاد کنید:

تا اینجا ساخت صفحه دوم بسیار آسان بوده و هیچ کد تکراری در آن وجود نداشته است. اما با این حال، این صفحه دارای مشکلات زیادی است که یک فریم‌ورک می تواند آنها را حل کند. به عنوان مثال، یک پارامتر id نامعتبر یا از دست رفته می تواند باعث کرش کردن صفحه شود، بهتر است اگر این اتفاق رخ داد یک صفحه 404 نمایش داده شود، اما این نمی‌تواند به این راحتی انجام شود. بدتر این است که فراموش کرده باشید پارامتر id را از طریق تابع intval() بررسی کنید، کل دیتابیس شما می‌تواند در معرض خطر تزریق SQL باشد.

یکی دیگر از مشکلات این است که هر کنترلر مجزا باید شامل فایل model.php باشد. اگر بطور ناگهانی هر فایل کنترلر نیاز به یک فایل مجزا یا نیاز به انجام دیگر کارها داشته باشد چه باید کرد؟

 

Front Controller برای خلاص شدن

راه حل این است که از یک front controller استفاده شود – یک فایل PHP واحد که تمام درخواست‌ها را پردازش می کند. با یک front controller آدرس‌های برنامه (URL) کمی تغییر می کند، اما انعطاف پذیرتر می شود:

برنامه با Front Controller

index.php به عنوان یک Front Controller

بخش index.php می تواند از URI حذف شود اگر آپاچی یا هر وب سرویس دیگر شما از rewrite rules یا معادل آن استفاده کند. در این مورد، نتیجه URL برای نمایش بلاگ /show خواهد بود.

وقتی از یک Front Controller استفاده می شود، یک فایل واحد PHP (در این مورد index.php) می تواند همه درخواست ها را ارائه دهد. برای صفحه نمایش پست /index.php/show در واقع فایل index.php را اجرا می کند که مسئول مسیریابی درخواست‌ها داخلی است. همانطور که مشاهده می کنید یک Front Controller ابزاری مفیدی است.

 

ایجاد Front Controller

شما یک قدم بزرگ در برنامه برداشته اید. شما با رسیدگی به درخواست ها تنها با یک فایل می توانید بر روی چیزهایی مثل امنیت، تنظیمات بارگذاری و مسیریابی بیشتر تمرکز کنید. حال در این برنامه index.php به اندازه کافی هوشمند شده است که لیست پست های بلاگ یا نمایش پست بر اساس URL را نمایش دهد:

برای سازماندهی هر دو کنترلرها (index.php و show.php) حال توابع PHP‌ هستند و هر یک در فایل جداگانه قرار گرفته اند controllers.php:

index.php به عنوان یک Front Controller نقش کاملا جدیدی را بازی می کند، یکی برای بارگذاری کتابخانه‌های اصلی و مسیریابی نرم افزار و دیگری دو کنترلر list_action() و show_action() است.

 

یکی دیگر از مزیت های Front Controller انعطاف پذیری در URL است. توجه داشته باشید که URL برای نمایش پست بلاگ می تواند از /show به /read با تغییر کد تنها در یک محل تغییر کند.

در حال حاظر برنامه از یک فایل واحد PHP به یک ساختاری که سازماندهی شده است و اجازه استفاده مجدد از کدها را دارد تبدیل شده است. شما حالا باید شادتر باشید اما زیاد راضی نباشید. به عنوان مثال سیستم مسیریابی بی ثبات است و /index.php را که باید از / قابل دسترس باشد به رسمیت نمی‌شناسد (اگر Apache rewrite rules فعال باشد). همچنین به جای توسعه بلاگ زمان زیادی صرف کار بر روی معماری کد (مثل مسیریابی، فراخوانی کنترلر، قالب‌ها و غیره) می شود. باید زمان بیشتری را بر روی رسیدگی به فرم ارسالی، اعتبار سنجی ورودی‌ها، ورود به سیستم و امنیت صرف شود. با وجود تمام این مشکلات چرا باید دوباره چرخ را اختراع کنیم؟!