- Notifications
You must be signed in to change notification settings - Fork10
Extra useful functional for Laravel
License
akalongman/laravel-lodash
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
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.
- 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
Install this package throughComposer.
Run a command in your command line:
composer require longman/laravel-lodashAddLodashServiceProvider to your service providers list in theapp.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"AddLongman\LaravelLodash\Debug\DebugServiceProvider::class in toconfig/app.phpand specify debug IP's in yourconfig/lodash.php config file:
. ..'debug' => ['ips' => [// IP list for enabling debug mode//'127.0.0.1', ], ], .. .
Sometimes we need to know who created, updated or deleted entry in the database.
For this just addLongman\LaravelLodash\Eloquent\UserIdentities trait to your model and alsoupdate migration file adding necessary columns:
$table->unsignedInteger('created_by')->nullable();$table->unsignedInteger('updated_by')->nullable();$table->unsignedInteger('deleted_by')->nullable();
For this just addLongman\LaravelLodash\Eloquent\UuidAsPrimary trait to your model and alsoupdate related migration file:
$table->uuid('id')->primary();
Also there is possible to specify uuid version via defininguuidVersion property in the model class.
Eager load many to many relations with limit via subquery or union.For using this feature, addLongman\LaravelLodash\Eloquent\ManyToManyPreload trait to the models.After that you can use methodslimitPerGroupViaUnion() andlimitPerGroupViaSubQuery().For example you want to select users and 3 related user photos per user.
$items = (newUser)->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.
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 connectionand you have to use LaravelLodash implementation for this.
First of all, make sure you enabled PhpRedis driver by this guidehttps://laravel.com/docs/5.5/redis#phpredis
After that include Cache and Redis service providers in theapp.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 yourdatabase.php underconfig folder:
Also, you can specify other options likescan or etc. Seehttps://github.com/phpredis/phpredis#setoption
PhpRedis extension along with native Redis Cluster, also supportsclient-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), ],. .. ], ], ], .. .
Laravel by default does not supports AWS FIFO queues and this package fixes it.
You have to addQueueServiceProvider service provider in theapp.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 thequeue.php underconfig 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, ], ], .. .
First of all you have to install official elasticsearch php sdk:
composer require elasticsearch/elasticsearchAfter addElasticsearchServiceProvider service provider in theapp.php before your App providers:
. ..Longman\LaravelLodash\Elasticsearch\ElasticsearchServiceProvider::class, .. .
Now you can add the configuration in theservices.php underconfig 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 andimplementElasticsearchQueryContract and you can pass object toperformSearch method
$elasticsearch_manager =app(ElasticsearchManagerContract::class);$results =$elasticsearch_manager->performSearch($query);
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 scriptComposerScripts::createPackageHash:
. . ."post-autoload-dump": ["Longman\\LaravelLodash\\Composer\\ComposerScripts::createPackageHash",. . . ],. . .
And in theAppServiceProvider::boot add these lines:
. ..if (config('app.debug')) {$checker =newComposerChecker(base_path());$checker->checkHash(); }. ..
| Function | Description |
|---|---|
p(...$values): void | Add debug messages to the debugbar |
get_db_query(): ?string | Get last executed database query |
get_db_queries(): ?array | Get all executed database queries |
For this fuctional you should addLongman\LaravelLodash\LodashServiceProvider::class in theconfig/app.php file.
There is an extended classes via Laravel's builtin macros functionality
| Method | Description |
|---|---|
getInt(string $name, int $default = 0): int | Return request field value as a integer |
getBool(string $name, bool $default = false): bool | Return request field value as a boolean |
getFloat(string $name, float $default = 0): float | Return request field value as a float |
getString(string $name, string $default = ''): string | Return request field value as a string |
For this fuctional you should addLongman\LaravelLodash\LodashServiceProvider::class in theconfig/app.php file.
| Command | Description |
|---|---|
php artisan clear-all | Clear entire cache and all cached routes, views, etc. |
php artisan db:clear | Drop all tables from database. Options: --database= : The database connection to use. --force : Force the operation to run when in production. --pretend : Dump the SQL queries that would be run. |
php artisan db:dump | Dump database to sql file using mysqldump CLI utility. Options: --database= : The database connection to use. --path= : Folder path for store database dump files. |
php artisan db:restore {file} | Restore database from sql file using mysqldump CLI utility. Options: --database= : The database connection to use. --force : Force the operation to run when in production |
php artisan log:clear | Clear log files fromstorage/logs recursively. Options:--force : Force the operation to run when in production. |
php artisan user:add {email} {password?} | Create a new user. Options: --guard= : The guard to use. |
php artisan user:password {email} {password?} | Update/reset user password. Options: --guard= : The guard to use. |
Sets XSS Security headers. Can be configured excluded URI-s, etc in theconfig/lodash.php .
Add simple basic auth to a route.
In theconfig/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'), ], . . .
For this functional you should addLongman\LaravelLodash\LodashServiceProvider::class in theconfig/app.php file.
| Directive | Description |
|---|---|
@datetime($date); | Display relative time. Example:$date = Carbon\Carbon::now();@datetime($date); |
@plural($count, $word) | Pluralization helper. Example:@plural(count($posts), 'post')Produces '1 post' or '2 posts', depending on how many items in $posts there are |
For using this checks, you have to install the package:laravel-self-diagnosis
...\Longman\LaravelLodash\SelfDiagnosis\Checks\AvailableDiskSpace::class => ['paths' => ['/' =>'100G',// At least 100G should be available for the path "/"'/var/www' =>'5G', ],],...
...\Longman\LaravelLodash\SelfDiagnosis\Checks\FilesystemsAreAvailable::class => ['disks' => ['local','s3', ],],...
...\Longman\LaravelLodash\SelfDiagnosis\Checks\ElasticsearchCanBeAccessed::class => ['client' => ElasticSearchClient::class,],...
...\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' =>'', ],],...
...\Longman\LaravelLodash\SelfDiagnosis\Checks\RedisCanBeAccessed::class => ['default_connection' =>true,'connections' => ['sessions'],],...
...\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, ], ],],...
...\Longman\LaravelLodash\SelfDiagnosis\Checks\HorizonIsRunning::class,...
write more tests and add more features
If you like living on the edge, please report any bugs you find on thelaravel-lodash issues page.
Pull requests are welcome.SeeCONTRIBUTING.md for information.
Please see theLICENSE included in this repository for a full copy of the MIT license,which this project is licensed under.
Full credit list inContributors
About
Extra useful functional for Laravel
Topics
Resources
License
Code of conduct
Contributing
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors7
Uh oh!
There was an error while loading.Please reload this page.