PHP code example of rguezque / katya-router

1. Go to this page and download the library: Download rguezque/katya-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/ */

    

rguezque / katya-router example snippets




use rguezque\{
    HttpStatus,
    Katya, 
    Request,
    Response
};
use rguezque\Exceptions\{
    RouteNotFoundException, 
    UnsupportedRequestMethodException
};

$router = new Katya;

$router->route(Katya::GET, '/', function(Request $request) {
    return new Response('hola mundo!');
});

try {
    $router->run(Request::fromGlobals());
} catch(RouteNotFoundException $e) {
    $message = sprintf('<h1>Not Found</h1><p>%s</p>', $e->getMessage());
    (new Response($message, HttpStatus::HTTP_NOT_FOUND))->send();
} catch(UnsupportedRequestMethodException $e) {
    $message = sprintf('<h1>Not Allowed</h1><p>%s</p>', $e->getMessage());
    (new Response($message, HttpStatus::HTTP_METHOD_NOT_ALLOWED))->send();
} 

$katya = new Katya('/nombre_directorio_base');

$katya = new Katya;
$katya->get('/', function(Request $request) {
    return new Response('Hello')
});

$katya->post('/', function(Request $request) {
    $data = [
        'name' => 'John',
        'lastname' => 'Doe'
    ];

    return new JsonResponse($data);
});

// Usando una función anónima
$katya->get('/user', function(Request $request) {
    //...
});

// Usando un método estático
$katya->get('/user', ['App\Controller\GreetingController', 'showProfileAction']);
// o bien
use App\Controller\UserController;
$katya->get('/user', [UserController::class, 'showProfileAction']);
$katya->get('/user/permissions', [UserController::class, 'showPermissionsAction']);

// Usando un método de un objeto
$user = new App\Controller\UserController();
$katya->get('/user', [$user, 'showProfileAction']);

// Se generan las rutas "/foo/bar" y "/foo/baz"
$katya->group('/foo', function(Group $group) {
    $group->get('/bar', function(Request $request) {
        return new Response(' Hello foobar');
    });

    $group->get('/baz', function(Request $request, Services $service) {
        // Registrado previamente como un servicio
        $template = $services->view->fetch('welcome') 
        return new HtmlResponse($template);
    });
});

$katya->get('/hola/{nombre}', function(Request $request) {
    $params = $request->getParams(); // Devuelve un objeto Parameter
    return new Response(sprintf('Hola %s', $params->get('nombre')));
});

$katya->get('/hola/(\w+)/(\w+)', function(Request $request) {
    $params = $request->getParams(Request::PARAMS_NUM); // Devuelve un array lineal
    list($nombre, $apellido) = $params;
    return new Response(sprintf('Hola %s %s', $nombre, $apellido));
});

use rguezque\View;

// Standalone
$view = new ViewEngine(
    __DIR__.'/templates' // Directorio donde se alojan los templates
);

// Enviandolo como un servicio
$services = new Services();
$services->register('view', function() {
    return new ViewEngine(__DIR__.'/templates');
});
$router->setServices($services);

$router->get(Request $request, Services $service): Response {
    $view = $service->view();
    $data = [
    	'home': '/',
    	'about': '/about-us',
    	'contact': '/contact-us'
	];
	$template = $view->fetch('menu', $data);
    return new HtmlResponse($template);
}

//menu.php
<nav>
    <ul>
        <li><a href="<?= $home 

// index.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?= $title 

$response = $router->run(Request::fromGlobals());
SapiEmitter::emit($response);

try {
    $response = $app->run(Request::fromGlobals());
} catch(UnexpectedValueException $e) {
    $response = new Response('el controlador retorno un resultado no válido', HttpStatus::HTTP_EXPECTATION_FAILED);
} catch(UnsupportedRequestMethodException $e) {
    $response = new Response('Método de petición no permitido', HttpStatus::HTTP_METHOD_NOT_ALLOWED);
} catch(RouteNotFoundException $e) {
    $response = new Response('Ruta no encontrada', HttpStatus::HTTP_NOT_FOUND);
}

SapiEmitter::emit($response);

$session = Session::create();
$session->set('nombre', 'Juan');
$session->set('edad', 30);
$session->get('nombre);



use rguezque\{Group, Katya, Request, HtmlResponse, Services, ViewEngine};

$router = new Katya;
$services = new Services;

// Ejemplo de registro eficiente de un servicio
$services->register('view', static function() {
    static $view = null;
    if ($view === null) {
        $view = new ViewEngine(
            templates_dir: __DIR__.'/views',
            cache_dir: __DIR__.'/views/cache'
        );
    }
    return $view;
});
$services->register('is_pair', function(int $number) {
    return $number % 2 == 0;
});

$router->setServices($services);

$router->get('/', function(Request $request, Services $service) {
    $view = $service->view(); // o bien en contexto de objeto: $service->view
    return new HtmlResponse($view->fetch('home.php'));
})->useServices('view'); // Solamente recibirá el servicio 'view'



use rguezque\{Katya, Request, Response, Variables};

$router = new Katya;
$vars = new Variables;

$vars->setVar('pi', 3.141592654);
$router->setVariables($vars);

$router->get('/', function(Request $request, Response $response, Variables $vars) {
    $response->send($vars->getVar('pi'));
});

$vars->setVar('pi', 3.141592654);

$vars->getVar('pi'); // Devuelve la variable pi (si no existe devuelve null)
$vars->getVar('pi', 3.14) // Devuelve la variable pi (si no existe devuelve por default el valor 3.14)

$vars->hasVar('pi') // Para este ejemplo devolvería TRUE

use rguezque\DbConnection;

$db = DbConnection::getConnection([
    'driver' => 'pdomysql',
    'host' => 'localhost',
    'port' => 3306,
    'user' => 'root',
    'pass' => 'mypassword',
    'db_name' => 'mydatabase'
    'charset' => 'utf8'
]);

$db = DbConnection::getConnection([
    'driver' => 'mysqli',
    'host' => 'localhost',
    'port' => 3306,
    'user' => 'root',
    'pass' => 'mypassword',
    'db_name' => 'mydatabase'
    'charset' => 'utf8',
]);

use rguezque\DbConnection;

// Con mysqli
// 'mysqli://root:[email protected]/mydatabase?charset=utf8'
// Con PDO
$connection_params = DbConnection::dsnParser('pdomysql://root:[email protected]/mydatabase?charset=utf8');
$db = DbConnection::getConnection($connection_params);

use rguezque\DbConnection;

$db = DbConnection::autoConnect();

// Singleton
DbConnection::getConnection([
    'driver' => 'pdo_sqlite',
    'db_file' => __DIR__.'/storage/database.sqlite',
    'charset' => 'utf8'
]);

//Nueva instancia
$db = DbConnection::create([
    'driver' => 'pdo_sqlite',
    'db_file' => __DIR__.'/storage/database2.sqlite',
    'charset' => 'utf8'
]);



use rguezque\{Group, Katya, Request, Response, Session};

$router = new Katya;

$router->get('/', function(Request $request) {
    $data = $request->getParams();
    $username = $data->get('@middleware_data');
    return new Response(sprintf('The actual user is: %s', $username));
})->before(function(Request $request, $next) {
    $session = Session::select('mi_sesion');
    if(!$session->has('logged')) {
        // Ejecuta el response y detiene el router
        Katya::halt(new Response(headers: ['location' => '/login']));
    }
    // Puedes pasar datos al controlador usando parámetros
    $request->setParams(['@middleware_data' => $session->get('username')]);
    
    return $next($request);
});



use rguezque\Katya;
use rguezque\CorsConfig;

$router = new Katya;
$cors_config = new CorsConfig();

$cors_config->addOrigin(
    'https://example.com', 
    ['GET', 'POST'], 
    [
        'allowed_headers' => ['Content-Type', 'Authorization'],
        'supports_credentials' => true
    ]
);

$cors_config->addOrigin(
    '(http(s)://)?(www\.)?localhost:4500', // También soporta regex
    ['GET', 'POST', 'DELETE'], 
    [
        'allowed_headers' => ['Content-Type'],
        'max_age' => 3600 // 1 hora
    ]
);

[
    'allowed_headers' => ['Content-Type', 'Authorization'],
    'max_age' => 86400, // 24 horas
    'supports_credentials' => false
]

// Se asigna al router
$router->setCors($cors_config);

// Se define directamente el ambiente de desarrollo
Environment::register('production');

// O busca automáticamente la variable de ambiente APP_ENV
Environment::register();

// Por ejemplo
Environment::setLogPath(__DIR__.'/path/to/custom/logs');

server {
    location / {
        try_files $uri $uri/ /index.php;
    }
}
bash
php -S localhost:80