Slim Framework Nedir?
Geçtiğimiz günlerde, kişisel bir kullanım için PHP ile geliştirilmiş uygulama geliştirme iskeletlerini araştırmam gerekti.
Elbette Laravel1 veya Symphony2 ölçeğinde çözümleri gereksiz bir zaman ve öğrenme yükü oluşturacağı ve uzun dönemde kullanmayacağım bir araştırma sürecine neden olacakları (zaman maliyeti) için gözardı etmeye karar vermiştim. Terim olarak ifade etmek isterse, ihtiyacım bir micro-framework idi. Neticede ihtiyacım olan routing ve bir de template engine. Bu arada, micro-framework terimi gelişmiş uygulama iskeletlerinin çekirdek özelliklerini barındıran, ancak ihtiyaçlara göre yeni işlevler eklenen geliştirme yapılarını ifade etmektedir.
Slim Framework
Bu süreçte karşıma Laravel’i temel alan Lumen3, Symfony’i temel alan Silex4 ve Slim5 gibi seçenekler çıktı. Kaynakça incelemeleri ve sunulan özellikler bağlamında Slim ile ihtiyacımızı çözmeye karar verdim. Mikro yapıya router ve twig şablon geliştirme motorunu dahil etmek yeterliydi. Bu seçimin temelinde Lumen ile ilgili çözümlerin Blade6 öncelikli olması, Silex’in ise geliştirilme sürecinin sonlandırılması önemli etkenlerdi elbette.
Slim için, basit ancak oldukça etkili özelliklere sahip web uygulamaları geliştirmek ve API’leri hızlı bir şekilde entegre edebilmek amacıyla geliştirilen bir PHP mikro geliştirme iskeleti tanımı yapabiliriz1. Araştırmalarım sürecinde çoğunlukla RESTful API örneklerine denk gelmiş olmam da bu tanımı doğruluyor. İlk defa Rob Allen7 tarafından ilk adımları atılan framework PHP programlama dili geliştirilmekte ve açık kaynak kodlu olarak sunulmakta. Şu anda (2 Temmuz 2020) v4.5.08 sürümü ile kullanılabilen framework PHP 7.49 ve PSR-310 desteklerine sahip.
Slim ile ilgili özellikler, bu özelliklere dair teknik anlatımların ve örneklerin yer aldığı dokümantasyon için Slim 4 Documentation11 sayfasını inceleyebilirsiniz2.
Slim Framework Kurulum İşlemi
Kurulum işlemi için composer12 kullanacağız. Bu nedenle sisteminizde kurulu değilse, öncelikle composer kurulumunu yapmanızı öneririm. Ardından, uygulayacağımız komutumuz aşağıda yer almakta. Örnek kod içerisinde, proje ismi slim-demo
olarak geçmekte. Siz bu isimlendirmeyi elbette kendini tercih edeceiniz bir başka ifade ile değiştirebilirsiniz.
composer create-project slim/slim-skeleton slim-demo
Birkaç dakikalık bir bekleyişin ardından slim-demo
isimli uygulamamız temel gereksinimler ile birlikte kurulmuş olacak. Artık uygulamaya erişim sağlayabiliriz.
php -S localhost:5000 -t public public/index.php
Evet, Hello world!
yazısını gördüysek her şey yolunda demektir. Uygulama yığınına baktığınızda aşağıdaki klasör yapısını göreceksiniz.
.
├── app
├── logs
├── public
├── src
├── tests
├── var
└── vendor
7 directories
Daha temel bir kurulum için slim/slim13 ile de ilk adımı atabilirsiniz. Diğer seçenekler için ise github.com/slimphp14 15 sayfasına göz atabilirsiniz.
Slim ile ilgili çok derinlemesine bilgi vermem en azından şu an için mümkün görünmüyor. Ancak, temel yapısı oldukça ilgi çekici olduğu için ilerleyen zaman içerisinde eğer framework ile ilgili daha detaylı bilgi edinirsem elbette paylaşmaktan memnuniyet duyarım.
Şimdi gelelim benim ihtiyaçlarım çerçevesinde oluşturduğum temel yapıya.
.
├── assets
├── cache
├── data
├── templates
└── vendor
5 directories
Twig şablon motorunu kullandığım uygulamanın detaylarını aşağıda iletiyorum.
use Slim\Factory\AppFactory;
use Slim\Views\Twig;
use Slim\Views\TwigMiddleware;
require __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->setBasePath("/"); // eğer farklı bir klasör yapısı kullanacaksanız bu alanı klasör yolunuz ile düzenlemelisiniz; Örneğin /web/slim.
// Create Twig
$twig = Twig::create('templates', [
'cache' => 'cache' // cache klasör yolunu istediğiniz farklı bir klasör adı ve yolu ile düzenleyebilirsiniz. cache işlemini durdurmak için değer olarak FALSE kullanmanız yeterli.
]);
$app->add(TwigMiddleware::create($app, $twig));
$customErrorHandler = function (
Psr\Http\Message\ServerRequestInterface $request,
\Throwable $exception,
bool $displayErrorDetails,
bool $logErrors,
bool $logErrorDetails
) use ($app) {
$response = $app->getResponseFactory()->createResponse();
$view = Twig::fromRequest($request);
return $view->render($response, 'pages/404.html')->withStatus(404);
};
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
$errorMiddleware->setErrorHandler(Slim\Exception\HttpNotFoundException::class, $customErrorHandler);
$app->get('/', function ($request, $response, $args) {
$view = Twig::fromRequest($request);
return $view->render($response, 'pages/home.html');
});
$app->get('/about', function ($request, $response, $args) {
$view = Twig::fromRequest($request);
return $view->render($response, 'pages/about.html');
});
$app->get('/products', function ($request, $response, $args) {
$view = Twig::fromRequest($request);
return $view->render($response, 'pages/products.html');
});
$app->get('/product/{product}', function ($request, $response, $args) {
$view = Twig::fromRequest($request);
return $view->render($response, 'pages/products/product.html', [
'product' => $args['product']
]);
})->setName('product');
$app->get('/form/contact', function ($request, $response, $args) {
$view = Twig::fromRequest($request);
return $view->render($response, 'pages/form/contact.html');
});
$app->run();
İlgili route tanımları içerisinde yer alan sayfaları twig template engine geliştirebilirsiniz. Hata sayfası olarak ben sadece 404
sayfasını tanımladım. Ancak, siz farklı status code tanımları için bu bölümü ihtiyaçlarınıza göre düzenleyebilirsiniz.
Son olarak, oluşturduğunuz sayfalar içerisinden CSS, JS ve medya dosyalarına ulaşmak isteyeceksiniz. Bu durumda dosya yolunu belirtirken {{ base_path() }}
kullanabilirsiniz. Bu şekilde klasör derinliğinden bağımsız olarak dosyalarınıza ulaşmanız mümkün hale gelecektir. Aksi durumda, örneğin /product/...
yolunu görüntülediğinizde bu dosyalara ulaşılamadığını görebilirsiniz.
İlgili örneğe ise slim-starter-w-twig-template-engine üzerinden ulaşabilirsiniz.
git clone git@github.com:ceaksan/slim-starter-w-twig-template-engine.git
İleri Okumalar
- Hakan Karataş, Geliştiriciler için 10 PHP Framework (2016), Webmaster Kitchen,
- Ahmet Sezer Fidancı. PHP Slim Framework ile RESTful API Yapımı (Jul 15, 2019).
- Jeremy Kendall. Keeping it small – Getting to know the Slim PHP micro framework (May 15, 2013)
- Laravel. The PHP Framework for Web Artisans ↩ ↩
- Symfony. High Performance PHP Framework for Web Development ↩ ↩
- Lumen. The stunningly fast micro-framework by Laravel ↩
- Silex. The PHP micro-framework based on the Symfony Components ↩
- Slim. A micro framework for PHP ↩
- Views. Laravel ↩
- Slim Framework. Rob Allen's DevNotes ↩
- Installation. Slim Framework ↩
- PHP 7.4.0 Release Announcement. PHP Documentation ↩
- PSR-3: Logger Interface. PHP-FIG ↩
- Slim 4 Documentation ↩
- Composer. A Dependency Manager for PHP ↩
- slim/slim. Packagist ↩
- Slim Framework. GitHub ↩
- Microframework. Wikipedia ↩