PHP code example of rockberpro / rosa-router

1. Go to this page and download the library: Download rockberpro/rosa-router library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

rockberpro / rosa-router example snippets


Bootstrap::setup();               // loads ./.env
Bootstrap::setup('config/.env');  // custom path
Bootstrap::setup('config/.ini');  // INI format


// index.php

use Rockberpro\RosaRouter\Bootstrap;

('path/to/.ini');
Bootstrap::setup();

$server = Server::init();
// '/api' is the default base prefix — pass a different one to change it
// (see the "Base prefix" section). isApiEndpoint() runs first, so it must
// be given the same prefix.
if ($server->isApiEndpoint('/api')) {
    $server->loadRoutes('./routes/api.php', '/api');
    $server->execute(Server::MODE_STATELESS);
}


// server.php — run with: php server.php

use Rockberpro\RosaRouter\Utils\DotEnv;
use Rockberpro\RosaRouter\Bootstrap;
use React\Socket\SocketServer;
use React\Http\HttpServer;

erver = Server::init();
// '/api' is the default base prefix — pass a different one to change it
$server->loadRoutes('./routes/api.php', '/api');

$server = new HttpServer(
    $server->execute(Server::MODE_STATEFUL)
);
$server->on('error', function (Throwable $e) {
    print("Request error: " . $e->getMessage() . PHP_EOL);
});

$socket = new SocketServer("{$address}:{$port}");
$server->listen($socket);

print("Server running at http://{$address}:{$port}" . PHP_EOL);

use Rockberpro\RosaRouter\Core\Route;

Route::get('/post/{post}/comment/{comment}', [PostController::class, 'get']);
Route::get('/user/{id}',                     [UserController::class, 'get']);
Route::post('/user',                         [UserController::class, 'post']);
Route::put('/user/{id}',                     [UserController::class, 'put']);
Route::patch('/user/{id}',                   [UserController::class, 'patch']);
Route::delete('/user/{id}',                  [UserController::class, 'delete']);

use Rockberpro\RosaRouter\Core\Request;
use Rockberpro\RosaRouter\Core\Response;
use Rockberpro\RosaRouter\Core\Route;

Route::get('/ping', function (Request $request) {
    return new Response(['message' => 'pong'], Response::OK);
});

Route::get('/user/{id}', function (Request $request) {
    $id     = $request->get('id');        // path parameter  -> /user/42
    $fields = $request->get('fields');    // query parameter -> ?fields=name,email

    return new Response(['id' => $id, 'fields' => $fields], Response::OK);
});

$request->getPathParam('id');     // route placeholders, e.g. {id}
$request->getQueryParam('page');  // ?page=2
$request->getBodyParam('email');  // JSON body fields
$request->getParams();            // everything, grouped by source

return new Response(['message' => 'Created'], Response::CREATED);       // 201
return new Response(['message' => 'Not found'], Response::NOT_FOUND);   // 404
return new Response(['message' => 'Invalid'], Response::UNPROCESSABLE_ENTITY); // 422

$server->loadRoutes('./routes/api.php', '/v1');      // routes served under /v1
$server->loadRoutes('./routes/admin.php', '/admin'); // routes served under /admin

if ($server->isApiEndpoint('/v1')) {
    $server->loadRoutes('./routes/api.php', '/v1');
    $server->execute(Server::MODE_STATELESS);
}

Route::prefix('v1')->group(function() {
    Route::get('/users/{id}', [UserController::class, 'get']);  // GET  /api/v1/users/{id}
    Route::post('/users', [UserController::class, 'post']);     // POST /api/v1/users
});

Route::prefix('v1')->group(function() {

    Route::get('/users/{id}', [UserController::class, 'get']);   // GET  /api/v1/users/{id}
    Route::post('/users', [UserController::class, 'post']);      // POST /api/v1/users

    Route::prefix('users/{user}')->group(function() {
        Route::get('/posts', [PostController::class, 'index']);  // GET  /api/v1/users/{user}/posts
        Route::post('/posts', [PostController::class, 'store']); // POST /api/v1/users/{user}/posts
    });
});

Route::namespace('App\\Controllers')->group(function() {
    Route::get('/example', 'ExampleController@get');
    Route::post('/example', 'ExampleController@post');
});

Route::prefix('v1')
    ->namespace('App\\Controllers')
    ->middleware(AuthMiddleware::class)
    ->group(function() {
        Route::get('/example', 'ExampleController@get');
    });

namespace App\Middleware;

use Closure;
use Rockberpro\RosaRouter\Middleware\MiddlewareInterface;
use Rockberpro\RosaRouter\Core\Request;
use Rockberpro\RosaRouter\Core\Response;

class AuthMiddleware implements MiddlewareInterface
{
    public function handle(Request $request, Closure $next): Response
    {
        if (!$request->get('token')) {
            return new Response(['message' => 'Access denied'], Response::UNAUTHORIZED);
        }

        return $next($request);
    }
}

// Single route
Route::middleware(AuthMiddleware::class)
    ->get('/hello', 'HelloWorldController@hello');

// Whole group
Route::prefix('v1')
    ->middleware(AuthMiddleware::class)
    ->namespace('App\\Controllers')
    ->group(function() {
        Route::get('/hello', 'HelloWorldController@hello');
    });

Route::middleware(LogRequestMiddleware::class)   // applies to everything below
    ->group(function() {

        Route::get('/health', 'HealthController@check');   // [Log]

        Route::middleware(AuthMiddleware::class)
            ->group(function() {
                // runs [Log, Auth] — logging is NOT lost by the inner group
                Route::get('/user/{id}', 'UserController@get');
            });
    });

   use Rockberpro\RosaRouter\Middleware\LogRequestMiddleware;

   Route::prefix('v1')
       ->middleware(LogRequestMiddleware::class)
       ->group(function() {
           Route::get('/hello', 'HelloWorldController@hello');
       });
   

   Route::middleware(LogRequestMiddleware::class)->group(function() {
       

   use Monolog\Handler\SlackWebhookHandler;
   use Monolog\Logger;
   use Rockberpro\RosaRouter\Bootstrap;

   Bootstrap::setup(
       '.env',
       'logs/info.log',
       'logs/error.log',
       // request/info handlers — e.g. mirror requests into your own DB schema,
       // Slack, syslog, Elasticsearch, …
       infoHandlers: [new SlackWebhookHandler($webhookUrl, level: Logger::INFO)],
   );
   

   Route::middleware([AuthMiddleware::class, LogRequestMiddleware::class])
       ->get('/user/{id}', [UserController::class, 'get']);
   

namespace App\Controllers;

use Rockberpro\RosaRouter\Controllers\Controller;
use Rockberpro\RosaRouter\Core\Request;
use Rockberpro\RosaRouter\Core\Response;

class UserController extends Controller
{
    public function get(Request $request): Response
    {
        $id = $request->get('id');

        // ... fetch the user from your data source

        if (!$id) {
            return $this->response(['message' => 'User not found'], Response::NOT_FOUND);
        }

        return $this->response(['id' => $id, 'name' => 'Jane Doe'], Response::OK);
    }
}

// Explicit method binding
Route::get('/user/{id}', [UserController::class, 'get']);

// Group actions under one controller
Route::controller(UserController::class)->group(function() {
    Route::get('/user/{id}', 'get');
    Route::post('/user', 'post');
});

use Rockberpro\RosaRouter\Jwt;

$access  = Jwt::getAccessToken();            // short-lived access token
$refresh = Jwt::getRefreshToken($audience);  // long-lived refresh token

namespace App\Middleware;

use Closure;
use Rockberpro\RosaRouter\Middleware\MiddlewareInterface;
use Rockberpro\RosaRouter\Core\Request;
use Rockberpro\RosaRouter\Core\Response;
use Rockberpro\RosaRouter\Core\Server;
use Rockberpro\RosaRouter\Jwt;

class AuthMiddleware implements MiddlewareInterface
{
    public function handle(Request $request, Closure $next): Response
    {
        Jwt::validate(Server::authorization(), 'access'); // throws on failure
        return $next($request);
    }
}