در این آموزش به بررسی اصطلاحاً Folder Structure فریمورکی (Framework) میپردازیم که بر پایهٔ معماری 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 که مرتبط با نام کنترلر پیشفرض است تعریف کرده سپس کلیهٔ ویوهای این کنترلر را داخل آن تعریف کردهایم (این فایلها حاوی کدهای اچتیامال (HTML) و سیاساس (CSS) هستند که در نهایت در معرض دید کاربران قرار خواهند گرفت.) لازم به یادآوری است که نحوهٔ نامگذاری فایلهای ویو با متدها یا اَکشنهایی که داخل کنترلر تعریف شدهاند یکسان است. به طور مثال، ویوِ مرتبط با متدی تحت عنوان ()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 که دربرگیرندهٔ یکسری فایل مختلف است که این فایلهای پیشفرض پس از اجرای کامپوزر ساخته میشوند و به طور مستقیم ارتباطی با آنها نخواهیم داشت بلکه پشت صحنه فعال خواهند بود.
