ldc-ovoteam/app/Providers/AppServiceProvider.php

163 lines
5.6 KiB
PHP
Raw Permalink Normal View History

<?php
declare(strict_types=1);
namespace App\Providers;
use App\Contracts\Directories\ProductDirectory;
use App\Contracts\Directories\RecipeDirectory;
use App\Directories\EloquentProductDirectory;
use App\Directories\EloquentRecipeDirectory;
use App\Enums\Contact\ActivitySectorEnum;
use App\Enums\Contact\ObjectEnum;
use App\Services\AdminAuthService;
use Domain\Models\ValueObjects\Pagination;
use Domain\Models\ValueObjects\Products\BreedingMethod;
use Domain\Models\ValueObjects\Products\Business;
use Domain\Models\ValueObjects\Products\ProductCategory;
use Domain\Models\ValueObjects\Products\ProductFormat;
use Domain\Models\ValueObjects\Products\Technology;
use Domain\Models\ValueObjects\Recipes\ConsumptionTime;
use Domain\Models\ValueObjects\Recipes\Inspiration;
use Domain\Models\ValueObjects\Recipes\Season;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Date;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Vite;
use Illuminate\Support\ServiceProvider;
use Uwil\LaravelBackend\Support\ModelListRegistry;
use Uwil\LaravelCommon\Support\InertiaSharedRegistry;
use Uwil\LaravelDynamicPages\Enums\PageStatusEnum;
use Uwil\LaravelDynamicPages\Models\DynamicPage;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton(
AdminAuthService::class,
function () {
$guard = Auth::guard('backend');
return new AdminAuthService($guard);
}
);
$this->app->singleton(
ProductDirectory::class,
fn () => new EloquentProductDirectory()
);
$this->app->singleton(
RecipeDirectory::class,
fn () => new EloquentRecipeDirectory()
);
$this->requestMacro();
}
public function boot(): void
{
$this->dateSetup();
$this->laravelGlobalSetup();
$this->registerSharedInertiaProps();
$this->registerModelsInBackendRegistry();
}
private function laravelGlobalSetup(): void
{
Model::shouldBeStrict(app()->environment('local'));
Vite::useCspNonce();
URL::forceScheme('https');
}
private function registerSharedInertiaProps(): void
{
InertiaSharedRegistry::add('dynamicPages', function (): array {
if (! Schema::hasTable('dynamic_pages')) {
return [];
}
$dynamicPageModels = DynamicPage::getModelsCached()
->where('status', PageStatusEnum::published);
$dynamicPages = [];
foreach ($dynamicPageModels as $dynamicPageModel) {
$pascalCase = str_replace(' ', '', ucwords(str_replace('-', ' ', $dynamicPageModel->id_key)));
$dynamicPages["page{$pascalCase}"] = $dynamicPageModel;
}
return $dynamicPages;
});
InertiaSharedRegistry::add('activitySectorEnum', fn () => ActivitySectorEnum::toArray());
InertiaSharedRegistry::add('objectEnum', fn () => ObjectEnum::toArray());
InertiaSharedRegistry::add('breedingMethodEnum', fn () => BreedingMethod::toArray());
InertiaSharedRegistry::add('businessEnum', fn () => Business::toArray());
InertiaSharedRegistry::add('productCategoryEnum', fn () => ProductCategory::toArray());
InertiaSharedRegistry::add('productFormatEnum', fn () => ProductFormat::toArray());
InertiaSharedRegistry::add('technologyEnum', fn () => Technology::toArray());
InertiaSharedRegistry::add('consumptionTimeEnum', fn () => ConsumptionTime::toArray());
InertiaSharedRegistry::add('inspirationEnum', fn () => Inspiration::toArray());
InertiaSharedRegistry::add('seasonEnum', fn () => Season::toArray());
}
private function registerModelsInBackendRegistry(): void
{
ModelListRegistry::add(
2,
'products',
trans_choice('models.classes.product', 1),
'name',
);
ModelListRegistry::add(
3,
'recipes',
trans_choice('models.classes.recipe', 1),
'name',
);
}
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 requestMacro(): void
{
Request::macro('pagination', function (int $defaultPageSize = 25): Pagination {
/** @var \Illuminate\Http\Request $this */
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)
)
);
});
}
}