Home Backend Development PHP Tutorial Middleware in Lithe: How It Works and How to Create Your Own

Middleware in Lithe: How It Works and How to Create Your Own

Oct 25, 2024 am 03:28 AM

Middleware in Lithe: How It Works and How to Create Your Own

Middleware provides a convenient mechanism for inspecting and filtering HTTP requests entering your application. For example, Lithe includes middleware that checks if the user is authenticated. If not, the middleware will redirect the user to the login screen. If the user is authenticated, the middleware allows the request to proceed.

How Middleware Works in Lithe

In Lithe, middleware are functions with access to the request object ($req), response object ($res), and the $next function in the application's request-response cycle. The $next function, when invoked, calls the next middleware in the current stack.

Middleware functions provide a convenient way to inspect, filter, and manipulate incoming HTTP requests to your application. They can:

  • Execute any code.
  • Modify the request and response objects.
  • End the request-response cycle.
  • Call the next middleware in the stack.

If the current middleware doesn't terminate the request-response cycle, it must call $next() to pass control to the next middleware. Otherwise, the request will remain pending.


Elements of a Middleware Function

The following code demonstrates the elements of a middleware function:

$app->use(function ($req, $res, $next) {
    $next();
});
Copy after login
Copy after login

Where:

  • $req: HTTP request argument, conventionally called $req.
  • $res: HTTP response argument, conventionally called $res.
  • $next: Callback argument, conventionally called $next.

Defining Middleware

Here’s a simple example of middleware called myLogger. This middleware prints the message LOGGED every time a request passes through it. It’s defined as a function assigned to a variable called myLogger:

$myLogger = function ($req, $res, $next) {
  echo 'LOGGED';
  $next();
};
Copy after login
Copy after login

Notice the $next() call above. This function calls the next middleware in the application. $next() isn't a built-in PHP or Lithe function but is the third argument passed to the middleware function. Though $next() could be named anything, by convention, it is always called "next." To avoid confusion, stick to this convention.

Imagine middleware as a series of "layers" that HTTP requests pass through before reaching your application. Each layer can examine or reject the request.


Loading Middleware

To load middleware, you call the use() method of the LitheApp class, specifying the middleware function. For example:

$app = new \Lithe\App;

$myLogger = function ($req, $res, $next) {
    echo 'LOGGED';
    $next();
};

$app->use($myLogger);

$app->get('/', function ($req, $res, $next) {
    $res->send('Hello World!');
});
Copy after login
Copy after login

Whenever the app receives a request, the message "LOGGED" will be printed. The order of middleware loading matters: those loaded first are executed first.

The myLogger middleware simply prints a message, then passes the request to the next middleware using $next().


Using Middleware

A Lithe application can use the following types of middleware:

  • Application-level Middleware
  • Router-level Middleware
  • Third-party Middleware

Application-level Middleware

You attach application-level middleware to an instance of the application using the use() or METHOD() methods, where METHOD refers to the HTTP method (e.g., GET, PUT, POST) in lowercase.

This example shows middleware without a path. The middleware runs every time a request is received:

$app->use(function ($req, $res, $next) {
    $next();
});
Copy after login
Copy after login

In the example below, middleware handles a GET request to the path /user/:id:

$myLogger = function ($req, $res, $next) {
  echo 'LOGGED';
  $next();
};
Copy after login
Copy after login

Router-level Middleware

Router-level middleware works like application-level middleware but is attached to an instance of LitheHttpRouter:

$app = new \Lithe\App;

$myLogger = function ($req, $res, $next) {
    echo 'LOGGED';
    $next();
};

$app->use($myLogger);

$app->get('/', function ($req, $res, $next) {
    $res->send('Hello World!');
});
Copy after login
Copy after login

You load router-level middleware using the use() and METHOD() functions.

Here’s an example of router-level middleware:

$app->use(function ($req, $res, $next) {
    echo 'Hello World!';
    $next();
});
Copy after login

Third-party Middleware

You can use third-party middleware to add functionality to your Lithe applications. Install the required PHP module and then load it at the application or router level.

Here’s an example of loading session middleware with LitheMiddlewareSessionsession:

$app->get('/user/:id', function ($req, $res, $next) {
    if ($req->param('id') === '0') {
        return $next();
    } 
    $res->send('ID is not 0');
}, function ($req, $res) {
    $res->send('regular');
});
Copy after login

For a list of third-party middleware commonly used with Lithe, check the Third-party Middleware resource.


Configurable Middleware

If you need your middleware to be configurable, you can create a function that accepts an array of options or other parameters and then returns the middleware implementation based on those parameters. See the example below:

$router = new \Lithe\Http\Router;
Copy after login

Now, you can use the middleware with custom configurations:

$router = new \Lithe\Http\Router;

$router->use(function ($req, $res, $next) {
    echo 'Time: ', Date('H:i:s'), '<br>';
    $next();
});

$router->get('/user/:id', function ($req, $res, $next) {
    if ($req->param('id') === '0') {
        $res->redirect('/');
    }
    $next();
}, function ($req, $res) {
    echo $req->param('id');
    $res->render('special');
});

$app->use('/api', $router);
Copy after login

To create middleware that other developers can install via Composer, there is a package called lithemod/flow. It provides interfaces and utilities for handling HTTP requests and responses in Lithe, which facilitates the creation of standardized and ready-to-use middlewares across various applications.

lithemod/flow helps build robust middlewares by providing a unified interface for Request and Response, making development more efficient and organized. This simplifies the integration of your middleware into other projects and ensures that the code follows consistent standards.

The above is the detailed content of Middleware in Lithe: How It Works and How to Create Your Own. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

11 Best PHP URL Shortener Scripts (Free and Premium) 11 Best PHP URL Shortener Scripts (Free and Premium) Mar 03, 2025 am 10:49 AM

11 Best PHP URL Shortener Scripts (Free and Premium)

Working with Flash Session Data in Laravel Working with Flash Session Data in Laravel Mar 12, 2025 pm 05:08 PM

Working with Flash Session Data in Laravel

Simplified HTTP Response Mocking in Laravel Tests Simplified HTTP Response Mocking in Laravel Tests Mar 12, 2025 pm 05:09 PM

Simplified HTTP Response Mocking in Laravel Tests

Build a React App With a Laravel Back End: Part 2, React Build a React App With a Laravel Back End: Part 2, React Mar 04, 2025 am 09:33 AM

Build a React App With a Laravel Back End: Part 2, React

cURL in PHP: How to Use the PHP cURL Extension in REST APIs cURL in PHP: How to Use the PHP cURL Extension in REST APIs Mar 14, 2025 am 11:42 AM

cURL in PHP: How to Use the PHP cURL Extension in REST APIs

Introduction to the Instagram API Introduction to the Instagram API Mar 02, 2025 am 09:32 AM

Introduction to the Instagram API

12 Best PHP Chat Scripts on CodeCanyon 12 Best PHP Chat Scripts on CodeCanyon Mar 13, 2025 pm 12:08 PM

12 Best PHP Chat Scripts on CodeCanyon

Notifications in Laravel Notifications in Laravel Mar 04, 2025 am 09:22 AM

Notifications in Laravel

See all articles