From eb16ad2ad3cc202a3361d648ee26a9483e817db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Tue, 16 Nov 2021 16:00:47 +0100 Subject: [PATCH] Add label filter on products --- app/Http/Controllers/Bo/LabelController.php | 59 +++++++++++++++++++ .../Controllers/Bo/ProductsController.php | 15 +++-- app/Http/Controllers/ProductsController.php | 36 ++++------- app/Http/Requests/StoreLabel.php | 37 ++++++++++++ app/Http/Requests/UpdateLabel.php | 16 +++++ app/Models/Label.php | 30 ++++++++++ app/Models/Products.php | 5 ++ app/Providers/RouteServiceProvider.php | 4 ++ config/refresh-sitemap.php | 4 ++ ...ove_departaimants_column_from_products.php | 34 +++++++++++ .../2021_11_16_124625_create_labels_table.php | 45 ++++++++++++++ resources/sass/app.scss | 4 ++ resources/views/bo/labels/create.blade.php | 25 ++++++++ resources/views/bo/labels/edit.blade.php | 31 ++++++++++ .../views/bo/labels/form-inputs.blade.php | 10 ++++ resources/views/bo/labels/index.blade.php | 41 +++++++++++++ .../views/bo/products/form-inputs.blade.php | 21 ++++--- .../views/front/products/index.blade.php | 34 +++++------ resources/views/layouts/bo.blade.php | 18 +++--- routes/breadcrumbs.php | 4 -- routes/web-bo.php | 3 + routes/web.php | 2 +- 22 files changed, 410 insertions(+), 68 deletions(-) create mode 100644 app/Http/Controllers/Bo/LabelController.php create mode 100644 app/Http/Requests/StoreLabel.php create mode 100644 app/Http/Requests/UpdateLabel.php create mode 100644 app/Models/Label.php create mode 100644 database/migrations/2021_11_16_123701_remove_departaimants_column_from_products.php create mode 100644 database/migrations/2021_11_16_124625_create_labels_table.php create mode 100644 resources/views/bo/labels/create.blade.php create mode 100644 resources/views/bo/labels/edit.blade.php create mode 100644 resources/views/bo/labels/form-inputs.blade.php create mode 100644 resources/views/bo/labels/index.blade.php diff --git a/app/Http/Controllers/Bo/LabelController.php b/app/Http/Controllers/Bo/LabelController.php new file mode 100644 index 00000000..8563c254 --- /dev/null +++ b/app/Http/Controllers/Bo/LabelController.php @@ -0,0 +1,59 @@ +validated()))->saveOrFail(); + return redirect()->route('bo.labels.index'); + } + + // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass + public function edit(Label $label) + { + return view('bo.labels.edit', compact('label')); + } + + public function update(UpdateLabel $request, Label $label) + { + $label->fill($request->validated()); + $label->saveOrFail(); + + return redirect()->route('bo.labels.edit', $label) + ->with('success', trans('Enregistré !')); + } + + public function destroy(Label $label) + { + if ($label->products()->count()) { + return redirect()->route('bo.labels.edit', $label) + ->withErrors([trans('Vous ne pouvez supprimer un types ce label car des produits y sont associés')]); + } + $label->delete(); + + return redirect()->route('bo.labels.index') + ->with('warning', trans('Le contenu à bien été supprimé')); + } +} diff --git a/app/Http/Controllers/Bo/ProductsController.php b/app/Http/Controllers/Bo/ProductsController.php index 6f96c715..f8d53357 100644 --- a/app/Http/Controllers/Bo/ProductsController.php +++ b/app/Http/Controllers/Bo/ProductsController.php @@ -17,6 +17,7 @@ use App\Models\Range; use App\Models\MeatTypes; use App\Models\Recipes; use App\Models\IncoNutritionalValues; +use App\Models\Label; use App\Models\SubRange; use App\Models\XmlInco; use App\Traits\UpdateModelStatus; @@ -68,6 +69,7 @@ class ProductsController extends Controller $ranges = Range::select('id', 'name')->paginate(); $meatTypes = MeatTypes::all(); $consumptionTimes = ConsumptionTimes::select('id', 'name')->paginate(); + $labels = Label::all(); $recipes = Recipes::select('id', 'title')->paginate(); return view('bo.products.create', compact( 'pictosDatas', @@ -75,6 +77,7 @@ class ProductsController extends Controller 'ranges', 'meatTypes', 'consumptionTimes', + 'labels', 'recipes', 'subranges', )); @@ -99,7 +102,7 @@ class ProductsController extends Controller $rangeId = $request->range_id; $meatTypeId = $request->meat_type_id; $consumptionTimesId = $request->consumption_times_id; - $departaimants = $request->departaimants === null ? 0 : 1; + $labelId = (\is_string($request->label_id) and \strlen($request->label_id)) ? $request->label_id : null; $preparationAdvice = $request->preparation_advice; $ingredients = $request->ingredients; $tips = $request->tips; @@ -144,7 +147,7 @@ class ProductsController extends Controller } $p->meat_type_id = $meatTypeId; $p->consumption_times_id = $consumptionTimesId; - $p->departaimants = $departaimants; + $p->label_id = $labelId; $p->preparation_advice = $preparationAdvice; $p->ingredients = $ingredients; $p->tips = $tips; @@ -186,6 +189,7 @@ class ProductsController extends Controller $subranges = SubRange::all(); $ranges = Range::select('id', 'name')->with('subranges')->get(); $meatTypes = MeatTypes::all(); + $labels = Label::all(); $consumptionTimes = ConsumptionTimes::select('id', 'name')->get(); $recipes = Recipes::select('id', 'title')->get(); $pictosSelected = []; @@ -205,6 +209,7 @@ class ProductsController extends Controller 'subranges', 'meatTypes', 'consumptionTimes', + 'labels', 'recipes', )); } @@ -228,7 +233,7 @@ class ProductsController extends Controller $rangeId = $request->range_id; $meatTypeId = $request->meat_type_id; $consumptionTimesId = $request->consumption_times_id; - $departaimants = $request->departaimants === null ? 0 : 1; + $labelId = (\is_string($request->label_id) and \strlen($request->label_id)) ? $request->label_id : null; $preparationAdvice = $request->preparation_advice; $ingredients = $request->ingredients; $tips = $request->tips; @@ -308,7 +313,7 @@ class ProductsController extends Controller } $p->meat_type_id = $meatTypeId; $p->consumption_times_id = $consumptionTimesId; - $p->departaimants = $departaimants; + $p->label_id = $labelId; $p->preparation_advice = $preparationAdvice; $p->ingredients = $ingredients; $p->tips = $tips; @@ -321,7 +326,7 @@ class ProductsController extends Controller } $p->show_rsm = $show_rsm; $p->status = $status; - $p->save(); + $p->saveOrFail(); return redirect()->route('bo.products.edit', $p->id)->with('success', 'Enregistré !'); } diff --git a/app/Http/Controllers/ProductsController.php b/app/Http/Controllers/ProductsController.php index a8cfe398..2d75b12b 100644 --- a/app/Http/Controllers/ProductsController.php +++ b/app/Http/Controllers/ProductsController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Enums\GeneralConfigType; use App\Models\ConsumptionTimes; +use App\Models\Label; use App\Models\ProductSliderPictures; use App\Models\MeatTypes; use App\Models\Products; @@ -20,9 +21,10 @@ class ProductsController extends Controller $productsSlides = ProductSliderPictures::where('status', 1)->orderBy('order', 'ASC')->get(); $meatTypes = MeatTypes::select('name', 'slug')->where('status', 1)->get(); $ct = ConsumptionTimes::select('name', 'slug')->where('status', 1)->get(); + $labels = Label::select('name', 'slug')->where('status', 1)->get(); $ranges = Range::where('status', 1)->with('products:id,range_id,picture')->get(); - return view('front.products.index', compact('productsSlides', 'ranges', 'meatTypes', 'ct')); + return view('front.products.index', compact('productsSlides', 'ranges', 'meatTypes', 'ct', 'labels')); } public function filter(Model $model, SubRange $subrange = null) @@ -32,6 +34,7 @@ class ProductsController extends Controller $ranges = Range::where('status', 1)->get(); $meatTypes = MeatTypes::select('name', 'slug')->where('status', 1)->get(); $ct = ConsumptionTimes::select('name', 'slug')->where('status', 1)->get(); + $labels = Label::select('name', 'slug')->where('status', 1)->get(); $type = explode('/', Route::getCurrentRoute()->uri)[1]; $productsList = null; @@ -72,6 +75,13 @@ class ProductsController extends Controller $title = $consumptionTime->name; $momentConso = true; break; + case 'label': + /** @var \App\Models\Label */ + $label = $model; + $productsList = $label->products->where('status', 1)->sortBy('order'); + $title = $label->name; + $momentConso = true; + break; default: abort(404); break; @@ -85,6 +95,7 @@ class ProductsController extends Controller 'subrange', 'meatTypes', 'ct', + 'labels', 'title', 'gamme', 'typeViande', @@ -92,29 +103,6 @@ class ProductsController extends Controller )); } - public function departaimants() - { - $productsSlides = ProductSliderPictures::where('status', 1)->orderBy('order', 'ASC')->get(); - $ranges = Range::where('status', 1)->get(); - $meatTypes = MeatTypes::select('name', 'slug')->where('status', 1)->get(); - $ct = ConsumptionTimes::select('name', 'slug')->where('status', 1)->get(); - - $productsList = Products::where([['status', 1], ['departaimants', 1]])->get(); - - $departaimants = true; - $title = "Départ'Aimants"; - - return view('front.products.index', compact( - 'productsList', - 'departaimants', - 'productsSlides', - 'ranges', - 'meatTypes', - 'ct', - 'title' - )); - } - public function show(Products $product) { $recipeVideo = $product->recipe()->first(); diff --git a/app/Http/Requests/StoreLabel.php b/app/Http/Requests/StoreLabel.php new file mode 100644 index 00000000..b3d2a707 --- /dev/null +++ b/app/Http/Requests/StoreLabel.php @@ -0,0 +1,37 @@ +status) { + $this->request->add(['status' => false]); + } + $this->request->add(['slug' => Str::slug($this->name)]); + return auth()->check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|min:5|max:50', + 'slug' => 'required|min:1|unique:meat_types,slug', + 'status' => 'required|boolean' + ]; + } +} diff --git a/app/Http/Requests/UpdateLabel.php b/app/Http/Requests/UpdateLabel.php new file mode 100644 index 00000000..9d0f0786 --- /dev/null +++ b/app/Http/Requests/UpdateLabel.php @@ -0,0 +1,16 @@ + 'required|unique:meat_types,slug,' . $this->meat_type->id . '|max:255', + ] + ); + } +} diff --git a/app/Models/Label.php b/app/Models/Label.php new file mode 100644 index 00000000..1dc0476c --- /dev/null +++ b/app/Models/Label.php @@ -0,0 +1,30 @@ +slug = Str::slug($type->name); + }); + static::updating(function ($type) { + $type->slug = Str::slug($type->name); + }); + } + + public function products() + { + return $this->hasMany(Products::class, 'label_id'); + } +} diff --git a/app/Models/Products.php b/app/Models/Products.php index 06216b13..edde277e 100644 --- a/app/Models/Products.php +++ b/app/Models/Products.php @@ -53,6 +53,11 @@ class Products extends Model return $this->belongsTo(MeatTypes::class, 'meat_type_id'); } + public function label() + { + return $this->belongsTo(Label::class, 'label_id'); + } + public function consumptionTimes() { return $this->belongsTo(ConsumptionTimes::class, 'consumption_times_id'); diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index f05f0bd1..422782dc 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -15,6 +15,7 @@ use App\Models\Engagement; use App\Models\FaqQuestions; use App\Models\GeneralConfig; use App\Models\HomeSliderPictures; +use App\Models\Label; use App\Models\MeatTypes; use App\Models\Moments; use App\Models\NewsSliderPictures; @@ -119,6 +120,9 @@ class RouteServiceProvider extends ServiceProvider Route::bind('meat_type', function ($value) { return MeatTypes::where('id', $value)->orWhere('slug', $value)->firstOrFail(); }); + Route::bind('label', function ($value) { + return Label::where('id', $value)->orWhere('slug', $value)->firstOrFail(); + }); Route::bind('ocbbreeder', function ($value) { return OCBBreeder::where('id', $value)->orWhere('slug', $value)->firstOrFail(); }); diff --git a/config/refresh-sitemap.php b/config/refresh-sitemap.php index 3ef23b55..7433ac06 100644 --- a/config/refresh-sitemap.php +++ b/config/refresh-sitemap.php @@ -5,6 +5,7 @@ use App\Enums\EleveurOcbStatus; use App\Models\Articles; use App\Models\BreedingPage; use App\Models\ConsumptionTimes; +use App\Models\Label; use App\Models\MeatTypes; use App\Models\Products; use App\Models\Range; @@ -50,6 +51,9 @@ return [ 'products.meat-type' => [ 'slugMeatType' => [MeatTypes::class, 'slug'] ], + 'products.label' => [ + 'label' => [Label::class, 'slug'] + ], 'club.infos.child' => [ 'articleTag' => [Articles::class, 'type'], 'publishedArticle' => [Articles::class, 'slug'] diff --git a/database/migrations/2021_11_16_123701_remove_departaimants_column_from_products.php b/database/migrations/2021_11_16_123701_remove_departaimants_column_from_products.php new file mode 100644 index 00000000..8f534605 --- /dev/null +++ b/database/migrations/2021_11_16_123701_remove_departaimants_column_from_products.php @@ -0,0 +1,34 @@ +dropColumn('departaimants'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('products', function (Blueprint $table) { + $table->boolean('departaimants') + ->after('number_portion') + ->default(false); + }); + } +} diff --git a/database/migrations/2021_11_16_124625_create_labels_table.php b/database/migrations/2021_11_16_124625_create_labels_table.php new file mode 100644 index 00000000..9475bc9c --- /dev/null +++ b/database/migrations/2021_11_16_124625_create_labels_table.php @@ -0,0 +1,45 @@ +id(); + + $table->string('name', 50); + $table->string('slug', 50)->unique(); + + $table->boolean('status')->default(false); + + $table->timestamps(); + }); + Schema::table('products', function (Blueprint $table) { + $table->foreignId('label_id')->nullable()->after('meat_type_id'); + $table->foreign('label_id')->references('id')->on('labels'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('products', function (Blueprint $table) { + $table->dropForeign(['label_id']); + $table->dropColumn('label_id'); + }); + Schema::dropIfExists('labels'); + } +} diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 8e5f1968..daa09f98 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -27,3 +27,7 @@ $custom-file-text: ( font-size: 0.85rem; } } + +.cursor-default { + cursor: default !important; +} diff --git a/resources/views/bo/labels/create.blade.php b/resources/views/bo/labels/create.blade.php new file mode 100644 index 00000000..4bea6853 --- /dev/null +++ b/resources/views/bo/labels/create.blade.php @@ -0,0 +1,25 @@ +@extends('layouts.bo') + +@section('content') +
+
+ {{ __('Labels')}} + {{ __('Retour') }} +
+ +
+
+ @csrf +
+
+ @include('bo.messages') + @include('bo.labels.form-inputs') +
+ +
+
+
+
+
+
+@endsection diff --git a/resources/views/bo/labels/edit.blade.php b/resources/views/bo/labels/edit.blade.php new file mode 100644 index 00000000..cd6612e1 --- /dev/null +++ b/resources/views/bo/labels/edit.blade.php @@ -0,0 +1,31 @@ +@extends('layouts.bo') + +@section('content') +
+
+ {{ __('Labels') }} + {{ __('Retour') }} +
+ @method('DELETE') + @csrf + +
+
+ +
+
+ @method('PUT') + @csrf +
+
+ @include('bo.messages') + @include('bo.labels.form-inputs') +
+ +
+
+
+
+
+
+@endsection diff --git a/resources/views/bo/labels/form-inputs.blade.php b/resources/views/bo/labels/form-inputs.blade.php new file mode 100644 index 00000000..208d47fb --- /dev/null +++ b/resources/views/bo/labels/form-inputs.blade.php @@ -0,0 +1,10 @@ +
+ + +
+
+ +
diff --git a/resources/views/bo/labels/index.blade.php b/resources/views/bo/labels/index.blade.php new file mode 100644 index 00000000..bba86bcf --- /dev/null +++ b/resources/views/bo/labels/index.blade.php @@ -0,0 +1,41 @@ +@extends('layouts.bo') + +@section('content') +
+
+ {{ __('Label') }} + {{ __('Ajouter') }} +
+ +
+ {{ $labels->withQueryString()->links() }} + + + + + + + + + + @foreach($labels as $type) + + + + + + @endforeach + +
{{ __('Nom') }}{{ __('Publié ?') }}
{{$type->name}} + + @if ($type->status) + + @else + + @endif + + {{ __('Éditer') }}
+ {{ $labels->withQueryString()->links() }} +
+
+@endsection diff --git a/resources/views/bo/products/form-inputs.blade.php b/resources/views/bo/products/form-inputs.blade.php index 56243484..82affc34 100644 --- a/resources/views/bo/products/form-inputs.blade.php +++ b/resources/views/bo/products/form-inputs.blade.php @@ -137,15 +137,18 @@ @endforeach -
- +
+ +
diff --git a/resources/views/front/products/index.blade.php b/resources/views/front/products/index.blade.php index 6878d3de..5c22a6f9 100644 --- a/resources/views/front/products/index.blade.php +++ b/resources/views/front/products/index.blade.php @@ -2,7 +2,7 @@ // This special case is for breadcrumb because this template is used for mutiple routes $routeName = request()->route()->getName(); $brParam = null; -if($routeName != 'products.index' && $routeName != 'products.departaimants') { +if($routeName != 'products.index') { $brParam = $title; $routeName .= '.show'; } @@ -24,8 +24,8 @@ if(isset($typeViande) and $typeViande) { if(isset($momentConso) and $momentConso) { $metatitle = __('Les Produits par moment de consommation : :name', ['name' => $title]); } -if(isset($departaimants) && $departaimants) { - $metatitle = __('Les Produits avec Départ\'aimants'); +if(isset($label) and $label) { + $metatitle = __('Les Produits par label : :name', ['name' => $title]); } if(!$metatitle) { $metatitle = __('Les Produits'); @@ -38,7 +38,7 @@ $description = (isset($gamme) and $gamme) ? __('La gamme ":game", :description', ]) : null; $description = $description ?? ((isset($typeViande) and $typeViande) ? __('Découvrez nos différents produits disponibles sélectionnés par leur type de viande, à base de :name', ['name' => $title]) : null); $description = $description ?? ((isset($momentConso) and $momentConso) ? __('Découvrez nos différents produits disponibles sélectionnés par leurs moments de consommation : :name', ['name' => $title]) : null); -$description = $description ?? ((isset($departaimants) and $departaimants) ? __('Découvrez les différents produits ayant des Départ\'aimants inclus') : null); +$description = $description ?? ((isset($label) and $label) ? __('Découvrez nos différents produits disponibles sélectionnés par leur label : :name', ['name' => $title]) : null); $description = $description ?? __('Découvrez les différents produits en fonction de multiples critères'); $vegetal = (isset($product) && $product->range->slug === "le-vegetal") ? true : false; @@ -104,19 +104,17 @@ $vegetal = ($vegetal || isset($gamme) && $gamme && $gamme->slug === "le-vegetal" @endforeach
-
- @if (isset($departaimants) && $departaimants) - - @else - - @endif - {{ __('Départ\'Aimants') }} - @if (isset($departaimants) && $departaimants) - - @else - - @endif - +
+ + +
@if(isset($gamme) and isset($subranges) and $subranges and count($subranges)) @@ -158,7 +156,7 @@ $vegetal = ($vegetal || isset($gamme) && $gamme && $gamme->slug === "le-vegetal"
@endif @endif - @if (isset($gamme) or isset($departaimants)) + @if (isset($gamme)) @if($vegetal)

Découvrez les produits Le Gaulois Végétal : du végétal sans concession avec des produits SANS VIANDE, 100% GOURMANDS, élaborés EN FRANCE à partir de soja SANS OGM.
diff --git a/resources/views/layouts/bo.blade.php b/resources/views/layouts/bo.blade.php index ed6d118b..d3450b40 100644 --- a/resources/views/layouts/bo.blade.php +++ b/resources/views/layouts/bo.blade.php @@ -173,21 +173,25 @@ {{-- Les recettes --}} diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 85a701d9..dd89ae68 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -70,10 +70,6 @@ Breadcrumbs::for('products.consumption-times.show', function (Generator $trail, $trail->parent('products.consumption-times'); $trail->push(ucfirst($slugConsumptionTime), route('products.consumption-times', compact('slugConsumptionTime'))); }); -Breadcrumbs::for('products.departaimants', function (Generator $trail) { - $trail->parent('products.index'); - $trail->push(__('Départaimants'), route('products.departaimants')); -}); Breadcrumbs::for('product.show', function (Generator $trail, Products $product) { $trail->parent('products.index'); $trail->push($product->name, route('product.show', compact('product'))); diff --git a/routes/web-bo.php b/routes/web-bo.php index ae84437c..a310d828 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -16,6 +16,7 @@ use App\Http\Controllers\Bo\GeneralConfig; use App\Http\Controllers\Bo\NutritionPageController; use App\Http\Controllers\Bo\HomeSliderPicturesController; use App\Http\Controllers\Bo\JoinusController; +use App\Http\Controllers\Bo\LabelController; use App\Http\Controllers\Bo\MeatTypesController; use App\Http\Controllers\Bo\MomentsController; use App\Http\Controllers\Bo\NewsSliderPicturesController; @@ -61,6 +62,7 @@ Route::prefix('bo') Route::resource('faq-themes', FaqThemesController::class)->except(['show']); Route::resource('home-slider-pictures', HomeSliderPicturesController::class)->except(['show']); Route::resource('meat-types', MeatTypesController::class)->except(['show']); + Route::resource('labels', LabelController::class)->except(['show']); Route::resource('moments', MomentsController::class)->except(['show']) ->withoutMiddleware('xss') ->middleware('xss:strates,featured_text'); @@ -127,6 +129,7 @@ Route::prefix('bo') Route::get('/moments/change-published/{moment}', [MomentsController::class, 'changePublished'])->name('moments.change-published'); Route::get('/consumption-times/change-published/{consumptiontime}', [ConsumptionTimesController::class, 'changePublished'])->name('consumption-times.change-published'); Route::get('/meat-types/change-published/{meat_type}', [MeatTypesController::class, 'changePublished'])->name('meat-types.change-published'); + Route::get('/labels/change-published/{label}', [LabelController::class, 'changePublished'])->name('labels.change-published'); Route::get('/ads/change-published/{ad}', [AdsController::class, 'changePublished'])->name('ads.change-published'); Route::get('/home-slider-pictures/change-published/{homeslider}', [HomeSliderPicturesController::class, 'changePublished'])->name('home-slider-pictures.change-published'); Route::get('/news-slider-pictures/change-published/{newsslider}', [NewsSliderPicturesController::class, 'changePublished'])->name('news-slider-pictures.change-published'); diff --git a/routes/web.php b/routes/web.php index faf4e8cb..8ddc6be5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -61,11 +61,11 @@ Route::prefix('/produits') ->name('products.') ->group(function () { Route::get('/', [ProductsController::class, 'index'])->name('index'); - Route::get('/departaimants', [ProductsController::class, 'departaimants'])->name('departaimants'); Route::get('/gamme/{slugRange}/{subRange?}', [ProductsController::class, 'filter'])->name('range'); Route::get('/moment-consommations/{slugConsumptionTime}', [ProductsController::class, 'filter']) ->name('consumption-times'); Route::get('/type-viande/{slugMeatType}', [ProductsController::class, 'filter'])->name('meat-type'); + Route::get('/label/{label}', [ProductsController::class, 'filter'])->name('label'); }); Route::prefix('/produit')