Как создать URL-адрес трехуровневой категории в Laravel - PullRequest
0 голосов
/ 13 июля 2020

Я создаю один проект в Laravel, в котором есть 3 уровня глубокой структуры категорий.

например: одежда -> мужчины -> футболки

Итак, я хотите URL-адрес для этой структуры категории, такой как одежда / мужчины / футболки /

структура базы данных:

id name     parent
1  clothes  0
2  men      1
3  t-shirts 2

Я не могу создать URL-адрес этой структуры категории.

Маршрут для страницы категории:

Route::get('/categories/{slug?}/{sub?}', 'FrontController@showCategories')

Я новичок в Laravel, поэтому не знаю другого пути

public function showCategories($slug = '', $sub = ''){

        $link = '';

        if(empty($slug)){
            $parent = 0;
        }else{

            $category = Category::first()->where('slug', $slug)->pluck('id');
            
            $parent = $category[0];
            
            if(!empty($sub)){

                $category = Category::first()->where('slug', $sub)->pluck('id');
            
                $parent = $category[0];
            }
        
        }

        $categories = Category::all()->where('parent', $parent);

        return view('front.categories', compact('categories'));
    }

Laravel версия 6.2

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Насколько я понимаю, вы хотите знать, как создать URL-ссылку для этих категорий на странице просмотра.

Дайте вашему маршруту имя

Route::get('/catalog/{category?}/{sub_category?}/{sub_sub_category?}', 'FrontController@showCategories')->name('categories.slug.sub');

И в просмотр страницы при условии (view.blade. php)

<a href="{{ route('categories.slug.sub') }}"> All Catergories </a>
<a href="{{ route('categories.slug.sub', ["category"=>"clothes"]) }}"> Clothes </a>
<a href="{{ route('categories.slug.sub', ["category"=>"clothes", "sub_category"=>"men"]) }}">Men</a>
<a href="{{ route('categories.slug.sub', ["category"=>"clothes", "sub_category"=>"men", "sub_sub_category"=>"t-shirt"]) }}"> T-shirt </a>
0 голосов
/ 13 июля 2020

1-й вариант: Я думаю, вам нужно создать часть root для вашего URL-адреса. Например, /catalog/, тогда ваш маршрут будет примерно таким:

Route::get('/catalog/', 'GoodsController@index');

После, где есть два способа создания ваших маршрутов:

  1. ( На мой взгляд, это плохой способ) Добавьте дополнительные параметры для каждой категории глубины:

Route::get('/catalog/{category?}/{sub_category?}/{sub_sub_category?}..etc', 'CatalogController@index');

И работайте с ним в вашем контроллере.

Есть ли у вас необязательный параметр, например путь к категориям:

Route::get('/catalog/{categories_path?}', 'CatalogController@index');

Затем в вашем контроллере вы можете проанализировать этот путь с помощью функции explode, например:

// CatalogController.php
    public function index(string $categories_path)
    {
        $categories = explode('/', $categories_path);
        if (!is_array($categories)) {
            $goods = Goods::all(); //if no category get
            return view('catalog', compact('goods')); //return all goods
        }
        $activeCategory = array_pop($categories); //get the last category from path
        // do anything with active category
        // $category = Category::whereSlug($activeCategory)->first(); // or something else
    }

ПРИМЕЧАНИЕ: Обратите внимание, array_pop изменяет ваш массив. Дополнительная информация: https://www.php.net/manual/en/function.array-pop.php

2-й вариант: если вы не хотите иметь часть URL-адреса catalog root, вам необходимо сделать это вручную с помощью регулярного выражения:

Route::get('/{category}/{categories_path?}', 'GoodsController@index')->where('category', '[clothes|shoes|bags]+');

Ссылки: https://laravel.com/docs/7.x/routing#parameters -regular-expression-constraints https://laravel.com/docs/7.x/routing#parameters -optional- параметры

Если я не правильно понял ваш вопрос, дайте мне знать, я изменяю свой ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...