تو دنیای پرسرعت و پیچیده توسعه وب، همیشه دنبال ابزارهایی هستیم که هم کارمون رو راحتتر کنن و هم نتیجه رو سریعتر به دستمون برسونن. فریمورکهای بزرگ مثل Laravel یا Symfony قدرت زیادی دارن، اما بعضی وقتا برای پروژههای کوچیک یا متوسط زیادی بزرگ و پیچیدن. اینجاست که فریمورکهای سبکتر مثل Slim وارد میشن! اگه دلت میخواد با یه فریمورک ساده و سریع کار کنی که توی ساخت APIها یا اپلیکیشنهای کوچیک دستت رو باز بذاره، Slim میتونه بهترین رفیقت باشه. Slim فقط یه ابزار نیست، یه راهحل هوشمند برای توسعهدهندههایی مثل توئه که سرعت و سادگی رو به هر چیزی ترجیح میدن. تو این مقاله، قراره هر چی باید درباره Slim بدونی رو با هم مرور کنیم؛ از تاریخچه تا امکانات و نحوه استفاده از اون.
Slim یه فریمورک خیلی سبک و مینیمال برای PHP هست که بیشتر برای ساختن APIها استفاده میشه. اگه بخوام خیلی ساده بگم، Slim رو میتونیم یه جور "کتابخونه روتینگ" در نظر بگیریم. یعنی چی؟ یعنی وقتی یه درخواست HTTP (مثل وقتی که تو یه آدرس وب رو تو مرورگرت میزنی) میرسه، Slim این درخواست رو میگیره، میفرسته به اون تابعی که براش تعیین شده، و بعدش هم پاسخ HTTP رو برمیگردونه. چون Slim خیلی سبک و جمعوجوره، سریع و کارآمده و مثل فریمورکهای بزرگ، کلی قابلیت اضافه و بیاستفاده همراهش نیست.
Slim از مفهومی به نام میدلور (middleware) استفاده میکنه. هر میدلور یه کار خاص انجام میده. حالا اگه چند تا از این میدلورها رو به هم بچسبونی، میتونی اپلیکیشنهای پیچیدهتری بسازی. مثلاً میتونی از میدلورهای آماده برای احراز هویت، امنیت، ساختن قالبهای HTML، کش کردن و خیلی چیزای دیگه استفاده کنی.
Slim اوپنسورس (رایگان و بازمتن) هست و توسط یه جامعه از توسعهدهندهها پشتیبانی میشه. میتونی Slim رو به تنهایی برای رندر سمت سرور استفاده کنی یا حتی اون رو کنار فریمورکهای فرانتاند مثل React یا Vue برای رندر سمت کلاینت به کار ببری.
در کل، Slim همچنان به عنوان یکی از محبوبترین فریمورکهای سبک PHP برای توسعه سریع و راحت اپلیکیشنهای تحت وب و API شناخته میشه و هر سال امکانات جدید و بهینهسازیهای بیشتری بهش اضافه میشه.
اگه دنبال یه فریمورک هستی که سریع، کارآمد، منعطف و کاملاً تحت کنترلت باشه، Slim میتونه بهترین انتخابت باشه. Slim از استانداردهای معتبری مثل PSR-7 و PSR-15 پشتیبانی میکنه، که این یعنی نمیذاره به یه سری کتابخونه یا ابزار خاص گیر بیفتی. علاوه بر این، Slim با اصول خوب برنامهنویسی مثل SOLID، الگوهای طراحی، اصول امنیتی و تزریق وابستگی (Dependency Injection) کاملاً سازگاره.
Slim از نظر یادگیری هم نسبت به فریمورکهای بزرگتری مثل Laravel یا Symfony خیلی راحتتره. فریمورکهای بزرگ خیلی چیزا رو به صورت آماده ارائه میکنن، مثل احراز هویت، امنیت، مدیریت پایگاه داده، موتور قالبها، مدیریت سشن و غیره. ولی تو Slim، اینا جزء هسته اصلی نیستن و فقط وقتی نیازشون داری میتونی از طریق میدلورهای شخص ثالث نصبشون کنی. این یعنی هر چیزی که لازم نداری، نصب نمیکنی و از حجم پروژت کم میشه.
Slim برای ساخت APIهای مدرن و سرویسهایی که با فرمت JSON یا XML دادهها رو تبادل میکنن، خیلی مناسب و کاربردیه. علاوه بر این، میتونی با استفاده از میدلورها قابلیتهای پیچیدهتری به اپلیکیشنت اضافه کنی. حتی با کمک موتورهای قالب مثل Twig-View یا PHP-View، میتونی صفحات وب کامل رو سمت سرور رندر کنی. این یعنی Slim وارد دنیای فریمورکهای MVC هم میشه و خیلی از توسعهدهندهها از Slim به عنوان بکاند برای پروژههایی با فرانتاندهایی مثل Next.js استفاده کردن. همچنین میتونی از Slim کنار Vue.js برای ساخت SPA (اپلیکیشن تکصفحهای) استفاده کنی.
یه تحقیق در سال ۲۰۱۶ نشون داد که نسخه ۲.۶ Slim از نظر تعداد درخواست در هر ثانیه (throughput)، میزان استفاده از حافظه و زمان اجرا در رتبه پنجم قرار داشت. Phalcon و Ice بهترین بودن. یه مطالعه دیگه تو سال ۲۰۱۷ هم نشون داد که نسخه ۳.۰ Slim در رتبه سوم قرار گرفته، بعد از Phalcon و CodeIgniter، و از میکروفریمورکهای Silex و Lumen عملکرد بهتری داشته.
یکی از دلایل سرعت Slim اینه که سیستم روتینگش بر پایه FastRoute ساخته شده. FastRoute با تکهتکه کردن و بهینهسازی پردازش عبارات باقاعده (regular expressions)، روتینگ رو سریعتر و بهینهتر میکنه.
ویژگیهای اصلی Slim رو میتونیم تو چند بخش مهم خلاصه کنیم:
یکی از مهمترین قابلیتهای Slim اینه که درخواستهای HTTP رو خیلی کارآمد به تابعها یا متدهای مرتبط هدایت میکنه. این روتینگ با استفاده از عبارات باقاعده (regular expressions) انجام میشه که میتونه پارامترهایی رو هم دریافت و به تابعها پاس بده. مثلاً وقتی کاربر آدرسی رو وارد میکنه، Slim بررسی میکنه که این درخواست به کدوم مسیر و تابع مربوطه بره.
در Slim میتونی از میدلورهای داخلی یا میدلورهای شخص ثالث استفاده کنی. این میدلورها بهت اجازه میدن درخواستها و پاسخها رو به صورت خاص و ماژولار مدیریت کنی. یعنی اگه بخوای، میتونی برای هر کاری یه میدلور بنویسی یا از آمادههاش استفاده کنی. جالبتر اینکه میتونی ترتیب میدلورها رو عوض کنی یا هر کدوم رو که نیاز نداری غیرفعال کنی. این ویژگی خیلی انعطافپذیر و دستت رو باز میذاره.
Slim با استاندارد PSR-7 کاملاً سازگاره. این استاندارد یه سری رابط (interface) برای مدیریت پیامهای HTTP مشخص میکنه. Slim خودش پیادهسازی این استاندارد رو داره، اما اگه دوست داشته باشی، میتونی از پیادهسازیهای دیگه هم استفاده کنی. یعنی دستت تو انتخاب بازه.
تزریق وابستگی بهت کمک میکنه که برنامت راحتتر تست بشه یا تنظیمات مختلفی بهش بدی. Slim این امکان رو با پشتیبانی از PSR-11 فراهم کرده که یعنی با استانداردهای این حوزه سازگار و قابل اطمینانه.
میدلورهای Slim رو میتونی مثل دایرههای هممرکز تصور کنی. هر میدلور از بیرونیترین لایه شروع به کار میکنه و میرسه به داخلیترین لایه، جایی که برنامه اجرا میشه و روتینگ اتفاق میوفته. بعد از اجرای برنامه، دوباره از داخلیترین به بیرونیترین لایهها برمیگرده و میدلورها باز بررسی میشن. یه جور دیگه هم میشه تصورش کرد، مثل یه پشته LIFO (آخرین ورودی، اولین خروجی).
فرض کن دو تا میدلور داریم: یکی برای احراز هویت (authentication) و یکی برای کش (caching). اول میدلور احراز هویت اجرا میشه. اگه احراز هویت شکست بخوره، دیگه بقیه مراحل اجرا نمیشن. اما اگه موفق بشه، میدلور کش اجرا میشه. حالا اگه پاسخی توی کش موجود باشه، برنامه از همون استفاده میکنه و دیگه نیازی به اجرای تابع اصلی نیست. اما اگه چیزی توی کش نبود، تابع اصلی اجرا میشه و بعد پاسخ تولید شده توی کش ذخیره میشه. در آخر، میدلور احراز هویت دوباره اجرا میشه تا اگه لازم باشه، پاسخی رو تغییر بده یا تکمیل کنه.
میدلورهای Slim با آبجکتهای درخواست/پاسخ PSR-7 و هندلر درخواست PSR-15 سروکار دارن. میتونی میدلور رو به کل برنامه اضافه کنی که با هر درخواست اجرا بشه، یا فقط برای مسیرهای خاص ازش استفاده کنی که بعد از روتینگ اجرا بشه. تو هر دو حالت، میدلور بیرونیترین همیشه آخرین چیزی هست که اضافه میشه.
وقتی Slim رو نصب میکنی، چندتا میدلور بهصورت پیشفرض همراهش هست که توی خیلی از پروژهها کاربرد دارن. اینا رو برات توضیح میدم:
وقتی یه اپلیکیشن Slim میسازی، اولین کاری که میکنی اینه که یه شیء از نوع Slim\App() ایجاد میکنی. معمولاً این کار رو با متد AppFactory::create() انجام میدن. بعدش، برای هر متد HTTP مثل GET، POST یا DELETE، مسیرهای مختلف تعریف میکنی. پس از اون، میدلورها رو به برنامه اضافه میکنی. در نهایت هم اپلیکیشن با استفاده از متد run() اجرا میشه.
میدلورها به ترتیب از بیرونیترین به داخلیترین اجرا میشن. وقتی که به داخلیترین لایه میرسن، اپلیکیشن درخواست HTTP رو به مسیر مناسبش میفرسته. اگه اون مسیر خودش میدلور داشته باشه، اونا هم به همین ترتیب اجرا میشن. بعد از اینکه درخواست پردازش شد، کنترل از داخلیترین به بیرونیترین میدلورها برمیگرده و در نهایت پاسخ HTTP ساخته و برگردونده میشه.
تو فریمورک Slim میتونی برای انواع متدهای HTTP مثل GET، POST، PUT، DELETE، OPTIONS و PATCH مسیر تعریف کنی. حتی میتونی با استفاده از متد $app->any() برای همه متدها یه مسیر تعیین کنی یا برای چند متد بهطور همزمان از $app->map(['GET', 'POST']) استفاده کنی.
هر متد مربوط به مسیر (route method) یه الگو میگیره که بر اساس اون، درخواست HTTP با URI مطابقت داده میشه. مثلاً از {} برای تعیین پارامترهای پویا استفاده میشه. همچنین میتونی توی این الگوها از عبارات باقاعده (regular expressions) استفاده کنی. بخشهای اختیاری رو هم میتونی با [] نشون بدی. مثلاً:
$app->get('/users[/{id:[0-9]+}]', function ($request, $response, $args) {
// Logic here
});
این کد هم مسیر /users و هم مسیر /users/23 رو مدیریت میکنه. چون بخش id اختیاریه، میتونی بدون وارد کردن عدد هم به این مسیر دسترسی داشته باشی، ولی اگه عدد وارد کنی، باید یه عدد مثبت باشه.
هر مسیر یه تابع یا متد (همون callback) داره که به عنوان پردازشگر اون مسیر عمل میکنه. این تابع سه تا ورودی داره: Request، Response و Arguments. مثلاً پارامتری که توی الگو به عنوان id تعریف کردی، توی آرگومانها میاد و میتونی ازش به این شکل استفاده کنی: $args['id']. این callback میتونه یه تابع ناشناس (anonymous function) باشه یا متدی که توی یه کلاس تعریف شده.
برای اینکه کدت مرتبتر و قابل نگهداریتر باشه، میتونی مسیرها رو گروهبندی کنی. مثلاً دو مسیر /users/{id:[0-9]+} و /users/{id:[0-9]+}/reset-password رو میتونی توی یه گروه قرار بدی که همه زیرمجموعههای /users/{id:[0-9]+} رو پوشش بده.
اگه تازه میخوای با Slim کار کنی، بهترین جایی که میتونی شروع کنی مستندات رسمی Slim هست. اونجا یه مثال ساده از Slim رو برات توضیح میده و بعد وارد جزئیات میشه. برای اینکه همیشه از آخرین آپدیتها باخبر بشی، به بلاگ Slim هم سر بزن. و اگه سوال یا مشکلی داشتی، انجمنهای گفتوگوی Slim جای خوبیه که میتونی از جامعه برنامهنویسها کمک بگیری.
اگه دنبال آموزشهای مرحلهبهمرحله برای ساختن API یا اپلیکیشن با Slim هستی، میتونی Slim Walkthrough و Building Modern APIs with Slim Framework نوشته Rob Allen رو چک کنی. این منابع راهنماییهای خوبی برای شروع دارن.
اگه دوست داری توی توسعه خود Slim مشارکت کنی، کدهای Slim توی GitHub موجوده و میتونی به پروژه کمک کنی.
در این بخش چند نمونه کد ساده از فریمورک Slim رو میبینیم که بهت کمک میکنه سریعاً با نحوه کار کردن این فریمورک آشنا بشی.
در اینجا یک مثال ساده از کد "Hello World" با استفاده از Slim فریمورک داریم:
// Source: https://www.slimframework.com/
// Accessed 2022-09-26
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/hello/{name}', function (Request $request, Response $response, array $args) {
$name = $args['name'];
$response->getBody()->write("Hello, $name");
return $response;
});
$app->run();
در این کد، درخواست به مسیر /hello/{name} هدایت میشه و متغیر name که توی URL وارد شده به تابع تحویل داده میشه. به سادگی متنی با نام وارد شده نمایش داده میشه، مثل "Hello, 7Learn".
در مثال زیر، دو میدلور اضافه کردیم که یکی قبل از پردازش درخواست و یکی بعد از پردازش اجرا میشه:
// Source: https://www.slimframework.com/docs/v4/concepts/middleware.html
// Accessed 2022-09-29
require __DIR__ . '/../vendor/autoload.php';
use Slim\Factory\AppFactory;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Psr7\Response;
class ExampleBeforeMiddleware
{
public function __invoke(Request $request, RequestHandler $handler): Response
{
$response = $handler->handle($request);
$existingContent = (string) $response->getBody();
$response = new Response();
$response->getBody()->write('BEFORE' . $existingContent);
return $response;
}
}
class ExampleAfterMiddleware
{
public function __invoke(Request $request, RequestHandler $handler): Response
{
$response = $handler->handle($request);
$response->getBody()->write('AFTER');
return $response;
}
}
$app = AppFactory::create();
// افزودن میدلور به اپلیکیشن
$app->add(new ExampleBeforeMiddleware());
$app->add(new ExampleAfterMiddleware());
// تعریف مسیر
$app->get('/', function (Request $request, Response $response, array $args) {
$response->getBody()->write("Hello World!");
return $response;
});
$app->run();
در این مثال، وقتی کاربر به مسیر / دسترسی پیدا کنه، ابتدا ExampleBeforeMiddleware اجرا میشه و کلمه "BEFORE" رو به پاسخ اضافه میکنه، سپس پردازش انجام میشه و در نهایت ExampleAfterMiddleware اجرا میشه و کلمه "AFTER" به پایان پاسخ اضافه میشه.
Slim یه فریمورک مینیمال و سبک برای PHP هست که بیشتر برای ساختن APIها و اپلیکیشنهای وب کاربرد داره.
Slim به خاطر سادگی و سبکی معروفه. برخلاف فریمورکهای بزرگ مثل Laravel، Slim امکانات پایهای داره و بهت اجازه میده هر چیزی رو فقط وقتی نیاز داری، اضافه کنی.
Slim بیشتر برای پروژههای کوچیک و متوسط مناسبه، اما با اضافه کردن میدلورهای مختلف میتونی قابلیتهای بیشتری بهش اضافه کنی و حتی پروژههای بزرگ رو هم باهاش مدیریت کنی.
بله، Slim از تزریق وابستگی پشتیبانی میکنه و این امکان بهت میده که برنامت رو راحتتر تست و پیکربندی کنی.
فقط کافیه Slim رو از طریق Composer نصب کنی و بعد با استفاده از متدهای سادهای مثل $app->get() مسیرها و درخواستها رو مدیریت کنی.
نسخه ۴ Slim با PHP 7.1 و بالاتر سازگار بوده و در نسخههای جدیدتر با PHP 8.1 هم کار میکنه.
بله، Slim یه فریمورک اوپنسورس و رایگانه که توسط جامعهای از توسعهدهندگان پشتیبانی میشه.
به لطف سیستم روتینگ FastRoute و معماری سبک Slim، این فریمورک یکی از سریعترین گزینهها برای پروژههای وبی و API به حساب میاد.
بله، خیلی از توسعهدهندهها از Slim به عنوان بکاند برای اپلیکیشنهایی که فرانتاندشون با Vue.js یا React ساخته شده، استفاده میکنن.
دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد: