Rest Framework - PHP Framework for ReactPHP Library
The Rest framework has a few system requirements.
- PHP >= 7.4
- BCMath PHP Extension
- Ctype PHP Extension
- Fileinfo PHP Extension
- JSON PHP Extension
- Mbstring PHP Extension
- OpenSSL PHP Extension
- PDO PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
Rest utilizes Composer to manage its dependencies. So, before using Rest, make sure you have Composer installed on your machine.
Install Rest by issuing the Composer create-project
command in your terminal:
composer create-project --prefer-dist nddcoder/rest blog
Just run index.php
file
php index.php
Or, if you have nodemon installed, you can have auto reload feature by using nodemon
nodemon index.php
Just build image based on project's Dockerfile
docker build -t <image_name>:<image_tag> .
docker run -d \
-p 8080:8080 \
-e APP_PORT="0.0.0.0:8080" \
<image_name>:<image_tag>
[program:app-name]
process_name=%(program_name)s_%(process_num)02d
command=php /paht/to/project/index.php
autostart=true
autorestart=true
Rest using Fast Route for routing. Application routes can be register in app/Router.php
.
class Router extends BaseRouter
{
protected function register(RouteCollector $routes): void
{
$routes->get('/', HomeController::class); //using invokeable controller
$routes->get('/home', [HomeController::class, 'home']);
$routes->get('/hello/{name}', [HomeController::class, 'hello']);
/*
$routes->post(...)
$routes->put(...)
$routes->delete(...)
*/
}
}
The first parameter of controller method always is ServerRequestInterface
, any route params will following this.
class HomeController
{
public function __invoke(ServerRequestInterface $request)
{
$frameworkVersion = Application::VERSION;
return view('home.twig', compact('frameworkVersion'));
}
public function home()
{
return response()->redirect('/');
}
public function hello(ServerRequestInterface $request, $name)
{
return "Hello $name";
}
}
Bind class to container
Application::getInstance()
->onBoot(function (Application $app) {
$app->bind(ProductServiceInterface::class, fn($app) => new ProductServiceImpl());
});
To make a class is singleton, you can make class implemnt Singleton
interface or bind to container using singleton
method
use Rest\Contracts\Singleton;
class SlackService extends Singleton {
}
//or
Application::getInstance()
->onBoot(function (Application $app) {
$app->singleton(SlackService::class, SlackService::class);
});
Inject dependencies in __construct
function
class ProductController
{
protected ProductServiceInterface $productService;
public function __construct(ProductServiceInterface $service)
{
$this->productService = $service;
}
}
Using app
helper
Inject dependencies in __construct
function
class ProductController
{
public function __construct()
{
$this->productService = app(ProductServiceInterface::class);
//or
$this->productService = app()->make(ProductServiceInterface::class);
}
}
app
: return Application instance or resolve an instance from container
$application = app(); //return Application instance
$classInstance = app(ClassName::class); //ClassName instance
view
: return ViewResponse
instance. Accept view name and optional data need pass to view
class ProductController
{
public function index()
{
$products = [
//...
];
return view('products.index', [
'products' => $products
]);
}
}
response
: return Response
instance, use to build response
class ProductController
{
public function index()
{
$products = [
//...
];
return response()->json([
'data' => $products
]);
}
}
env
: get enviroment vairable from $_ENV
. Rest using vlucas/phpdotenv
for load env variables from .env
file.
$debug = env('APP_DEBUG') == 'true';
dd
: var_dump and die
variable for debugging.
dd($var1, $var2, $var3);
abort
: intermediately return http response. Accept status code
and message
abort(500);
abort(403, 'Permission Denied');
abort_if
: abort
based on $condition
abort_if($condition, $status, $messagge);
abort_unless
: reversed side of abort_if
abort_unless($condition, $status, $messagge);
logger
: log a string or an Throwable
instance to console
logger('Error occurred');
logger($exeption);