PHPackages                             codebar-ag/laravel-m-files - 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. codebar-ag/laravel-m-files

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

codebar-ag/laravel-m-files
==========================

M-Files integration with Laravel

v13.1.1(1w ago)06.5kMITPHPPHP 8.3.\*|8.4.\*|8.5.\*CI passing

Since Aug 2Pushed 1w agoCompare

[ Source](https://github.com/codebar-ag/laravel-m-files)[ Packagist](https://packagist.org/packages/codebar-ag/laravel-m-files)[ Docs](https://github.com/codebar-ag/laravel-m-files)[ RSS](/packages/codebar-ag-laravel-m-files/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (10)Dependencies (49)Versions (30)Used By (0)

[![Laravel M-Files banner with description and logo](https://camo.githubusercontent.com/5897f4ec76b49c51a28e00dce2f9a7fa74dc56712027b73b616b15c038249b4b/68747470733a2f2f62616e6e6572732e6265796f6e64636f2e64652f4c61726176656c2532304d2d46696c65732e706e673f7468656d653d6c69676874267061636b6167654d616e616765723d636f6d706f7365722b72657175697265267061636b6167654e616d653d636f64656261722d61672532466c61726176656c2d6d2d66696c6573267061747465726e3d63697263756974426f617264267374796c653d7374796c655f31266465736372697074696f6e3d416e2b6f70696e696f6e617465642b7761792b746f2b696e746567726174652b4d2d46696c65732b776974682b4c61726176656c266d643d312673686f7757617465726d61726b3d3026666f6e7453697a653d313735707826696d616765733d646f63756d656e742d7265706f7274)](https://camo.githubusercontent.com/5897f4ec76b49c51a28e00dce2f9a7fa74dc56712027b73b616b15c038249b4b/68747470733a2f2f62616e6e6572732e6265796f6e64636f2e64652f4c61726176656c2532304d2d46696c65732e706e673f7468656d653d6c69676874267061636b6167654d616e616765723d636f6d706f7365722b72657175697265267061636b6167654e616d653d636f64656261722d61672532466c61726176656c2d6d2d66696c6573267061747465726e3d63697263756974426f617264267374796c653d7374796c655f31266465736372697074696f6e3d416e2b6f70696e696f6e617465642b7761792b746f2b696e746567726174652b4d2d46696c65732b776974682b4c61726176656c266d643d312673686f7757617465726d61726b3d3026666f6e7453697a653d313735707826696d616765733d646f63756d656e742d7265706f7274)

[![Latest Version on Packagist](https://camo.githubusercontent.com/d04b959db3ff04e41c26fa906d5c277c69caa093e9dbf83441ec276d6348f8b1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f636f64656261722d61672f6c61726176656c2d6d2d66696c65732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/codebar-ag/laravel-m-files)[![GitHub-Tests](https://github.com/codebar-ag/laravel-m-files/actions/workflows/run-tests.yml/badge.svg?branch=main)](https://github.com/codebar-ag/laravel-m-files/actions/workflows/run-tests.yml)[![GitHub Code Style](https://github.com/codebar-ag/laravel-m-files/actions/workflows/fix-php-code-style-issues.yml/badge.svg?branch=main)](https://github.com/codebar-ag/laravel-m-files/actions/workflows/fix-php-code-style-issues.yml)[![Larastan](https://camo.githubusercontent.com/b6156838f622c5fb8df1ff4ba300a3424e99d61db1b1d9784afdbf8f62cd6a94/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6172617374616e2d4c6576656c253230352d627269676874677265656e2e737667)](https://github.com/larastan/larastan)[![Total Downloads](https://camo.githubusercontent.com/9200794d0dc4370c3c5ab77b315d135896ae8a88b0908b4189b69b88681aa0be/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f636f64656261722d61672f6c61726176656c2d6d2d66696c65732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/codebar-ag/laravel-m-files)

Laravel M-Files Integration
===========================

[](#laravel-m-files-integration)

A Laravel package providing DTOs and requests for integrating with M-Files REST API.

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

[](#installation)

You can install the package via composer:

```
composer require codebar-ag/laravel-m-files
```

### Requirements

[](#requirements)

#### PHP and Laravel compatibility

[](#php-and-laravel-compatibility)

Package releasePHP (Composer constraint)Laravel**v13.x**`8.3.*|8.4.*|8.5.*`**^13.0****v12.x**`8.2.*|8.3.*|8.4.*`**^12.0**Install a package version whose row matches your application’s PHP and Laravel versions. The **current** major release is **v13.x** (see [Packagist](https://packagist.org/packages/codebar-ag/laravel-m-files) for the exact tag).

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

[](#configuration)

Publish the configuration file:

```
php artisan vendor:publish --provider="CodebarAg\MFiles\MFilesServiceProvider"
```

Add your M-Files authentication credentials to your `.env` file:

```
M_FILES_URL=https://your-mfiles-server.com
M_FILES_USERNAME=your-username
M_FILES_PASSWORD=your-password
M_FILES_VAULT_GUID=ABC0DE2G-3HW-QWCQ-SDF3-WERWETWETW
M_FILES_CACHE_DRIVER=file
M_FILES_EXPIRATION_SECONDS=3600
# M_FILES_SESSION_ID=   # optional; exposed as config('m-files.auth.session_id') for custom use
# M_FILES_CONNECT_TIMEOUT=10
# M_FILES_TIMEOUT=60
# M_FILES_TRIES=3
# M_FILES_RETRY_INTERVAL_MS=500
```

### Configuration Options

[](#configuration-options)

The package supports the following configuration options:

- `M_FILES_URL` - Your M-Files server URL
- `M_FILES_USERNAME` - Your M-Files username
- `M_FILES_PASSWORD` - Your M-Files password
- `M_FILES_VAULT_GUID` - The vault GUID to connect to
- `M_FILES_CACHE_DRIVER` - Cache driver for storing authentication tokens (defaults to `CACHE_DRIVER`, then `file`)
- `M_FILES_EXPIRATION_SECONDS` - How long to cache the vault authentication token, in seconds (default: `3600`)
- `M_FILES_SESSION_ID` - Optional; sets `config('m-files.auth.session_id')` (not used by the package’s built-in connector/requests; available for your own integrations)

### Transport Options

[](#transport-options)

The `m-files.http` config block controls timeouts and retries:

- `M_FILES_CONNECT_TIMEOUT` - Seconds to wait for the connection to be established (default: `10`)
- `M_FILES_TIMEOUT` - Seconds to wait for the complete response (default: `60`)
- `M_FILES_TRIES` - Maximum number of attempts per request (default: `3`)
- `M_FILES_RETRY_INTERVAL_MS` - Base delay between attempts in milliseconds, grown exponentially (default: `500`)

Without the timeouts Guzzle waits indefinitely, so a single unresponsive vault can pin every PHP worker in the pool.

Retries are deliberately conservative — only failures that are safe to replay are retried: connection errors, `408`, `429`, `503`, and `5xx` **only on idempotent methods** (`GET`, `HEAD`, `OPTIONS`). A document-creating `POST` is never sent twice. On a `401` the cached authentication token is dropped and re-fetched automatically, which covers a vault that expired or restarted the session before the cache TTL lapsed; genuinely bad credentials still fail fast. Set `M_FILES_TRIES` to `1` to disable retries entirely.

Authentication
--------------

[](#authentication)

The package provides automatic authentication token management with caching support.

### M-Files Connector

[](#m-files-connector)

```
use CodebarAg\MFiles\Connectors\MFilesConnector;
use CodebarAg\MFiles\DTO\ConfigWithCredentials;

$config = new ConfigWithCredentials(
    url: 'https://your-mfiles-server.com',
    vaultGuid: '{ABC0DE2G-3HW-QWCQ-SDF3-WERWETWETW}',
    username: 'your-username',
    password: 'your-password',
    cacheDriver: 'file',
    tokenTtlSeconds: 3600,
);

$connector = new MFilesConnector(configuration: $config);
```

### How the connector authenticates

[](#how-the-connector-authenticates)

Authentication is handled automatically by the `MFilesConnector`. When you create a connector instance with your credentials, it will automatically:

1. **Cache authentication tokens** - Tokens are cached for `M_FILES_EXPIRATION_SECONDS` / `config('m-files.auth.expiration')` (default 3600 seconds), or the `tokenTtlSeconds` argument on `ConfigWithCredentials`
2. **Include authentication headers** - The `X-Authentication` header is automatically added to all requests
3. **Handle token refresh** - When the cache entry expires, a new token is obtained on the next request

You can optionally inject a `CacheKeyManager` for tests or custom cache wiring: `new MFilesConnector(configuration: $config, cacheKeyManager: $manager)`.

### Cache and production security

[](#cache-and-production-security)

- Auth tokens are stored in your configured **Laravel cache store**. Use a **private** backend in production (not a shared public cache).
- Cache keys incorporate a hash of connection parameters (including credentials). For **multi-tenant** apps, avoid sharing one cache namespace across tenants; prefer per-tenant key prefixes or separate Redis databases where applicable.

```
use CodebarAg\MFiles\Requests\LogInToVaultRequest;

// Manual authentication (if needed)
$request = new LogInToVaultRequest(
    url: 'https://your-mfiles-server.com',
    vaultGuid: '{ABC0DE2G-3HW-QWCQ-SDF3-WERWETWETW}',
    username: 'your-username',
    password: 'your-password',
);

$token = $request->send()->dto();
// Returns authentication token as string
```

Requests
--------

[](#requests)

### Authentication Requests

[](#authentication-requests)

#### LogInToVaultRequest

[](#logintovaultrequest)

Gets an authentication token using username/password credentials.

**Constructor Parameters:**

- `url` (string) - M-Files server URL
- `vaultGuid` (string) - Vault GUID
- `username` (string) - M-Files username
- `password` (string) - M-Files password

**Request:**

```
use CodebarAg\MFiles\Requests\LogInToVaultRequest;

$request = new LogInToVaultRequest(
    url: 'https://your-mfiles-server.com',
    vaultGuid: '{ABC0DE2G-3HW-QWCQ-SDF3-WERWETWETW}',
    username: 'your-username',
    password: 'your-password',
);
```

**Response:**

```
$token = $request->send()->dto();
// Returns authentication token as string
```

### File Requests

[](#file-requests)

#### UploadFileRequest

[](#uploadfilerequest)

Uploads a file to M-Files.

**Constructor Parameters:**

- `fileContent` (string) - File content
- `fileName` (string) - File name

**Request:**

```
use CodebarAg\MFiles\Requests\UploadFileRequest;

$request = new UploadFileRequest(
    fileContent: $fileContent,
    fileName: 'document.pdf'
);
```

**Response:**

```
$uploadedFile = $connector->send($request)->dto();
// Returns array with file information including Title, Extension, and other metadata
```

#### CreateSingleFileDocumentRequest

[](#createsinglefiledocumentrequest)

Creates a single file document in M-Files.

**Constructor Parameters:**

- `title` (string) - Document title
- `files` (array) - A single uploaded file information array, **or** a list of them
- `propertyValues` (array) - Array of SetProperty objects for custom properties

**Request:**

```
use CodebarAg\MFiles\Requests\CreateSingleFileDocumentRequest;
use CodebarAg\MFiles\DTO\SetProperty;
use CodebarAg\MFiles\Enums\MFDataTypeEnum;

$request = new CreateSingleFileDocumentRequest(
    title: 'My Document',
    files: [$uploadedFile]
);
```

Both shapes are accepted for `files`: a single upload-info array (`files: $uploadedFile`) and a list of them (`files: [$uploadedFile]`). Passing several entries creates a multi-file document:

```
$request = new CreateSingleFileDocumentRequest(
    title: 'My Document',
    files: [$firstUploadedFile, $secondUploadedFile]
);
```

**Response:**

```
use CodebarAg\MFiles\DTO\ObjectProperties;

$document = $connector->send($request)->dto();
// Returns ObjectProperties DTO with document information
```

**With Custom Property Values:**

```
$propertyValues = [
    new SetProperty(propertyDef: 0, dataType: MFDataTypeEnum::TEXT, value: 'Custom Title'),
    new SetProperty(propertyDef: 5, dataType: MFDataTypeEnum::DATE, value: '2024-01-01'),
];

$request = new CreateSingleFileDocumentRequest(
    title: 'Custom Document',
    files: [$uploadedFile],
    propertyValues: $propertyValues
);
```

#### DownloadFileRequest

[](#downloadfilerequest)

Downloads a file from M-Files.

**Constructor Parameters:**

- `objectType` (int) - Object type ID
- `objectId` (int) - Object ID
- `objectVersion` (int) - Object version
- `fileId` (int) - File ID

**Request:**

```
use CodebarAg\MFiles\Requests\DownloadFileRequest;

$request = new DownloadFileRequest(
    objectType: 0,
    objectId: 123,
    objectVersion: 1,
    fileId: 456
);
```

**Response:**

```
use CodebarAg\MFiles\DTO\DownloadedFile;

$downloadedFile = $connector->send($request)->dto();
// Returns DownloadedFile DTO with content, name, extension, size, contentType
```

### Property Requests

[](#property-requests)

#### GetObjectInformationRequest

[](#getobjectinformationrequest)

Retrieves object information and properties from M-Files.

**Constructor Parameters:**

- `objectType` (int) - Object type ID
- `objectId` (int) - Object ID
- `objectVersion` (int) - Object version

**Request:**

```
use CodebarAg\MFiles\Requests\GetObjectInformationRequest;

$request = new GetObjectInformationRequest(
    objectType: 0,
    objectId: 123,
    objectVersion: 1
);
```

**Response:**

```
use CodebarAg\MFiles\DTO\ObjectProperties;

$objectProperties = $connector->send($request)->dto();
// Returns ObjectProperties DTO with object information and properties
```

#### SetPropertiesRequest

[](#setpropertiesrequest)

Sets properties for an existing object in M-Files.

**Constructor Parameters:**

- `objectType` (int) - Object type ID
- `objectId` (int) - Object ID
- `objectVersion` (int) - Object version (-1 for latest)
- `propertyValues` (array) - Array of SetProperty objects

**Request:**

```
use CodebarAg\MFiles\Requests\SetPropertiesRequest;
use CodebarAg\MFiles\DTO\SetProperty;
use CodebarAg\MFiles\Enums\MFDataTypeEnum;

$propertyValues = [
    new SetProperty(1856, MFDataTypeEnum::BOOLEAN, true),
    new SetProperty(0, MFDataTypeEnum::TEXT, 'Updated Title'),
];

$request = new SetPropertiesRequest(
    objectType: 140,
    objectId: 1770,
    objectVersion: -1,
    propertyValues: $propertyValues
);
```

**Response:**

```
use CodebarAg\MFiles\DTO\ObjectProperties;

$objectProperties = $connector->send($request)->dto();
// Returns ObjectProperties DTO with updated object information
```

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

[](#error-handling)

Every failure surfaces as a single exception, `CodebarAg\MFiles\Exceptions\MFilesErrorException` — including responses that are not JSON at all (an HTML error page from a reverse proxy or gateway, which previously escaped as a `JsonException`).

```
use CodebarAg\MFiles\Exceptions\MFilesErrorException;

try {
    $document = $connector->send($request)->dto();
} catch (MFilesErrorException $e) {
    $e->getMessage();               // The message exactly as M-Files reported it
    $e->status();                   // HTTP status, or 0 when it could not be determined
    $e->errorCode();                // M-Files error code, or null when the payload carried none
    $e->isAuthenticationFailure();  // true for 401 / 403
    $e->context();                  // Single-line summary for logs: status, exception name, code, method and URL
    $e->error;                      // The underlying MFilesError DTO (errorCode, status, url, method, exceptionName, exceptionMessage, stack)
}
```

DTOs
----

[](#dtos)

### Configuration DTOs

[](#configuration-dtos)

#### ConfigWithCredentials

[](#configwithcredentials)

Represents M-Files configuration with authentication credentials.

**Properties:**

- `url` (string) - M-Files server URL
- `vaultGuid` (string) - Vault GUID
- `username` (string) - M-Files username
- `password` (string) - M-Files password
- `cacheDriver` (string|null) - Cache store name for tokens (see `M_FILES_CACHE_DRIVER` / `config('m-files.cache_driver')`)
- `tokenTtlSeconds` (int) - Cache TTL for the vault token in seconds (default **3600**; must be **≥ 1**)

**Methods:**

- `fromArray(array $data): self` - Builds from an array; **requires a Laravel app context** so `config('m-files.*')` defaults apply for omitted `cacheDriver` / `tokenTtlSeconds`. Required keys: `url`, `vaultGuid`, `username`, `password` (each a non-empty string). Throws `InvalidArgumentException` if validation fails.
- `toArray(): array` - Converts to array format (includes `tokenTtlSeconds`)

**Usage:**

```
use CodebarAg\MFiles\DTO\ConfigWithCredentials;

$config = new ConfigWithCredentials(
    url: 'https://your-mfiles-server.com',
    vaultGuid: '{ABC0DE2G-3HW-QWCQ-SDF3-WERWETWETW}',
    username: 'your-username',
    password: 'your-password',
    cacheDriver: 'file',
    tokenTtlSeconds: 3600,
);

// Using static factory method (inside a Laravel application)
$config = ConfigWithCredentials::fromArray([
    'url' => 'https://your-mfiles-server.com',
    'vaultGuid' => '{ABC0DE2G-3HW-QWCQ-SDF3-WERWETWETW}',
    'username' => 'your-username',
    'password' => 'your-password',
    'cacheDriver' => 'file',
    'tokenTtlSeconds' => 3600,
]);
```

### File DTOs

[](#file-dtos)

#### File

[](#file)

Represents a file in M-Files.

**Properties:**

- `id` (int) - File ID
- `name` (string) - File name
- `extension` (string|null) - File extension
- `version` (int|null) - File version
- `size` (int|null) - File size in bytes

**Methods:**

- `fromArray(array $data): self` - Static factory method
- `toArray(): array` - Converts to array format

**Usage:**

```
use CodebarAg\MFiles\DTO\File;

$file = new File(
    id: 456,
    name: 'document.pdf',
    extension: 'pdf',
    version: 1,
    size: 1024
);

// Using static factory method
$file = File::fromArray([
    'ID' => 456,
    'Name' => 'document.pdf',
    'Extension' => 'pdf',
    'Version' => 1,
    'Size' => 1024
]);
```

#### DownloadedFile

[](#downloadedfile)

Represents a downloaded file with content and metadata.

**Properties:**

- `name` (string|null) - File name
- `extension` (string|null) - File extension
- `size` (int|null) - File size in bytes
- `contentType` (string|null) - MIME content type
- `content` (string) - File content

**Methods:**

- `fromArray(array $data): self` - Static factory method
- `toArray(): array` - Converts to array format

**Usage:**

```
use CodebarAg\MFiles\DTO\DownloadedFile;

$downloadedFile = new DownloadedFile(
    name: 'document.pdf',
    extension: 'pdf',
    size: 1024,
    contentType: 'application/pdf',
    content: $fileContent
);

// Using static factory method
$downloadedFile = DownloadedFile::fromArray([
    'name' => 'document.pdf',
    'extension' => 'pdf',
    'size' => 1024,
    'contentType' => 'application/pdf',
    'content' => $fileContent
]);
```

### Property DTOs

[](#property-dtos)

#### SetProperty

[](#setproperty)

Represents a property value for creating documents.

**Properties:**

- `propertyDef` (int) - Property definition ID
- `dataType` (MFDataTypeEnum) - Property data type
- `value` (mixed) - Property value
- `displayValue` (mixed) - Display value (optional)

**Methods:**

- `fromArray(int $propertyDef, MFDataTypeEnum $dataType, mixed $value, mixed $displayValue = null): self` - Static factory method
- `toArray(): array` - Converts to array format for API requests

**Usage:**

```
use CodebarAg\MFiles\DTO\SetProperty;
use CodebarAg\MFiles\Enums\MFDataTypeEnum;

$propertyValue = new SetProperty(
    propertyDef: 0,
    dataType: MFDataTypeEnum::TEXT,
    value: 'Sample Text'
);

// Using static factory method
$propertyValue = SetProperty::fromArray(
    propertyDef: 0,
    dataType: MFDataTypeEnum::TEXT,
    value: 'Sample Text'
);

// Convert to array for API requests
$array = $propertyValue->toArray();
```

#### GetProperty

[](#getproperty)

Represents a property retrieved from M-Files.

**Properties:**

- `propertyDef` (int) - Property definition ID
- `dataType` (MFDataTypeEnum) - Property data type
- `value` (mixed) - Property value
- `displayValue` (mixed) - Display value

**Methods:**

- `fromArray(array $data): self` - Static factory method
- `toArray(): array` - Converts to array format

**Usage:**

```
use CodebarAg\MFiles\DTO\GetProperty;

$property = GetProperty::fromArray([
    'PropertyDef' => 0,
    'Value' => [
        'DataType' => 1,
        'Value' => 'Sample Text',
        'DisplayValue' => 'Sample Text'
    ]
]);
```

#### ObjectProperties

[](#objectproperties)

Represents object properties in M-Files.

**Properties:**

- `classId` (int) - Class ID
- `objectId` (int) - Object ID
- `objectTypeId` (int) - Object type ID
- `objectVersionId` (int) - Object version ID
- `lastModifiedAt` (CarbonImmutable) - Last modified timestamp
- `properties` (Collection) - Collection of GetProperty objects
- `files` (Collection) - Collection of File objects

**Methods:**

- `fromArray(array $data): self` - Static factory method
- `toArray(): array` - Converts to array format

**Usage:**

```
use CodebarAg\MFiles\DTO\ObjectProperties;

$objectProperties = ObjectProperties::fromArray([
    'Class' => 1,
    'ObjVer' => [
        'ID' => 123,
        'Type' => 0,
        'Version' => 1,
        'Modified' => '2024-01-01T00:00:00Z'
    ],
    'Properties' => [],
    'Files' => []
]);
```

### Enums

[](#enums)

#### MFDataTypeEnum

[](#mfdatatypeenum)

Represents data types in M-Files.

**Available Values:**

- `UNINITIALIZED` (0) - Document/Object
- `TEXT` (1) - Text
- `INTEGER` (2) - A 32-bit integer
- `FLOATING` (3) - A double-precision floating point
- `DATE` (5) - Date
- `TIME` (6) - Time
- `TIMESTAMP` (7) - Timestamp
- `BOOLEAN` (8) - Boolean
- `LOOKUP` (9) - Lookup (from a value list)
- `MULTISELECTLOOKUP` (10) - Multiple selection from a value list
- `INTEGER64` (11) - A 64-bit integer
- `FILETIME` (12) - FILETIME (a 64-bit integer)
- `MULTILINETEXT` (13) - Multi-line text
- `ACL` (14) - The access control list (ACL)

**Usage:**

```
use CodebarAg\MFiles\Enums\MFDataTypeEnum;

$dataType = MFDataTypeEnum::TEXT;
$dataTypeValue = $dataType->value; // 1
```

Testing
-------

[](#testing)

```
composer test
```

`composer test` runs Pest with `--no-coverage` so the suite passes without PCOV or Xdebug (PHPUnit is configured with `failOnWarning="true"`, and missing a coverage driver would otherwise fail the run).

Static analysis:

```
composer analyse
```

To generate a coverage report locally, install and enable [PCOV](https://github.com/krakjoe/pcov) or Xdebug, then run:

```
composer test-coverage
```

On GitHub Actions, the `run-tests` workflow runs the matrix with `--no-coverage` and includes a **coverage** job (PHP 8.5 + PCOV) that writes Clover output and uploads it as a workflow artifact.

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

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

[](#contributing)

Open a pull request or issue on [GitHub](https://github.com/codebar-ag/laravel-m-files). Please run `composer test` and `composer analyse` before submitting.

Security
--------

[](#security)

Operational notes on caching and credentials are described under [Cache and production security](#cache-and-production-security).

If you discover any security related issues, please email  instead of using the issue tracker.

Credits
-------

[](#credits)

- [Codebar Solutions AG](https://github.com/codebar-ag)
- [All Contributors](../../contributors)

License
-------

[](#license)

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

###  Health Score

52

—

FairBetter than 96% of packages

Maintenance98

Actively maintained with recent releases

Popularity23

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity65

Established project with proven stability

 Bus Factor1

Top contributor holds 52.9% 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.

###  Release Activity

Cadence

Every ~18 days

Recently: every ~30 days

Total

21

Last Release

13d ago

Major Versions

v12.5.0 → v13.02025-10-29

v12.13.0 → v13.0.02026-04-07

PHP version history (2 changes)v12.0.0PHP 8.4.\*

v12.13.0PHP 8.3.\*|8.4.\*|8.5.\*

### Community

Maintainers

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

---

Top Contributors

[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (9 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (5 commits)")[![StanBarrows](https://avatars.githubusercontent.com/u/10268813?v=4)](https://github.com/StanBarrows "StanBarrows (3 commits)")

---

Tags

dmslaravelm-filespackagephplaravelcodebar-agcodebar Solutions AGm-fileslaravel-m-files

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/codebar-ag-laravel-m-files/health.svg)

```
[![Health](https://phpackages.com/badges/codebar-ag-laravel-m-files/health.svg)](https://phpackages.com/packages/codebar-ag-laravel-m-files)
```

###  Alternatives

[codebar-ag/laravel-docuware

DocuWare integration with Laravel

1125.1k](/packages/codebar-ag-laravel-docuware)[nativephp/mobile

NativePHP for Mobile

1.1k102.1k151](/packages/nativephp-mobile)[spatie/laravel-health

Monitor the health of a Laravel application

88212.7M189](/packages/spatie-laravel-health)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5226.7k](/packages/simplestats-io-laravel-client)[codebar-ag/laravel-zammad

Zammad integration with Laravel

107.4k](/packages/codebar-ag-laravel-zammad)[aedart/athenaeum

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

265.2k](/packages/aedart-athenaeum)

PHPackages © 2026

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