تو دنیای پرسرعت و پیچیده توسعه وب، همیشه دنبال ابزارهایی هستیم که هم کارمون رو راحتتر کنن و هم نتیجه رو سریعتر به دستمون برسونن. فریمورکهای بزرگ مثل 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 ساخته شده، استفاده میکنن.
دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد: