PHPackages                             ntidev/php-utilities - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. ntidev/php-utilities

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

ntidev/php-utilities
====================

A collection of PHP utility tools

0195PHP

Since Aug 14Pushed 9mo ago1 watchersCompare

[ Source](https://github.com/ntidev/php-utilities)[ Packagist](https://packagist.org/packages/ntidev/php-utilities)[ RSS](/packages/ntidev-php-utilities/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

NtiDev PHP Utilities
====================

[](#ntidev-php-utilities)

A comprehensive collection of PHP utility tools for Symfony-based API development, providing standardized response handling, pagination management, and advanced query building capabilities.

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

[](#installation)

You can install the package via composer:

```
composer require ntidev/php-utilities
```

Requirements
------------

[](#requirements)

- PHP 8.1 or higher
- Symfony HTTP Foundation 7.0 or higher

Features
--------

[](#features)

- **Standardized API Responses**: Consistent JSON response structure across your application
- **Advanced Pagination**: Comprehensive pagination management with metadata
- **Query Building**: Advanced filtering and sorting for database queries
- **Doctrine Integration**: Seamless integration with Doctrine ORM
- **Error Handling**: Proper HTTP status codes and error management

Usage
-----

[](#usage)

### API Responses (`ntidev\Utilities\Http\ApiResponse`)

[](#api-responses-ntidevutilitieshttpapiresponse)

The library provides a standardized way to handle JSON responses using Symfony's HTTP Foundation component.

```
use ntidev\Utilities\Http\ApiResponse;

// Success response with data and pagination
return ApiResponse::success('Operation successful', $data, $pagination);

// Error response with additional errors
return ApiResponse::error('Something went wrong', $additionalErrors);

// Redirect response
return ApiResponse::redirect('Redirecting...', $redirectUrl, $data);
```

**Response Format:**

Success Response:

```
{
    "hasError": false,
    "additionalErrors": [],
    "message": "Operation successful",
    "result": {
        "data": {
            // Your data here
        },
        "pagination": {
            // Pagination metadata here
        }
    },
    "redirect": ""
}
```

Error Response:

```
{
    "hasError": true,
    "additionalErrors": [
        // Additional error details here
    ],
    "message": "Something went wrong",
    "result": null,
    "redirect": ""
}
```

### Pagination Service (`ntidev\Utilities\Pagination\PaginationService`)

[](#pagination-service-ntidevutilitiespaginationpaginationservice)

Comprehensive pagination management with multiple helper methods for different use cases.

```
use ntidev\Utilities\Pagination\PaginationService;

// Create paginated response from service method
return PaginationService::createPaginatedResponseFromServiceWithParams(
    $request,
    fn($params) => $this->service->getAllItems($params),
    'Items fetched successfully',
    $this->serializer
);

// Get pagination parameters from request
$paginationParams = PaginationService::getPaginationParams($request);

// Get Doctrine-specific pagination parameters (0-based offset)
$doctrineParams = PaginationService::getDoctrinePaginationParams($request);

// Simple array pagination
$paginatedItems = PaginationService::paginateArray($items, $page, $limit);

// Create paginated response manually
return PaginationService::createPaginatedResponse(
    $items,
    $totalRecords,
    $currentPage,
    $limit,
    'Items fetched successfully',
    $serializer
);
```

**Pagination Metadata:**

```
{
    "totalRecords": 150,
    "page": 2,
    "limit": 20,
    "totalPages": 8,
    "hasNextPage": true,
    "hasPreviousPage": true,
    "nextPage": 3,
    "previousPage": 1,
    "firstPage": 1,
    "lastPage": 8
}
```

**Request Parameters:**

```
GET /api/items?page=2&limit=20&search=keyword&filters[status]=active&sort[field]=created_at&sort[direction]=desc

```

### Database Query Builder (`ntidev\Utilities\Database\QueryBuilder`)

[](#database-query-builder-ntidevutilitiesdatabasequerybuilder)

Advanced query building with filtering, sorting, and pagination for Doctrine ORM.

```
use ntidev\Utilities\Database\QueryBuilder;

// Get pagination parameters
$pagination = QueryBuilder::paginate($request);

// Apply filters and sorting to Doctrine query
QueryBuilder::filterAndSort(
    $allowedFields,  // Array of allowed field names
    $query,          // Doctrine QueryBuilder instance
    $filters,        // Filter array from request
    $sorts           // Sort array from request
);

// Handle pagination for Doctrine queries
$paginationData = QueryBuilder::handlePagination($query, $data);
```

**Supported Filter Operators:**

- **`equal`**: Exact match filtering

    ```
    $filters = ['status' => ['data' => 'active', 'operator' => 'equal']];
    ```
- **`like`**: Pattern matching with wildcards

    ```
    $filters = ['name' => ['data' => 'john', 'operator' => 'like']];
    ```
- **`or`**: OR condition filtering for multiple fields

    ```
    $filters = ['search' => ['data' => 'john', 'operator' => 'or']];
    ```
- **`gt`**: Greater than comparison

    ```
    $filters = ['age' => ['data' => 18, 'operator' => 'gt']];
    ```
- **`between`**: Date range filtering

    ```
    $filters = ['created_at' => [
        'data' => ['first' => '2023-01-01', 'second' => '2023-12-31'],
        'operator' => 'between'
    ]];
    ```

**Example Usage with Doctrine:**

```
use ntidev\Utilities\Database\QueryBuilder;

// In your repository or service
public function getAllUsers($request)
{
    $qb = $this->createQueryBuilder('u');

    // Get pagination parameters
    $pagination = QueryBuilder::paginate($request);

    // Apply filters and sorting
    QueryBuilder::filterAndSort(
        ['id', 'name', 'email', 'status', 'created_at'],
        $qb,
        $pagination['filters'],
        $pagination['sort']
    );

    // Handle pagination
    $paginationData = QueryBuilder::handlePagination($qb, $pagination);

    // Execute query
    $users = $qb->getQuery()->getResult();

    return [
        'data' => $users,
        'pagination' => $paginationData
    ];
}
```

Integration Examples
--------------------

[](#integration-examples)

### Controller Integration

[](#controller-integration)

```
use ntidev\Utilities\Http\ApiResponse;
use ntidev\Utilities\Pagination\PaginationService;

class UserController extends AbstractController
{
    #[Route('/users', methods: ['GET'])]
    public function getUsers(Request $request): ApiResponse
    {
        return PaginationService::createPaginatedResponseFromServiceWithParams(
            $request,
            fn($params) => $this->userService->getAllUsers($params),
            'Users fetched successfully',
            $this->serializer
        );
    }

    #[Route('/users/{id}', methods: ['GET'])]
    public function getUser(int $id): ApiResponse
    {
        $user = $this->userService->getUserById($id);

        if (!$user) {
            return ApiResponse::error('User not found', [], ApiResponse::HTTP_NOT_FOUND);
        }

        return ApiResponse::success('User fetched successfully', $user);
    }
}
```

### Repository Integration

[](#repository-integration)

```
use ntidev\Utilities\Database\QueryBuilder;

class UserRepository extends ServiceEntityRepository
{
    public function getAllUsers(array $params): array
    {
        $qb = $this->createQueryBuilder('u');

        $pagination = QueryBuilder::paginate($params);

        QueryBuilder::filterAndSort(
            ['id', 'name', 'email', 'status', 'created_at'],
            $qb,
            $pagination['filters'],
            $pagination['sort']
        );

        $paginationData = QueryBuilder::handlePagination($qb, $pagination);

        $users = $qb->getQuery()->getResult();

        return [
            'data' => $users,
            'pagination' => $paginationData
        ];
    }
}
```

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

[](#configuration)

### Default Settings

[](#default-settings)

- **Default Page Size**: 10 items per page
- **Maximum Page Size**: 100 items per page
- **Default Page**: 1 (1-based pagination)

### Customization

[](#customization)

You can customize pagination settings by modifying the constants in the respective classes:

```
// In PaginationService
private const DEFAULT_PAGE_SIZE = 10;
private const MAX_PAGE_SIZE = 100;

// In QueryBuilder
private const DEFAULT_PAGE_SIZE = 10;
private const DEFAULT_PAGE = 1;
```

Error Handling
--------------

[](#error-handling)

The package provides consistent error handling with proper HTTP status codes:

```
// Common HTTP status codes
ApiResponse::HTTP_OK = 200;
ApiResponse::HTTP_CREATED = 201;
ApiResponse::HTTP_NO_CONTENT = 204;
ApiResponse::HTTP_BAD_REQUEST = 400;
ApiResponse::HTTP_UNAUTHORIZED = 401;
ApiResponse::HTTP_FORBIDDEN = 403;
ApiResponse::HTTP_NOT_FOUND = 404;
ApiResponse::HTTP_INTERNAL_SERVER_ERROR = 500;
```

Best Practices
--------------

[](#best-practices)

1. **Consistent Response Format**: Always use `ApiResponse` for all API endpoints
2. **Pagination**: Use `PaginationService` for list endpoints to ensure consistent pagination
3. **Filtering**: Define allowed filter fields to prevent security issues
4. **Error Handling**: Provide meaningful error messages and appropriate HTTP status codes
5. **Doctrine Integration**: Use `QueryBuilder` for complex database queries with filtering and sorting

Contributing
------------

[](#contributing)

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests for new functionality
5. Ensure all tests pass
6. Submit a pull request

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Authors
-------

[](#authors)

- **Angel Bencosme** - *Initial work* - \[\]
- **Felix Valerio** - *Contributor* - \[\]

Support
-------

[](#support)

For support and questions, please create an issue in the repository or contact the development team.

###  Health Score

18

—

LowBetter than 8% of packages

Maintenance41

Moderate activity, may be stable

Popularity10

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/d33aa0220bae1b0c48f14fc349b7b3181fec7aa674da145ded4446f2b098fe47?d=identicon)[ntidev](/maintainers/ntidev)

---

Top Contributors

[![FVSoftwareDeveloper](https://avatars.githubusercontent.com/u/99698678?v=4)](https://github.com/FVSoftwareDeveloper "FVSoftwareDeveloper (2 commits)")

### Embed Badge

![Health badge](/badges/ntidev-php-utilities/health.svg)

```
[![Health](https://phpackages.com/badges/ntidev-php-utilities/health.svg)](https://phpackages.com/packages/ntidev-php-utilities)
```

PHPackages © 2026

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