Slim Framework Nedir?

Güncelleme Yayın

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 Laravel veya Symphony ö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 - PHP Framework

Slim Framework

Bu süreçte karşıma Laravel’i temel alan Lumen, Symfony’i temel alan Silex ve Slim 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 Blade ö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 geiş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 Allen 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.0 sürümü ile kullanılabilen framework PHP 7.4 ve PSR-3 desteklerine sahip.

Slim ile ilgili özellikler, bu özelliklere dair teknik anlatımların ve örneklerin yer aldığı dokümantasyon için Slim 4 Documentation sayfasını inceleyebilirsiniz2.

Slim PHP Micro Framework

Slim Framework Kurulum İşlemi

Kurulum işlemi için composer 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/slim ile de ilk adımı atabilirsiniz. Diğer seçenekler için ise github.com/slimphp 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 github.com/ceaksan/slim-starter-w-twig-template-engine üzerinden ulaşabilirsiniz.

git clone :ceaksan/slim-starter-w-twig-template-engine.git

İleri Okumalar

Kaynakça