PHPackages                             asgarihope/pretty-otp - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. asgarihope/pretty-otp

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

asgarihope/pretty-otp
=====================

V1.0.0(1y ago)34MITPHPPHP &gt;=7.2

Since Dec 21Pushed 1y ago1 watchersCompare

[ Source](https://github.com/asgarihope/pretty-otp)[ Packagist](https://packagist.org/packages/asgarihope/pretty-otp)[ RSS](/packages/asgarihope-pretty-otp/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (4)Versions (2)Used By (0)

PrettyOtp Laravel Package
=========================

[](#prettyotp-laravel-package)

PrettyOtp is a Laravel package designed to simplify the implementation of OTP (One-Time Password) mechanisms for authentication and other secure actions.

Installation
------------

[](#installation)

Install the package via Composer:

```
composer require asgarihope/pretty-otp
```

Configuration
-------------

[](#configuration)

Publish the package configuration file:

```
php artisan vendor:publish --tag=otp-config
```

This will create a configuration file at `config/otp.php`:

```
return [
    'otp_expiry'     => 5,   // OTP expiry time in minutes
    'otp_attempts'   => 5,   // Max OTP attempts
    'otp_length'     => 6,   // OTP length
    'otp_retry_time' => 2,   // Retry time in minutes
];
```

Middleware
----------

[](#middleware)

The package provides an `OtpMiddleware` to secure routes. You can use it as follows:

### Example Usage

[](#example-usage)

In your `routes/web.php` or `routes/api.php`, apply the middleware:

```
use Illuminate\Support\Facades\Route;

Route::middleware(['otp:key,segment,3'])->group(function () {
    Route::post('/secure-action', [SecureController::class, 'handle']);
});
```

### Middleware Parameters

[](#middleware-parameters)

- `key`: The request parameter containing the mobile number.
- `segment`: A string to identify the OTP usage context.
- `lifetimeInHours`: (Optional) The duration (in hours) for which access is granted after a successful OTP validation.

Events and Listeners
--------------------

[](#events-and-listeners)

The package dispatches an `OtpRequested` event whenever an OTP is requested. You can listen to this event and define your custom notification logic.

### OtpRequested Event

[](#otprequested-event)

#### Event Properties:

[](#event-properties)

- `$mobile`: The mobile number for which the OTP is requested.
- `$key`: The request parameter key used for the mobile number.
- `$segment`: The OTP usage context.

#### Example Listener

[](#example-listener)

```
use PrettyOtp\Laravel\Events\OtpRequested;

class CustomOtpListener
{
    public function handle(OtpRequested $event)
    {
        $otp = $this->generateOtp($event->mobile, $event->segment);
        $message = "Your OTP for {$event->segment} is: {$otp}";

        // Send the OTP via SMS or another notification channel
        $this->sendNotification($event->mobile, $message);
    }

    private function generateOtp($mobile, $segment)
    {
        // Custom OTP generation logic
    }

    private function sendNotification($mobile, $message)
    {
        // Custom notification logic
    }
}
```

#### Updated Listener Example

[](#updated-listener-example)

The `SendOtpListener` class now includes the `$otp` property and passes it to the `sendNotification` method:

```
use PrettyOtp\Laravel\Events\OtpRequested;
use PrettyOtp\Laravel\Services\OtpService;

abstract class SendOtpListener {

    protected $otpService;
    /**
     * @var string
     */
    protected $otp;

    public function __construct(OtpService $otpService) {
        $this->otpService = $otpService;
    }

    public function handle(OtpRequested $event) {
        $this->otp = $this->otpService->generateOtp($event->mobile, $event->segment);

        $message = "Your OTP for {$event->segment} is: {$this->otp}";

        // Replace this with your SMS/notification logic
        $this->sendNotification($event->key, $event->mobile, $message);
    }

    abstract function sendNotification(string $key, string $inputValue, string $message);
}
```

Service Provider
----------------

[](#service-provider)

The `PrettyOtpServiceProvider` automatically registers the middleware and event listeners. It also publishes the configuration and translation files.

Translation
-----------

[](#translation)

Publish the translations for customization:

```
php artisan vendor:publish --tag=otp-translations
```

Translations are located under `resources/lang/vendor/pretty-otp/`.

Example Flow
------------

[](#example-flow)

1. **Request OTP**: When the middleware detects a request for an OTP, it dispatches the `OtpRequested` event. This event triggers the configured listener to send the OTP to the user.
2. **Validate OTP**: Subsequent requests to routes protected by the middleware will require a valid OTP. The middleware handles validation and grants access if the OTP is correct.
3. **Access Grant**: Upon successful validation, the middleware grants access to the user for the specified lifetime (`lifetimeInHours`, default is null).

### Cache Storage

[](#cache-storage)

The package uses Laravel's cache system to store OTPs, attempts, and access grants. Configure your preferred cache driver in `config/cache.php`.

Contribution
------------

[](#contribution)

Contributions are welcome! Feel free to submit a pull request or report issues in the repository.

License
-------

[](#license)

This package is open-sourced software licensed under the [MIT license](LICENSE).

###  Health Score

22

—

LowBetter than 21% of packages

Maintenance38

Infrequent updates — may be unmaintained

Popularity7

Limited adoption so far

Community4

Small or concentrated contributor base

Maturity33

Early-stage or recently created project

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

559d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/148297745?v=4)[Omid Asgari](/maintainers/asgarihope)[@asgarihope](https://github.com/asgarihope)

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/asgarihope-pretty-otp/health.svg)

```
[![Health](https://phpackages.com/badges/asgarihope-pretty-otp/health.svg)](https://phpackages.com/packages/asgarihope-pretty-otp)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[illuminate/view

The Illuminate View package.

13047.0M2.2k](/packages/illuminate-view)[api-platform/laravel

API Platform support for Laravel

58171.4k14](/packages/api-platform-laravel)[pressbooks/pressbooks

Pressbooks is an open source book publishing tool built on a WordPress multisite platform. Pressbooks outputs books in multiple formats, including PDF, EPUB, web, and a variety of XML flavours, using a theming/templating system, driven by CSS.

45444.2k1](/packages/pressbooks-pressbooks)[rapidez/core

Rapidez Core

1823.5k72](/packages/rapidez-core)[tomshaw/electricgrid

A feature-rich Livewire package designed for projects that require dynamic, interactive data tables.

119.4k](/packages/tomshaw-electricgrid)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
