DEV Community

Cover image for Slim Php Framework: How to create Route Wrapper Class in Slim?
Asif Sheikh
Asif Sheikh

Posted on

1

Slim Php Framework: How to create Route Wrapper Class in Slim?

Hello everyone!✌

Now we are going to discuss about creating Route Wrapper Class in Slim Php Framework.

We have to follow few steps to creating route class and I hope you to enjoy it. It makes life easier for slim developer.

STEP 1: Creating Route Wrapper Class

Creating a new php file in App\Core\Route.php in your slim project directory. I have named Route.php.

<?php

namespace App;

use Slim\App;

class Router
{
    protected $app;

    public function __construct(App $app)
    {
        $this->app = $app;
    }

    public function get($pattern, $callable)
    {
        $this->app->get($pattern, $callable);
    }

    public function post($pattern, $callable)
    {
        $this->app->post($pattern, $callable);
    }

    public function put($pattern, $callable)
    {
        $this->app->put($pattern, $callable);
    }

    public function delete($pattern, $callable)
    {
        $this->app->delete($pattern, $callable);
    }

    public function patch($pattern, $callable)
    {
        $this->app->patch($pattern, $callable);
    }

    public function group($pattern, $callable)
    {
        $this->app->group($pattern, $callable);
    }

    public function middleware($middleware)
    {
        $this->app->add($middleware);
    }

    public function controller($pattern, $controller)
    {
        $this->app->any($pattern . '[/{action}]', function ($request, $response, $args) use ($controller) {
            $action = $args['action'] ?? 'index';
            $controllerInstance = new $controller();
            return $controllerInstance->$action($request, $response, $args);
        });
    }

    public function resource($pattern, $controller)
    {
        $this->app->get($pattern, $controller . ':index');
        $this->app->get($pattern . '/create', $controller . ':create');
        $this->app->post($pattern, $controller . ':store');
        $this->app->get($pattern . '/{id}', $controller . ':show');
        $this->app->get($pattern . '/{id}/edit', $controller . ':edit');
        $this->app->put($pattern . '/{id}', $controller . ':update');
        $this->app->delete($pattern . '/{id}', $controller . ':destroy');
    }
}
Enter fullscreen mode Exit fullscreen mode

STEP 2: Use Above Route Class in index.php

<?php

use Slim\Factory\AppFactory;
use App\Router;

require __DIR__ . '/vendor/autoload.php';

$app = AppFactory::create();

$router = new Router($app);

// Define your routes
$router->get('/home', function ($request, $response, $args) {
    $response->getBody()->write('Hello, Home!');
    return $response;
});

$router->post('/submit', function ($request, $response, $args) {
    // handle post request
    return $response;
});

// Grouped routes
$router->group('/api', function () use ($router) {
    $router->get('/users', function ($request, $response, $args) {
        $response->getBody()->write('List of users');
        return $response;
    });

    $router->post('/users', function ($request, $response, $args) {
        // handle post request
        return $response;
    });
});

// Controller route
$router->controller('/product', \App\Controllers\ProductController::class);

// Resource route
$router->resource('/articles', \App\Controllers\ArticleController::class);

$app->run();
Enter fullscreen mode Exit fullscreen mode

Thanks for giving your time and considerations!✨

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

Top comments (2)

Collapse
 
xwero profile image
david duymelinck

Because the router is a part of the App class you could extend that, instead of creating Router class where you need to add all the router functionality.

src/MyAppFactory.php

<?php

namespace App;

use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Slim\Factory\AppFactory;
use Slim\Interfaces\CallableResolverInterface;
use Slim\Interfaces\MiddlewareDispatcherInterface;
use Slim\Interfaces\RouteCollectorInterface;
use Slim\Interfaces\RouteResolverInterface;

class MyAppFactory extends AppFactory
{
    public static function create(?ResponseFactoryInterface $responseFactory = null, ?ContainerInterface $container = null, ?CallableResolverInterface $callableResolver = null, ?RouteCollectorInterface $routeCollector = null, ?RouteResolverInterface $routeResolver = null, ?MiddlewareDispatcherInterface $middlewareDispatcher = null): MyApp
    {
        static::$responseFactory = $responseFactory ?? static::$responseFactory;
        return new MyApp(
            self::determineResponseFactory(),
            $container ?? static::$container,
            $callableResolver ?? static::$callableResolver,
            $routeCollector ?? static::$routeCollector,
            $routeResolver ?? static::$routeResolver,
            $middlewareDispatcher ?? static::$middlewareDispatcher
        );
    }

}
Enter fullscreen mode Exit fullscreen mode

src/MyApp.php

<?php

namespace App;

use Slim\App;

class MyApp extends App
{
    public function controller($pattern, $controller)
    {
        $this->any($pattern . '[/{action}]', function ($request, $response, $args) use ($controller) {
            $action = $args['action'] ?? 'index';
            $controllerInstance = new $controller();
            return $controllerInstance->$action($request, $response, $args);
        });
    }

    public function resource($pattern, $controller)
    {
        $this->get($pattern, $controller . ':index');
        $this->get($pattern . '/create', $controller . ':create');
        $this->post($pattern, $controller . ':store');
        $this->get($pattern . '/{id}', $controller . ':show');
        $this->get($pattern . '/{id}/edit', $controller . ':edit');
        $this->put($pattern . '/{id}', $controller . ':update');
        $this->delete($pattern . '/{id}', $controller . ':destroy');
    }
}
Enter fullscreen mode Exit fullscreen mode

public/index.php

use App\MyAppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = MyAppFactory::create();

$app->resource('/articles', \App\Controllers\ArticleController::class);

$app->run();
Enter fullscreen mode Exit fullscreen mode
Collapse
 
asif_sheikh_d7d74ce8b9c9d profile image
Asif Sheikh

😊👍

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs