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 1mo ago

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

23

—

LowBetter than 27% of packages

Maintenance40

Moderate activity, may be stable

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

507d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/41eca7556fad1c84837e2c1f9e30a5d15b039b9b00e8380a2ba69615857ea823?d=identicon)[asgarihope](/maintainers/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

[lab404/laravel-impersonate

Laravel Impersonate is a plugin that allows to you to authenticate as your users.

2.3k16.4M48](/packages/lab404-laravel-impersonate)[codegreencreative/laravel-samlidp

Make your PHP Laravel application an Identification Provider using SAML 2.0. This package allows you to implement your own Identification Provider (idP) using the SAML 2.0 standard to be used with supporting SAML 2.0 Service Providers (SP).

263763.5k1](/packages/codegreencreative-laravel-samlidp)[webfox/laravel-xero-oauth2

A Laravel integration for Xero using the Oauth 2.0 spec

58452.0k2](/packages/webfox-laravel-xero-oauth2)[hasinhayder/tyro

Tyro - The ultimate Authentication, Authorization, and Role &amp; Privilege Management solution for Laravel 12 &amp; 13

6712.1k2](/packages/hasinhayder-tyro)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

255.2k](/packages/aedart-athenaeum)[truckersmp/steam-socialite

Laravel Socialite provider for Steam OpenID.

1516.7k](/packages/truckersmp-steam-socialite)

PHPackages © 2026

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