Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/protonemedia/laravel-mixins
A collection of Laravel goodies.
https://github.com/protonemedia/laravel-mixins
laravel php
Last synced: about 4 hours ago
JSON representation
A collection of Laravel goodies.
- Host: GitHub
- URL: https://github.com/protonemedia/laravel-mixins
- Owner: protonemedia
- License: mit
- Created: 2020-08-11T16:44:41.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2024-08-20T13:53:49.000Z (3 months ago)
- Last Synced: 2024-11-06T15:07:56.440Z (1 day ago)
- Topics: laravel, php
- Language: PHP
- Homepage: https://protone.media/blog/convert-and-store-base64-encoded-files-in-laravel-use-validation-rules-and-access-the-decoded-files-from-the-request-instance
- Size: 151 KB
- Stars: 145
- Watchers: 5
- Forks: 9
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE.md
Awesome Lists containing this project
README
# Laravel Mixins
[![Latest Version on Packagist](https://img.shields.io/packagist/v/protonemedia/laravel-mixins.svg?style=flat-square)](https://packagist.org/packages/protonemedia/laravel-mixins)
[![Total Downloads](https://img.shields.io/packagist/dt/protonemedia/laravel-mixins.svg?style=flat-square)](https://packagist.org/packages/protonemedia/laravel-mixins)
[![Buy us a tree](https://img.shields.io/badge/Treeware-%F0%9F%8C%B3-lightgreen)](https://plant.treeware.earth/protonemedia/laravel-mixins)## Sponsor Us
[](https://inertiaui.com/inertia-table?utm_source=github&utm_campaign=laravel-mixins)
❤️ We proudly support the community by developing Laravel packages and giving them away for free. If this package saves you time or if you're relying on it professionally, please consider [sponsoring the maintenance and development](https://github.com/sponsors/pascalbaljet) and check out our latest premium package: [Inertia Table](https://inertiaui.com/inertia-table?utm_source=github&utm_campaign=laravel-mixins). Keeping track of issues and pull requests takes time, but we're happy to help!
## Requirements
* PHP 8.1+
* Laravel 10.0## Installation
You can install the package via composer:
```bash
composer require protonemedia/laravel-mixins
```There's no Service Provider or automatic discovery/registration of anything. All features are opt-in.
## Contents
#### Blade Directives
* [Decimal Money Formatter](#decimal-money-formatter)
* [Intl Money Formatter](#intl-money-formatter)#### Console Commands
* [Generate Sitemap](#generate-sitemap)#### Validation Rules
* [Current password](#current-password)
* [Dimensions With Margin](#dimensions-with-margin)
* [Host](#host)
* [In Keys](#in-keys)
* [Max Words](#max-words)
* [URL Without Scheme](#url-without-scheme)#### String Macros
* [Compact](#compact)
* [Human Filesize](#human-filesize)
* [Text](#text)
* [URL](#url)
* [Seconds to time](#seconds-to-time)
* [PDF Regeneration](#pdf-regeneration)#### Request
* [Convert Base64 input data to files](#convert-base64-input-data-to-files)## Blade Directives
You can register Blade Directives by calling the `directive` method on the class. You can change the name of a directive with the optional first argument.
### Decimal Money Formatter
*Note: This directive requires the `moneyphp/money` package.*
Register the directive, for example by adding it to your `AppSerivceProvider`:
```php
ProtoneMedia\LaravelMixins\Blade\DecimalMoneyFormatter::directive();
```You can customize the name of the directive and the default currency code:
```php
ProtoneMedia\LaravelMixins\Blade\DecimalMoneyFormatter::directive('decimals', 'EUR');
```The first argument of the directive is the amount in cents. The second optional parameter is the currency.
```blade
// 0.99
@decimals(99)// 1.00
@decimals(100)// 100
@decimals(100, 'XTS')
```### Intl Money Formatter
*Note: This directive requires the `moneyphp/money` package.*
Register the directive, for example by adding it to your `AppSerivceProvider`:
```php
ProtoneMedia\LaravelMixins\Blade\IntlMoneyFormatter::directive();
```You can customize the name of the directive, the default currency code and the locale:
```php
ProtoneMedia\LaravelMixins\Blade\IntlMoneyFormatter::directive('money', 'EUR', 'nl_NL');
```The first argument of the directive is the amount in cents. The optional second parameter is the currency. The optional third parameter is the locale.
```blade
// € 0,99
@money(99)// € 1,00
@money(100)// US$ 1,00
@money(100, 'USD')// 1 000,00 $US
@money(100, 'USD', 'fr')
```## Commands
### Generate Sitemap
*Note: This command requires the `spatie/laravel-sitemap` package.*
You can register the command by adding it to your `App\Console\Kernel` file, or by calling the `register` method on the class.
```php
ProtoneMedia\LaravelMixins\Commands\GenerateSitemap::register();
```You can also set a custom signature:
```php
ProtoneMedia\LaravelMixins\Commands\GenerateSitemap::register('generate-sitemap');
```It generates a sitemap of your entire site and stores in in the `public` folder as `sitemap.xml`.
```bash
php artisan sitemap:generate
```## Validation Rules
### Current password
Passes if the value matches the password of the authenticated user.
```php
$rule = new ProtoneMedia\LaravelMixins\Rules\CurrentPassword;
```As of Laravel 9, this validation rule is [built-in](https://laravel.com/docs/9.x/validation#rule-current-password).
### Dimensions With Margin
Extension of the [Dimensions rule](https://laravel.com/docs/master/validation#rule-dimensions) with a `margin` option. Handy when you're working with ratios with repeating decimals.
```php
use ProtoneMedia\LaravelMixins\Rules\DimensionsWithMargin;$rule = DimensionsWithMargin::make()->ratio(20 / 9)->margin(1),
```### Host
Verifies if the URL matches the given hosts.
```php
use ProtoneMedia\LaravelMixins\Rules\Host;$rule = Host::make(['facebook.com', 'fb.me']);
```### In Keys
Verifies if the given key or index exists in the array.
```php
use ProtoneMedia\LaravelMixins\Rules\InKeys;$rule = new InKeys(['laravel' => 'Laravel Framework', 'tailwindcss' => 'Tailwind CSS framework']);
// same as
use Illuminate\Validation\Rules\In;
$rule = new In(['laravel', 'tailwindcss']);
```### Max Words
Passes if the values contains no more words than specified.
```php
use ProtoneMedia\LaravelMixins\Rules\MaxWords;$rule = MaxWords::make(250);
```### URL Without Scheme
Passes if the URL is valid, even without a scheme.
```php
$rule = new ProtoneMedia\LaravelMixins\Rules\UrlWithoutScheme;
```## String macros
You can add new method by using the mixins.
### Compact
```php
Str::mixin(new ProtoneMedia\LaravelMixins\String\Compact);$string = "Hoe simpeler hoe beter. Want hoe minder keuze je een speler laat, hoe groter de kans dat hij het juiste doet.";
// Hoe simpeler hoe beter. Want hoe ... de kans dat hij het juiste doet.
echo Str::compact($string);
```It has an optional second argument to specify the length on each side. With the optional third argument, you can specify the sepeator.
```php
// Hoe simpeler hoe - het juiste doet.
echo Str::compact($string, 16, ' - ');
```### Human Filesize
Converts a filesize into a human-readable version of the string.
```php
Str::mixin(new ProtoneMedia\LaravelMixins\String\HumanFilesize);$size = 3456789;
// '3.3 MB'
Str::humanFilesize($size));
```### Text
*Note: This macro requires the `html2text/html2text` package.*
Converts HTML to plain text.
```php
Str::mixin(new ProtoneMedia\LaravelMixins\String\Text);$html = "
Protone Media
";// Protone Media
Str::text($html);
```### URL
Prepends `https://` if the scheme is missing from the given URL.
```php
Str::mixin(new ProtoneMedia\LaravelMixins\String\Url);$url = "protone.media";
// https://protone.media
Str::url($url);
```### Seconds to time
Converts seconds to a 'mm:ss' / 'hh:mm:ss' format.
```php
Str::mixin(new ProtoneMedia\LaravelMixins\String\SecondsToTime);Str::secondsToTime(10); // 00:10
Str::secondsToTime(580); // 09:40
Str::secondsToTime(3610); // 01:00:10// force 'hh:mm:ss' format, even under an hour:
Str::secondsToTime(580, false); // 00:09:40
```## PDF Regeneration
*Note: Requires the `symfony/process` package.*
Regenerates the PDF content with Ghostscript.
```php
$ghostscript = new ProtoneMedia\LaravelMixins\Pdf\Ghostscript;$regeneratedPdf = $ghostscript->regeneratePdf(
file_get_contents('/uploads/invoice.pdf')
);
```You can specify the path of the `ghostscript` binary as well:
```php
$ghostscript = new Ghostscript('gs-binary');
```## Convert Base64 input data to files
Add the `ConvertsBase64ToFiles` trait and `base64FileKeys` method to your form request.
```php
use Illuminate\Foundation\Http\FormRequest;
use ProtoneMedia\LaravelMixins\Request\ConvertsBase64ToFiles;class ImageRequest extends FormRequest
{
use ConvertsBase64ToFiles;protected function base64FileKeys(): array
{
return [
'jpg_image' => 'Logo.jpg',
];
}public function rules()
{
return [
'jpg_image' => ['required', 'file', 'image'],
];
}
}
```Now you can get the files like regular uploaded files:
```php
$jpgFile = $request->file('jpg_image');// Logo.jpg
$jpgFile->getClientOriginalName();
```This trait supports nested data as well. You can either reference the keys by a nested array, or with a [dotted notation](https://laravel.com/docs/master/helpers#method-array-dot):
```php
class ImageRequest extends FormRequest
{
use ConvertsBase64ToFiles;protected function base64FileKeys(): array
{
return [
'company.logo' => 'Logo.jpg',
'user' => [
'avatar' => 'Avatar.jpg',
],
];
}
}
```Want to know more about this trait? Check out the [blog post](https://protone.media/blog/convert-and-store-base64-encoded-files-in-laravel-use-validation-rules-and-access-the-decoded-files-from-the-request-instance).
### Testing
``` bash
composer test
```### Changelog
Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently.
## Contributing
Please see [CONTRIBUTING](CONTRIBUTING.md) for details.
## Other Laravel packages
* [`Inertia Table`](https://inertiaui.com/inertia-table?utm_source=github&utm_campaign=laravel-mixins): The Ultimate Table for Inertia.js with built-in Query Builder.
* [`Laravel Blade On Demand`](https://github.com/protonemedia/laravel-blade-on-demand): Laravel package to compile Blade templates in memory.
* [`Laravel Cross Eloquent Search`](https://github.com/protonemedia/laravel-cross-eloquent-search): Laravel package to search through multiple Eloquent models.
* [`Laravel Eloquent Scope as Select`](https://github.com/protonemedia/laravel-eloquent-scope-as-select): Stop duplicating your Eloquent query scopes and constraints in PHP. This package lets you re-use your query scopes and constraints by adding them as a subquery.
* [`Laravel FFMpeg`](https://github.com/protonemedia/laravel-ffmpeg): This package provides an integration with FFmpeg for Laravel. The storage of the files is handled by Laravel's Filesystem.
* [`Laravel MinIO Testing Tools`](https://github.com/protonemedia/laravel-minio-testing-tools): Run your tests against a MinIO S3 server.
* [`Laravel Paddle`](https://github.com/protonemedia/laravel-paddle): Paddle.com API integration for Laravel with support for webhooks/events.
* [`Laravel Task Runner`](https://github.com/protonemedia/laravel-task-runner): Write Shell scripts like Blade Components and run them locally or on a remote server.
* [`Laravel Verify New Email`](https://github.com/protonemedia/laravel-verify-new-email): This package adds support for verifying new email addresses: when a user updates its email address, it won't replace the old one until the new one is verified.
* [`Laravel XSS Protection`](https://github.com/protonemedia/laravel-xss-protection): Laravel Middleware to protect your app against Cross-site scripting (XSS). It sanitizes request input, and it can sanatize Blade echo statements.### Security
If you discover any security related issues, please email [email protected] instead of using the issue tracker.
## Credits
- [Pascal Baljet](https://github.com/protonemedia)
- [All Contributors](../../contributors)## License
The MIT License (MIT). Please see [License File](LICENSE.md) for more information.
## Treeware
This package is [Treeware](https://treeware.earth). If you use it in production, then we ask that you [**buy the world a tree**](https://plant.treeware.earth/protonemedia/laravel-mixins) to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats.