longman / laravel-lodash
Add more functional to Laravel >=8.0
Installs: 77 348
Dependents: 0
Suggesters: 0
Security: 0
Stars: 93
Watchers: 5
Forks: 10
Open Issues: 1
Requires
- php: ^8.2
- laravel/framework: ^11.0
Requires (Dev)
- aws/aws-sdk-php: ^3.306
- elasticsearch/elasticsearch: ^8.13
- jetbrains/phpstorm-attributes: ^1.0
- laravel/horizon: ^5.24
- laravel/passport: ^12.0
- longman/php-code-style: ^10.1
- mockery/mockery: ^1.3
- neitanod/forceutf8: ^2.0
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^11.0
Suggests
- ext-igbinary: Needed for speed up Redis/Memcached data serialization and reduce serialized data size
- ext-json: Needed for using resources
- ext-lz4: Needed for serialization Redis traffic
- ext-lzf: Needed for serialization Redis traffic
- ext-msgpack: Needed for speed up Redis/Memcached data serialization and reduce serialized data size
- ext-redis: Needed for using phpredis
- aws/aws-sdk-php: Use AWS SQS >=3
- barryvdh/laravel-debugbar: Allow print compiled queries via function get_db_queries()
- beyondcode/laravel-self-diagnosis: Run system diagnosis with many custom checks
- elasticsearch/elasticsearch: Use Elasticsearch service in the laravel
- longman/laravel-multilang: Adds multilanguage functional to Laravel >=5.5
- neitanod/forceutf8: Allow encoding/decoding utf-8 strings
- ramsey/uuid: Use UUID identifiers in the eloquent models
- dev-master
- 12.0.0
- 11.0.2
- 11.0.1
- 11.0.0
- 10.3.0
- 10.2.1
- 10.2.0
- 10.1.0
- 10.0.1
- 10.0.0
- 9.0.4
- 9.0.3
- 9.0.2
- 9.0.1
- 9.0.0
- 8.0.1
- 8.0.0
- 7.1.3
- 7.1.2
- 7.1.1
- 7.1.0
- 7.0.0
- 6.0.1
- 6.0.0
- 5.0.4
- 5.0.3
- 5.0.2
- 5.0.1
- 5.0.0
- 4.6.3
- 4.6.2
- 4.6.1
- 4.6.0
- 4.5.2
- 4.5.1
- 4.5.0
- 4.4.1
- 4.4.0
- 4.3.0
- 4.2.0
- 4.1.1
- 4.1.0
- 4.0.13
- 4.0.12
- 4.0.11
- 4.0.10
- 4.0.9
- 4.0.8
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.2.0
- 3.1.0
- 3.0.1
- 3.0.0
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.16.1
- 0.16.0
- 0.15.1
- 0.15.0
- 0.14.0
- 0.12.0
- 0.11.0
- 0.10.1
- 0.10.0
- 0.9.1
- 0.9.0
- 0.8.4
- 0.8.3
- 0.8.2
- 0.8.1
- 0.8.0
- 0.7.0
- 0.6.0
- 0.5.0
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.4
- 0.3.3
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1.0
- 0.0.6
- 0.0.5
- 0.0.4
- 0.0.3
- 0.0.2
- 0.0.1
- dev-dependabot/composer/aws/aws-sdk-php-3.288.1
- dev-dev
This package is auto-updated.
Last update: 2024-10-06 10:46:28 UTC
README
This package adds lot of useful functionality to the Laravel >=8.0 project
Note: For Laravel older than 5.8 use the package version 1., for older than 8.0 - version 4.
Table of Contents
- Installation
- Usage
- General
- Enable Debug Mode depending on visitor's IP Address
- Add created_by, updated_by and deleted_by to the eloquent models
- Use UUID in the Eloquent Models
- Eager loading of limited many to many relations via subquery or union
- Redis using igbinary
- Redis client side sharding
- AWS SQS Fifo Queue
- Elasticsearch Integration
- Check if installed packages are in sync with composer.lock
- Helper Functions
- Extended Classes
- Artisan Commands
- Middleware List
- Blade Directives
- Misc
- General
- TODO
- Troubleshooting
- Contributing
- License
- Credits
Installation
Install this package through Composer.
Run a command in your command line:
composer require longman/laravel-lodash
Add LodashServiceProvider
to your service providers list in the app.php
'providers' => [ . . . /* * Package Service Providers... */ Longman\LaravelLodash\ServiceProvider::class, . . . ],
Copy the package config and translations to your application with the publish command:
php artisan vendor:publish --provider="Longman\LaravelLodash\LodashServiceProvider"
Usage
General
Enable Debug Mode depending on visitor's IP Address
Add Longman\LaravelLodash\Debug\DebugServiceProvider::class
in to config/app.php
and specify debug IP's in your config/lodash.php
config file:
. . . 'debug' => [ 'ips' => [ // IP list for enabling debug mode //'127.0.0.1', ], ], . . .
Add created_by, updated_by and deleted_by to the eloquent models
Sometimes we need to know who created, updated or deleted entry in the database.
For this just add Longman\LaravelLodash\Eloquent\UserIdentities
trait to your model and also
update migration file adding necessary columns:
$table->unsignedInteger('created_by')->nullable(); $table->unsignedInteger('updated_by')->nullable(); $table->unsignedInteger('deleted_by')->nullable();
Use UUID in the Eloquent Models
For this just add Longman\LaravelLodash\Eloquent\UuidAsPrimary
trait to your model and also
update related migration file:
$table->uuid('id')->primary();
Also there is possible to specify uuid version via defining uuidVersion
property in the model class.
Eager loading of limited many to many relations via subquery or union
Eager load many to many relations with limit via subquery or union.
For using this feature, add Longman\LaravelLodash\Eloquent\ManyToManyPreload
trait to the models.
After that you can use methods limitPerGroupViaUnion()
and limitPerGroupViaSubQuery()
.
For example you want to select users and 3 related user photos per user.
$items = (new User)->with([ 'photos' => function (BelongsToMany $builder) { // Select via union. There you should pass pivot table fields array $builder->limitPerGroupViaUnion(3, ['user_id', 'photo_id']); // or // Select via subquery $builder->limitPerGroupViaSubQuery(3); }, 'other.relation1', 'other.relation2' ]); $items = $items->get();
Now each user model have 3 photos model selected via one query. You can specify additional where clauses or order by fields before the group method call.
Redis using igbinary
Igbinary is a drop in replacement for the standard php serializer. Igbinary stores php data structures in compact binary form. Savings are significant when using Redis or similar memory based storages for serialized data. Via Igbinary repetitive strings are stored only once. Collections of Eloquent objects benefit significantly from this.
By default Laravel does not provide an option to enable igbinary serializer for PhpRedis connection and you have to use LaravelLodash implementation for this.
First of all, make sure you enabled PhpRedis driver by this guide https://laravel.com/docs/5.5/redis#phpredis
After that include Cache and Redis service providers in the app.php
before your App providers:
. . . Longman\LaravelLodash\Cache\CacheServiceProvider::class, Longman\LaravelLodash\Redis\RedisServiceProvider::class, . . .
You can remove Laravel's Cache and Redis service providers from the config, because LaravelLodash providers are extended from them and therefore implements entire functional.
Now you can specify the serializer in your database.php
under config
folder:
Also, you can specify other options like scan
or etc. See https://github.com/phpredis/phpredis#setoption
Redis client side sharding
PhpRedis extension along with native Redis Cluster, also supports client-side sharding. This feature is very useful, when you want distribute your data between multiple servers, but do not want use native Redis Cluster.
Its not implemented in the Laravel by default. We tried to fix this 😄
Config example:
. . . 'redis' => [ 'client' => 'phpredis', 'clusters' => [ 'options' => [ 'lazy_connect' => true, 'connect_timeout' => 1, 'read_timeout' => 3, 'password' => env('REDIS_PASSWORD', null), 'database' => env('REDIS_DATABASE', 0), 'prefix' => env('REDIS_PREFIX'), 'serializer' => Redis::SERIALIZER_IGBINARY, 'compression' => Redis::COMPRESSION_ZSTD, 'compression_level' => Redis::COMPRESSION_ZSTD_DEFAULT, ], 'default' => [ [ 'host' => env('REDIS_SHARD1_HOST', '127.0.0.1'), 'port' => env('REDIS_SHARD1_PORT', 6379), ], [ 'host' => env('REDIS_SHARD2_HOST', '127.0.0.2'), 'port' => env('REDIS_SHARD2_PORT', 6379), ], . . . ], ], ], . . .
AWS SQS Fifo Queue
Laravel by default does not supports AWS FIFO queues and this package fixes it.
You have to add QueueServiceProvider
service provider in the app.php
before your App providers:
. . . Longman\LaravelLodash\Queue\QueueServiceProvider::class, . . .
You can remove Laravel's Queue service provider from the config, because LaravelLodash provider are extended from that and therefore implements entire functional.
Now you can add the new connection in the queue.php
under config
folder:
. . . 'sqs_fifo' => [ 'driver' => 'sqs.fifo', 'version' => 'latest', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('AWS_SQS_URL'), 'queue' => env('AWS_SQS_DEFAULT_QUEUE'), 'region' => env('AWS_DEFAULT_REGION'), 'options' => [ 'type' => 'fifo', // fifo, normal 'polling' => 'long', // long, short 'wait_time' => 20, ], ], . . .
Elasticsearch Integration
First of all you have to install official elasticsearch php sdk:
composer require elasticsearch/elasticsearch
After add ElasticsearchServiceProvider
service provider in the app.php
before your App providers:
. . . Longman\LaravelLodash\Elasticsearch\ElasticsearchServiceProvider::class, . . .
Now you can add the configuration in the services.php
under config
folder:
. . . 'elasticsearch' => [ 'enabled' => env('ELASTICSEARCH_ENABLED', false), 'log_channel' => ['daily'], 'hosts' => [ [ 'host' => env('ELASTICSEARCH_HOST', 'localhost'), 'port' => env('ELASTICSEARCH_PORT', 9200), ], ], 'connectionParams' => [ 'client' => [ 'timeout' => env('ELASTICSEARCH_TIMEOUT', 3), 'connect_timeout' => env('ELASTICSEARCH_TIMEOUT', 3), ], ], ], . . .
You can use Elasticsearch integration via
$elasticsearch_manager = app(ElasticsearchManagerContract::class); // Call wrapped methods $elasticsearch_manager->createIndex('some-index'); // Or get native client and access their methods $client = $elasticsearch_manager->getClient(); $client->indices()->create($params);
Also you can perform search via searchable query object. Just create class and
implement ElasticsearchQueryContract
and you can pass object to performSearch
method
$elasticsearch_manager = app(ElasticsearchManagerContract::class); $results = $elasticsearch_manager->performSearch($query);
Check if installed packages are in sync with composer.lock
For development purposes, it is recommended to check if vendor folder is in sync with composer.lock file.
For this, in composer.json you have to add script ComposerScripts::createPackageHash
:
. . . "post-autoload-dump": [ "Longman\\LaravelLodash\\Composer\\ComposerScripts::createPackageHash", . . . ], . . .
And in the AppServiceProvider::boot
add these lines:
. . . if (config('app.debug')) { $checker = new ComposerChecker(base_path()); $checker->checkHash(); } . . .
Helper Functions
Extended Classes
For this fuctional you should add Longman\LaravelLodash\LodashServiceProvider::class
in the config/app.php
file.
There is an extended classes via Laravel's builtin macros functionality
Request class
Artisan Commands
For this fuctional you should add Longman\LaravelLodash\LodashServiceProvider::class
in the config/app.php
file.
Middleware List
XssSecurity
Sets XSS Security headers. Can be configured excluded URI-s, etc in the config/lodash.php
.
SimpleBasicAuth
Add simple basic auth to a route.
In the config/auth.php
you have to add:
. . . 'simple' => [ 'enabled' => env('SIMPLE_AUTH_ENABLED', true), 'user' => env('SIMPLE_AUTH_USER', 'user'), 'password' => env('SIMPLE_AUTH_PASS', 'secret'), ], . . .
Blade Directives
For this functional you should add Longman\LaravelLodash\LodashServiceProvider::class
in the config/app.php
file.
Misc
SelfDiagnosis Checks
For using this checks, you have to install the package: laravel-self-diagnosis
Available Disk Space Check
... \Longman\LaravelLodash\SelfDiagnosis\Checks\AvailableDiskSpace::class => [ 'paths' => [ '/' => '100G', // At least 100G should be available for the path "/" '/var/www' => '5G', ], ], ...
Filesystem Disks Are Available
... \Longman\LaravelLodash\SelfDiagnosis\Checks\FilesystemsAreAvailable::class => [ 'disks' => [ 'local', 's3', ], ], ...
Elasticsearch Health Check
... \Longman\LaravelLodash\SelfDiagnosis\Checks\ElasticsearchCanBeAccessed::class => [ 'client' => ElasticSearchClient::class, ], ...
Php Ini Options Check
... \Longman\LaravelLodash\SelfDiagnosis\Checks\PhpIniOptions::class => [ 'options' => [ 'upload_max_filesize' => '>=128M', 'post_max_size' => '>=128M', 'memory_limit' => '>=128M', 'max_input_vars' => '>=10000', 'file_uploads' => '1', 'disable_functions' => '', ], ], ...
Php Ini Options Check
... \Longman\LaravelLodash\SelfDiagnosis\Checks\RedisCanBeAccessed::class => [ 'default_connection' => true, 'connections' => ['sessions'], ], ...
Servers Are Pingable Check
... \Longman\LaravelLodash\SelfDiagnosis\Checks\ServersArePingable::class => [ 'servers' => [ [ 'host' => config('app.url'), 'port' => 80, 'timeout' => 1, ], [ 'host' => 'sqs.eu-west-1.amazonaws.com', 'port' => 443, 'timeout' => 3, ], [ 'host' => 'www.googleapis.com', 'port' => 443, 'timeout' => 3, ], ], ], ...
Horizon is running
... \Longman\LaravelLodash\SelfDiagnosis\Checks\HorizonIsRunning::class, ...
TODO
write more tests and add more features
Troubleshooting
If you like living on the edge, please report any bugs you find on the laravel-lodash issues page.
Contributing
Pull requests are welcome. See CONTRIBUTING.md for information.
License
Please see the LICENSE included in this repository for a full copy of the MIT license, which this project is licensed under.
Credits
Full credit list in Contributors