nddcoder/rest

The Rest Framework.

Installs: 6

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 3

Forks: 0

Open Issues: 0

Language:Shell

Type:project

0.0.3 2021-08-30 09:40 UTC

This package is auto-updated.

Last update: 2024-04-29 04:42:32 UTC


README

Rest Framework - PHP Framework for ReactPHP Library

Docs

Installation

Server Requirements

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

Installing Rest

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

Local Development Server

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

Deploy

Using Docker

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> 

Using Supervisor

[program:app-name]
process_name=%(program_name)s_%(process_num)02d
command=php /paht/to/project/index.php
autostart=true
autorestart=true

Usage

Router

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(...)
        */
    }
}

Controller

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";
    }
}

Dependency Injection

Bind class to container

Application::getInstance()
    ->onBoot(function (Application $app) {
        $app->bind(ProductServiceInterface::class, fn($app) => new ProductServiceImpl());
    });

Singleton

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);
    });

Resolve an instance from container

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);
    }
}

Helpers

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);