ldc-boutique-cnc-sable/app/Providers/AppServiceProvider.php
Jérémy Munsch 98e580d327
refactor(tags): implement CRUD actions for tags
- Added CreateTag, UpdateTag, and DeleteTag actions.
- Introduced CreateTagInput and UpdateTagInput for input validation.
- Implemented ActionExecutor for executing actions with logging.
- Added tests for all new actions and input validation.
2026-10-27 09:58:30 +01:00

178 lines
5.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Providers;
use App\Contracts\ActionExecutor;
use App\Contracts\Directories\CustomerDirectory;
use App\Contracts\Directories\EmployeeDirectory;
use App\Contracts\Directories\OrderDirectory;
use App\Contracts\Directories\ProductDirectory;
use App\Contracts\Repositories\EmployeeRepository;
use App\Contracts\Repositories\OrderRepository;
use App\Contracts\Repositories\UserRepository;
use App\Directories\EloquentCustomerDirectory;
use App\Directories\EloquentEmployeeDirectory;
use App\Directories\EloquentOrderDirectory;
use App\Directories\EloquentProductDirectory;
use App\Repositories\EloquentEmployeeRepository;
use App\Repositories\EloquentOrderRepository;
use App\Repositories\EloquentUserRepository;
use App\Services\ActionExecutorService;
use Domain\Models\ValueObjects\Pagination;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Vite;
use Illuminate\Support\ServiceProvider;
use Mews\Purifier\Purifier;
use Shared\DDD\Equatable;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
#[\Override]
public function register()
{
$this->app->singleton(
Purifier::class,
fn () => resolve('purifier')
);
$this->app->singleton('clientIp', function () {
return request()->ip() ?? request()->getClientIp();
});
$this->app->bind(EmployeeRepository::class, EloquentEmployeeRepository::class);
$this->app->bind(OrderRepository::class, EloquentOrderRepository::class);
$this->app->bind(UserRepository::class, EloquentUserRepository::class);
$this->app->bind(CustomerDirectory::class, EloquentCustomerDirectory::class);
$this->app->bind(EmployeeDirectory::class, EloquentEmployeeDirectory::class);
$this->app->bind(OrderDirectory::class, EloquentOrderDirectory::class);
$this->app->bind(ProductDirectory::class, EloquentProductDirectory::class);
$this->app->bind(ActionExecutor::class, ActionExecutorService::class);
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->laravelGlobalSetup();
$this->dateSetup();
$this->dateMacro();
$this->requestMacro();
$this->collectionMacro();
}
private function laravelGlobalSetup(): void
{
Model::shouldBeStrict(app()->environment('local'));
Vite::useCspNonce();
URL::forceScheme('https');
}
private function dateSetup(): void
{
foreach ([\LC_TIME, \LC_MESSAGES, \LC_COLLATE, \LC_CTYPE, \LC_MONETARY] as $constant) {
setlocale(
$constant,
sprintf(
'%s_%s.UTF-8',
config()->string('app.locale'),
strtoupper(config()->string('app.locale'))
)
);
}
Date::setLocale(config()->string('app.locale'));
Date::setFallbackLocale(config()->string('app.fallback_locale'));
}
private function dateMacro(): void
{
Date::macro('toLocalInput', function ($date) {
if (! $date) {
return null;
}
$timezone = request()->string(
'client_timezone',
request()->string(
'client_timezone',
'Europe/Paris'
)->value()
)->value();
return Date::parse($date)
->setTimezone($timezone)
->format('Y-m-d\TH:i');
});
Date::macro('forHumans', function ($date) {
if (! $date) {
return null;
}
$timezone = request()->string(
'client_timezone',
request()->string(
'client_timezone',
'Europe/Paris'
)->value()
)->value();
return Date::parse($date)
->setTimezone($timezone)
->isoFormat('ddd DD/MM/Y \à HH:mm');
});
}
private function requestMacro(): void
{
Request::macro('pagination', function (int $defaultPageSize = 25): Pagination {
if ($this->has('offset') || $this->has('limit')) {
return Pagination::ofOffsetAndLimit(
$this->integer('offset', 0),
$this->integer('limit', $defaultPageSize)
);
}
return Pagination::ofPage(
$this->integer('page', 1),
$this->integer(
'per_page',
// * Default laravel paginator name
$this->integer('pagination', $defaultPageSize)
)
);
});
}
private function collectionMacro(): void
{
Collection::macro('uniqueValues', function () {
return $this->unique(function ($item) {
if ($item instanceof Equatable) {
return $item instanceof \Stringable ? (string) $item : json_encode($item);
}
if ($item instanceof \Stringable) {
return (string) $item;
}
return $item;
});
});
}
}