در این آموزش به بررسی اصطلاحاً Folder Structure فریمورکی میپردازیم که بر پایهٔ معماری MVC توسعه خواهیم داد به طوری که داریم:
mvc
├── app
│ ├── Base
│ │ ├── Config
│ │ │ └── Database.php
│ │ ├── Controllers
│ │ │ └── DefaultController.php
│ │ ├── Models
│ │ │ └── User.php
│ │ └── Views
│ │ └── default
│ │ ├── about.php
│ │ ├── homepage.php
│ │ ├── notfound.php
│ │ └── users.php
│ └── Core
│ ├── App.php
│ ├── BaseController.php
│ ├── Interfaces
│ │ ├── ControllerInterface.php
│ │ └── UserInterface.php
│ └── Routing.php
├── composer.json
├── public
│ ├── css
│ │ └── styles.css
│ ├── index.php
│ ├── .htaccess
│ └── js
│ └── app.js
└── vendor
├── autoload.php
└── composer
├── autoload_classmap.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
├── ClassLoader.php
├── installed.json
└── LICENSE
همانطور که ملاحظه میشود، برای این پروژه نامی دلخواه همچون mvc
در نظر گرفتهایم که داخل بخش روت پروژه شاهد فایل و فولدرهای زیر هستیم:
mvc
├── app
├── composer.json
├── public
└── vendor
فولدر app
جایی است که کامپوننتهای اصلی این فریمورک قرار میگیرند. فایل composer.json
هم میتواند دربرگیرندهٔ اطلاعات مرتبط با وابستگیهای پروژه باشد اما از آنجایی که در این پروژه از هیچگونه لایبرری دیگری استفاده نخواهیم کرد، نام هیچگونه وابستگی در این فایل درج نخواهد بلکه صرفاً به منظور قابلیت Autoloading از این فایل استفاده خواهیم کرد که در آموزشهای آتی به طور مفصل پیرامون این موضوع بحث خواهیم کرد.
فولدر public
نیز حاوی فایلی خواهد بود که نقش Bootstrap یا «نقطهٔ شروع برنامه» را خواهد داشت مضاف بر اینکه فایلهای سیاساس، جاوااسکریپت، تصاویر و ... را میتوان در این فولدر قرار داد (در حقیقت، این فولدر نقش همان فولدر public_html
در هاستهای اشتراکی را دارا است.)
در نهایت، به فولدر vendor
میرسیم که ارتباط تنگاتنگی با فایل composer.json
دارا است که شامل فایلهای مرتبط با وابستگیهای پروژه و همچنین فایل مهمی تحت عنوان autoload.php
میباشد.
بررسی فولدر app
پیش از این گفتیم که این فولدر حاوی اصلیترین ریسورسهای فریمورک ما است که حاوی فولدرها و فایلهای زیر است:
app
├── Base
│ ├── Config
│ │ └── Database.php
│ ├── Controllers
│ │ └── DefaultController.php
│ ├── Models
│ │ └── User.php
│ └── Views
│ └── default
│ ├── about.php
│ ├── homepage.php
│ ├── notfound.php
│ └── users.php
└── Core
├── App.php
├── BaseController.php
├── Interfaces
│ ├── ControllerInterface.php
│ └── UserInterface.php
└── Routing.php
در این فولدر، دو پوشه تحت عناوین Core
و Base
داریم به طوری که Core
به منزلهٔ کِرنِل این فریمورک است و Base
هم ماژول (کامپوننت) پیشفرضی است که بر پایهٔ کِرنِل نوشته شده است.
داخل فولدر Core
شاهد فایلی تحت عنوان App.php
هستیم که در این فایل مشخص میشود بر اساس یوآرالی که کاربر وارد کرده، کدام کنترلر باید فراخوانی گردد. فایل دیگر BaseController.php
نام دارد که قرار است سایر کنترلرهای این فریمورک از آن ارثبری کنند. سپس به فولدری تحت عنوان Interfaces
میرسیم که میتوانیم کلیهٔ اینترفیسهای اپلیکیشن خود را داخل این فولدر تعریف کنیم به طوری که به صورت پیشفرض دو اینترفیس تحت عناوین ControllerInterface.php
و UserInterface.php
داخلش تعریف شده است و در نهایت هم به فایل Routing.php
میرسیم که مشخصکننده لینکهای معتبر است که کاربران میتوانند مورد استفاده قرار دهند.
پیش از این گفتیم که این فریمورک یک کامپوننت اصلی و پیشفرض دارا است به نام Base
که در ادامه به بررسی فولدرها و فایلهای داخل آن میپردازیم. ابتدا فولدری داریم تحت عنوان Config
که حاوی فایلی است به نام Database.php
که کلیهٔ کانفیگهای ارتباط با MySQL داخل این فایل تنظیم شدهاند (چنانچه علاوه بر سیستم مدیریت پایگاه دادهٔ MySQL بخواهیم از دیتابیسهای دیگری من جمله SQLite استفاده کنیم، به راحتی قادر خواهیم بود تا داخل این فولدر کلاسهای مرتبط دیگری بسازیم.) در ادامه، میبینیم که ساختار MVC در قالب فولدرهای Models
،Controllers
و Views
پیادهسازی شده است.
نکته |
لازم به یادآوری است که اسامی فوق اختیاری هستند اما با توجه به اینکه مرتبط بودن نامها با شیوهٔ نامگذاری MVC به درک بهتر ساختار پروژه کمک میکند، از نامهای فوق استفاده شده است. همچنین اگر توجه کرده باشید، در نامگذاری این فولدرها از اسامی جمع استفاده شده است در حالی که میتوان مثلاً به جای Controllers از Controller استفاده کرد اما به نظر میرسد که استفاده از اسامی جمع با توجه به اینکه ممکن است به طور مثال بیش از یک مدل، کنترلر یا ویو داشته باشیم، نام بامسمیتری است. |
داخل فولدر Controllers
فایلی داریم تحت عنوان DefaultController.php
که به منزلهٔ کنترلر پیشفرض این کامپوننت است به طوری که در نهایت کلیهٔ ریکوئستها به این کنترلر و متدهای داخل آن ختم میشوند. داخل فولدر Models
فایلی داریم تحت عنوان User.php
که به منزلهٔ مدلی برای ارتباط با جدولی حاوی اطلاعات کاربران سایت است و داخل فولدر Views
برای آنکه کلیهٔ متدهای هر کنترلر مشخص باشند، پوشهای تحت عنوان default
که مرتبط با نام کنترلر پیشفرض است تعریف کرده سپس کلیهٔ ویوهای این کنترلر را داخل آن تعریف کردهایم (این فایلها حاوی کدهای اچتیاماس و سیاساس هستند که در نهایت در معرض دید کاربران قرار خواهند گرفت.) لازم به یادآوری است که نحوهٔ نامگذاری فایلهای ویو با متدها یا اَکشنهایی که داخل کنترلر تعریف شدهاند یکسان است. به طور مثال، ویوِ مرتبط با متدی تحت عنوان ()homepage
در فایلی با نام homepage.php
قرار دارد.
بررسی فولدر public
پیش از این گفتیم که این فولدر نقشی همچون فولدر public_html
در هاستهای اشتراکی را دارا است و به نوعی نقطهٔ شروع اپلیکیشن است به طوری که حاوی فولدرها و فایلهای زیر است:
public
├── css
│ └── styles.css
├── index.php
├── .htaccess
└── js
└── app.js
همچنین میتوان کلیهٔ فایلهای سیاساس، جاوااسکریپت، تصاویر و ... را داخل این فولدر قرار داد و همانطور که میبینیم، فولدری داریم تحت عنوان css
که حاوی فایلی است به نام styles.css
که کدهای سیاساس کاستومایزشدهٔ خود را داخل آن خواهیم نوشت. همچنین فولدر دیگری را شاهد هستیم به نام js
که داخلش فایلی ساختهایم تحت عنوان app.js
که همچون مورد قبل، میتوان کلیهٔ کدهای جاوااسکریپتی خود را داخل این فایل نوشت و یا بسته به نیاز خود، فایلهای جاوااسکریپتی مختلفی داخل این فولدر ساخته و بعداً در ویو مورد استفاده قرار داد.
دو فایل بسیار مهم داخل این فولدر قرار دارند تحت عناوین htaccess.
و index.php
که فایل اول این وظیفه را دارا است تا کلیهٔ ریکوئستهای ارسالی را به فایل index.php
بفرستد و این فایل نیز این ریکوئستها را برای فایل App.php
که بخشی از کِرنِل این فریمورک است ارسال نموده و در آنجا درخواستها پردازش میشوند.
بررسی فولدر vendor
در نهایت به فولدری میرسیم که مرتبط با پَکیج مَنِجِر زبان پیاچپی تحت عنوان Composer است. همانطور که پیش از این اشاره کردیم، این فولدر دربرگیرندهٔ کلیهٔ دیپندنسیها یا لایبرریهایی است که پروژهٔ ما به آنها وابسته است (جهت آشنایی بیشتر با این پَکیج مَنِجِر، میتوانید به مقالهٔ کامپوزر چیست؟ مراجعه نمایید.) به طوری که در این فولدر داریم:
vendor
├── autoload.php
└── composer
├── autoload_classmap.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
├── ClassLoader.php
├── installed.json
└── LICENSE
همچنین به منظور پیادهسازی مفهومی تحت عنوان Autoloading، به فایلی داخل این فولدر تحت عنوان autoload.php
ارجاع خواهیم داد که این امکان را در اختیارمان قرار میدهد تا بدون نیاز به استفاده از دستوراتی همچون include
یا require
بتوانیم کلاسهای مورد استفادهٔ خود را در جایجای اپلیکیشن ایمپورت نماییم.
همانطور که ملاحظه میشود، شاهد فولدری هستیم تحت عنوان composer
که دربرگیرندهٔ یکسری فایل مختلف است که این فایلهای پیشفرض پس از اجرای کامپوزر ساخته میشوند و به طور مستقیم ارتباطی با آنها نخواهیم داشت بلکه پشت صحنه فعال خواهند بود.