andre1502 / net_utilities
Library to combine common function
Requires
- php: ^8.0|^8.1|^8.2|^8.3
- guzzlehttp/guzzle: ^7.8.1
- illuminate/support: ^9|^10|^11
- lcobucci/clock: ^3.2
- lcobucci/jwt: ^4.3|^5.3
- symfony/http-foundation: ^6.3|^6.4|^7.0|^7.1
Requires (Dev)
- nunomaduro/collision: ^8.1.1
- pestphp/pest: ^2.34.7
- pestphp/pest-plugin-laravel: ^2.4
README
Library to help faster initialization Laravel project which include common functions, lang, exceptions, middleware, and routes.
Installation
Run this script from command line inside project folder
composer require andre1502/net_utilities composer install
Package will do auto publish for Lang data, to publish package config you can run this script from command line inside project folder
php artisan net-utilities:publish
Most of the config data can be overriden from project .env
.
Config value
<?php return [ "log_channel" => env("NET_UTILITIES_HTTP_REQUEST_LOG_CHANNEL", "RequestAPI"), "timeout" => env("NET_UTILITIES_HTTP_REQUEST_TIMEOUT", 60), "retry" => env("NET_UTILITIES_HTTP_REQUEST_RETRY_COUNT", 3), "retry_interval_ms" => env("NET_UTILITIES_HTTP_REQUEST_RETRY_INTERVAL_MS", 300), "timezone" => env("NET_UTILITIES_TIMEZONE", env("TIME_ZONE", "UTC")), "locale" => env("NET_UTILITIES_LOCALE", "en-US"), "date_format" => env("NET_UTILITIES_DATE_FORMAT", "Y-m-d"), "datetime_format" => env("NET_UTILITIES_DATETIME_FORMAT", "Y-m-d H:i:s"), "duration_format" => env("NET_UTILITIES_DURATION_FORMAT", "%H:%I:%S"), "decimal_precision" => env("NET_UTILITIES_DECIMAL_PRECISION", env("DECIMAL_PRECISION", 2)), "monthly_limit" => env("NET_UTILITIES_MONTHLY_LIMIT", env("MONTHLY_LIMIT", 6)), "db_trans_retry" => env("NET_UTILITIES_DB_TRANS_RETRY", env("DB_TRANS_RETRY", 5)), "page_size" => env("NET_UTILITIES_PAGE_SIZE", env("PAGE_SIZE", 20)), "apis" => [ "check_jwt" => sprintf("%s/%s", env("NET_UTILITIES_CHECK_JWT_API_URL", ""), env("NET_UTILITIES_CHECK_JWT_API_PATH", "")), ], "internal_api_auth" => [ "header" => env("NET_UTILITIES_INTERNAL_API_HEADER", env("INTERNAL_API_HEADER", "")), "token" => env("NET_UTILITIES_INTERNAL_API_TOKEN", env("INTERNAL_API_TOKEN", "")), ], "basic_auth" => [ "username" => env("NET_UTILITIES_DASHBOARD_BASIC_AUTH_USERNAME", env("DASHBOARD_BASIC_AUTH_USERNAME", "admin")), "password" => env("NET_UTILITIES_DASHBOARD_BASIC_AUTH_PASSWORD", env("DASHBOARD_BASIC_AUTH_PASSWORD", "123456")), "allowed_ip" => env("NET_UTILITIES_DASHBOARD_ALLOWED_IP", env("DASHBOARD_ALLOWED_IP", "127.0.0.1")), ], "jwt_auth" => [ "default" => [ "secret" => env("NET_UTILITIES_JWT_SECRET", env("JWT_SECRET", "")), "ttl" => env("NET_UTILITIES_JWT_TTL", env("JWT_TTL", 20160)), // in minutes ], "check_jwt" => [ "secret" => env("NET_UTILITIES_CHECK_JWT_SECRET", env("JWT_SECRET", "")), ], ], "redis_keys" => [ "check_jwt" => "jwt_token:[user]", ], "redis" => [ "check_jwt_redis" => [ "name" => env("NET_UTILITIES_CHECK_JWT_REDIS", "check_jwt_redis"), "databases" => [ "default" => env("NET_UTILITIES_CHECK_JWT_REDIS_DATABASE_DEFAULT", 0), "cache" => env("NET_UTILITIES_CHECK_JWT_REDIS_DATABASE_CACHE", 1), ], "queue_setting" => [ "enabled" => env("NET_UTILITIES_CHECK_JWT_REDIS_QUEUE_ENABLED", false), "queue" => env("NET_UTILITIES_CHECK_JWT_REDIS_QUEUE", "default"), "retry_after" => env("NET_UTILITIES_CHECK_JWT_REDIS_QUEUE_RETRY_AFTER", 90), "block_for" => env("NET_UTILITIES_CHECK_JWT_REDIS_QUEUE_BLOCK_FOR", null), "after_commit" => env("NET_UTILITIES_CHECK_JWT_REDIS_QUEUE_AFTER_COMMIT", false), ], "client" => env("NET_UTILITIES_CHECK_JWT_REDIS_CLIENT", "phpredis"), "cluster" => env("NET_UTILITIES_CHECK_JWT_REDIS_CLUSTER", false), "url" => env("NET_UTILITIES_CHECK_JWT_REDIS_URL", ""), "host" => env("NET_UTILITIES_CHECK_JWT_REDIS_HOST", "127.0.0.1"), "username" => env("NET_UTILITIES_CHECK_JWT_REDIS_USERNAME", ""), "password" => env("NET_UTILITIES_CHECK_JWT_REDIS_PASSWORD", ""), "port" => env("NET_UTILITIES_CHECK_JWT_REDIS_PORT", "6379"), "persistent" => env("NET_UTILITIES_CHECK_JWT_REDIS_PERSISTENT", false), // Enable persistent connection "options" => [ "cluster" => env("NET_UTILITIES_CHECK_JWT_REDIS_CLUSTER", "redis"), "prefix" => env("NET_UTILITIES_CHECK_JWT_REDIS_PREFIX", "jwt_redis:"), ], ], ], ];
JWT
To generate jwt key:
php artisan net-utilities:jwt-key
To generate jwt key and overwrite existing:
php artisan net-utilities:jwt-key --force
To display current jwt key:
php artisan net-utilities:jwt-key --show
Usage
Functions
Functions are added as Traits for easy to use (without needed to add dependency injection inside constructor).
Consists of:
-
ConfigTrait
-
UtilsTrait
-
HttpRequestTrait
-
Commands Trait:
- PrependsEnvironmentTrait
- PrependsOutputTrait
- PrependsTimestampTrait
Commands Trait are useful to include inside Laravel Console Commands to make logging more richer.
You can use Traits directly inside Laravel class, e.g.:
... use Andre1502\NetUtilities\Traits\Config; ... class TestCall extends Command { use Config; ... public function handle() { $this->info("configName: {$this->configName}"); } }
Lang
Inside Laravel package also possible to include locales translation files which can be used inside package or Laravel project itself.
To access this translation:
... use Andre1502\NetUtilities\Traits\Config; ... class TestCall extends Command { use Config; ... public function handle() { $this->info(__("{$this->configName}::remark.SUCCESS")); } }
Exceptions
Exceptions are used to write log and shape the error output to user. Better to also include Response from Symfony to use standard Http Status code.
public function __construct( int $httpStatus, // API http status ?string $errorCode, // error code which follow translation key array $args = [], // additional data when write to log. array $params = [], // to include data inside translation key (refer to $errorCode). ?string $logChannel = null // to write into different log channel. )
... use Symfony\Component\HttpFoundation\Response; use Andre1502\NetUtilities\Exceptions\APIErrorException; ... class Testing { ... public function tester() : void { throw new APIErrorException(Response::HTTP_BAD_REQUEST, "example error"); } }
Middleware
Package will automatically iclude common middleware which need to have,
- APICheckJWT
- APICheckAuthToken
- APIResponseFormat
- DashboardBasicAuth
APICheckJWT && RedisCheckJWT
This middleware are used to authenticate user JWT to centralized API, it will return user data.
Package will automatically register to middleware kernel as apiCheckJwt
and redisCheckJwt
.
You can use it inside route api
:
... use Illuminate\Support\Facades\Route; ... Route::post('/test', 'testApi')->middleware("apiCheckJwt")->name('test'); Route::post('/test1', 'testApi')->middleware("redisCheckJwt")->name('test1'); ...
You also need to setup .env
file for this key:
NET_UTILITIES_CHECK_JWT_API_URL= NET_UTILITIES_CHECK_JWT_API_PATH=
APICheckAuthToken
This middleware are used to authenticate internal API call.
Package will automatically register to middleware kernel as apiCheckAuthToken
.
You can use it inside route api
:
... use Illuminate\Support\Facades\Route; ... Route::post('test', 'testApi')->middleware("apiCheckAuthToken")->name('test'); ...
APIResponseFormat
This middleware are used to custom format API response globaly.
Package will automatically register to middleware kernel group for api
.
DashboardBasicAuth
This middleware are used to create basic authentication to access package dashboard with authentication.
Package will automatically register to middleware kernel as dashboardBasicAuth
.
You also need to setup .env
file for this key:
NET_UTILITIES_DASHBOARD_BASIC_AUTH_USERNAME= NET_UTILITIES_DASHBOARD_BASIC_AUTH_PASSWORD= NET_UTILITIES_DASHBOARD_ALLOWED_IP=
or
DASHBOARD_BASIC_AUTH_USERNAME= DASHBOARD_BASIC_AUTH_PASSWORD= DASHBOARD_ALLOWED_IP=
Allowed IP also support more than one IP, you can separate it with comma, e.g.:
DASHBOARD_ALLOWED_IP=127.0.0.1,192.168.1.1
Routes
System will register common route for check whether project has been deployed correctly (health-check) and console route to help clean log remotely.
Package also automatically register the routes, so no additional action need to do.