ldc-ovoteam/app/Providers/RouteServiceProvider.php

89 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Providers;
use App\Contracts\Directories\ProductDirectory;
use App\Contracts\Directories\RecipeDirectory;
use App\Models\Product;
use App\Models\Recipe;
use Domain\Models\Entities\Product as DomainProduct;
use Domain\Models\Entities\Recipe as DomainRecipe;
use Domain\Models\ValueObjects\Entities\ProductId;
use Domain\Models\ValueObjects\Entities\RecipeId;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use Ramsey\Uuid\Uuid;
use Shared\Helpers\UuidHelper;
class RouteServiceProvider extends ServiceProvider
{
/**
* Define your route model bindings, pattern filters, and other route configuration.
*/
public function boot(): void
{
Route::bind('product', function (string $value) {
if (request()->is('back/*') || request()->is('back') || request()->routeIs('back.*')) {
return Product::withTrashed()
->where('id', $value)
->orWhere('slug', $value)
->firstOrFail();
}
return $this->resolveProduct($value);
});
Route::bind('recipe', function (string $value) {
if (request()->is('back/*') || request()->is('back') || request()->routeIs('back.*')) {
return Recipe::withTrashed()
->where('id', $value)
->orWhere('slug', $value)
->firstOrFail();
}
return $this->resolveRecipe($value);
});
}
private function resolveProduct(string $value): DomainProduct
{
$productDirectory = app(ProductDirectory::class);
if (Str::isUuid($value) && UuidHelper::isV7(Uuid::fromString($value))) {
$product = $productDirectory->find(new ProductId(Uuid::fromString($value)));
}
if (! isset($product)) {
$product = $productDirectory->findBySlug($value);
}
if (! isset($product)) {
throw new ModelNotFoundException('Product not found');
}
return $product;
}
private function resolveRecipe(string $value): DomainRecipe
{
$recipeDirectory = app(RecipeDirectory::class);
if (Str::isUuid($value) && UuidHelper::isV7(Uuid::fromString($value))) {
$recipe = $recipeDirectory->find(new RecipeId(Uuid::fromString($value)));
}
if (! isset($recipe)) {
$recipe = $recipeDirectory->findBySlug($value);
}
if (! isset($recipe)) {
throw new ModelNotFoundException('Recipe not found');
}
return $recipe;
}
}