emma / http-manager
A PHP 8.0+ Attributes Based HTTP Routing. Can be used for all cases, MVC and Middleware - Class/Method/Function
v1.0.6
2023-11-17 14:26 UTC
Requires
- php: >=8.0
- emma/common: ^1.0.0
- emma/di: ^1.2.0
Requires (Dev)
- emma/common: ^1.0.0
- emma/di: ^1.2.0
README
php 8 Attributes based Http Routing. Can be used for all cases, MVC and Middleware - Class/Method/Function
QUICK HOW TO:
===================
<?php
include dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . "autoloader.php"; //composer autoloader
// <!-- Controller Class file -->
use Emma\Http\Mappings\RequestMapping;
use Emma\Http\Mappings\PostMapping;
use Emma\Http\Mappings\GetMapping;
use Emma\Http\Request\Method;
#[RequestMapping(routes: '/index', httpRequestMethod: [Method::POST, Method::GET])]
class IndexController
{
/**
* Full Routing to this method is: '/index/login' -> Class level routing plus the method level
* Class Method can only be accessed via HTTP - POST
*/
#[PostMapping('/login')]
public function login()
{
}
/**
* Class Method can be accessed via HTTP - POST and GET
*/
#[RequestMapping('/logout', [Method::POST, Method::GET])]
public function logout()
{
}
/**
* Class Method can be accessed via HTTP - GET
* Auto-Map expected url parameter to the method
*/
#[GetMapping('/count-trades/{status:[\w]+}')]
public function countTradesByStatus(string $status)
{
}
/**
* Other Request Mapping Attributes exist....For example:
*
* #[HeadMapping('/head-method-routing')]
* #[PutMapping('/upload')]
* #[PatchMapping('//summary/{id:[0-9]*}')]
* #[DeleteMapping('/delete-all')]
* #[OptionsMapping('/option/')]
*/
}
REGISTER ALL ROUTES HANDLERS USING THE SINGLETON - RouteRegistry.php
/**
*
* @return array
* Register your Controllers, classes and/or Middleware and/or Functions here...
use \Emma\Http\Mappings\PatchMapping;
$routables = [
IndexController::class,
...
//example: Adding your function directly to the array.
#[PatchMapping('/update/summary/{id:[0-9]*}')]
function middlewareQuickPatch(): void {
$result = ['status' => true, 'data' => 'ABCD'];
die(json_encode($result));
},
];
RouteRegistry::getInstance()->setRoutables($routables); //Register ALL
* ADVANCED USERS can have there arrays of functions and/or classes in different file and includes those file with array_merge()
* For Example:
$routables = array_merge(
(array) include "directory_to_array_file/class_file.php",
(array) include "directory_to_array_file/direct_method_file.php",
(array) include "directory_to_array_file/functions_file.php",
);
RouteRegistry::getInstance()->setRoutables($routables); //Register ALL
* THEN, class_file.php:
* =====================
return [
IndexController::class,
...
];
Other file will simply follow class_file example...
*/
// <!-- URL front entry point...Assuming you already setup your .htaccess as needed.
// This service is independent of .htaccess. -->
YOU CAN REGISTER SINGLE ROUTABLE AT A TIME USING THE:
RouteRegistry::getInstance()->register($classOrFunctionOrObject);
Be sure to also have your .htaccess file well set as this package is framework agnostic.
Here is a sample .htaccess file:
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]
Let's test - index.php file inside the same folder as your .htaccess
<?php
$testHttpManager = new \Emma\Http\HttpManager();
try {
$route = $testHttpManager->boot()->matchRequestRoutes();
var_dump($route);
/** Feel free to use https://github.com/debascoguy/Di For Autowiring(that is, Injecting) your classes/Methods/Function Dependencies... */
} catch (Exception $e) {
die($e->getMessage());
}
** Feel free to use https://github.com/debascoguy/Di For Autowiring (that is, Inject) your classes/Methods/Function Dependencies...