2016-06-20 2 views
1

Прежде всего, у меня есть Статья модель и статьи таблица в базе данных. Каждая статья может быть показана с использованием стандартной структуры URI Laravel: www.example.com/articles/5 (где 5 статья id.). Каждая статья имеет пробкового поля (пробкового колонка в статьях таблицы), так и с Route Model Binding легко изменить это и есть слизняк вместо идентификатора в URI:SEO дружественных URL-адресов с категорией/подкатегориями/статьей slug? [Laravel]

В RouteServiceProvider.php Я просто добавил:

public function boot(Router $router) 
{ 
    parent::boot($router); 

    \Route::bind('articles', function($slug) { 
     return \App\Article::where('slug', $slug)->firstOrFail(); 
    }); 
} 

... и теперь я могу открыть статьи с: www.example.com/articles/this-is-some-slug.

С другой стороны, каждый товар относится к одной категории. Например, допустим, что существуют следующие категории:

  • Политика
  • Спорт
    • Футбол
    • Теннис
      • ATP
      • WTA
  • Культура

Я создал эти категории с помощью Baum (реализацию в Вложенные Установить шаблон для Laravel 5'-красноречивые в ОРМ). Таким образом, существует Category модель и categories таблицы в базе данных:

 $table->increments('id'); 
     $table->string('name'); 

     $table->integer('parent_id')->nullable(); 
     $table->integer('lft')->nullable(); 
     $table->integer('rgt')->nullable(); 
     $table->integer('depth')->nullable(); 

     $table->timestamps(); 

Конечно, в articles таблице есть столбец category_id из Один-ко-многим отношения (одна статья принадлежит к одной категории, одного Категория может иметь много статей).

Все статьи, относящиеся к какой-либо категории, могут отображаться по адресу: www.example.com/articles/category/1 (где 1 - это id). Если мы добавим slug столбца в категории стола & набор маршрут Модели Binding:

\Route::bind('category', function($slug) { 
     return \App\Category::where('slug', $slug)->firstOrFail(); 
    }); 

, то мы будем использовать слизняк вместо ID: www.example.com/articles/category/politics (это будет отображать все изделия, относящиеся к категории политики).

Но я хотел бы иметь идентификаторы URI со следующей структурой:

  • www.example.com/sport/tennis/wta/article_slug (/ категория/подкатегория/подкатегорию/article_slug)
  • www.example.com/politics/article_slug (/ категория/article_slug)

и так далее ...

Проблема в том, что я понятия не имею, как это сделать с Laravel. Возможно ли это? Как бы вы решили эту проблему?

Заранее благодарим за мой плохой английский.

SEO дружественные URL-адреса с категорией/подкатегориями/статьей slug?

ответ

2

Чтобы создать URL-адрес, который является example.com/category/subcategory/article, довольно прост, но вы, очевидно, хотите добавить сложность нескольких подкатегорий. Для этого нам нужно посмотреть route parameter regex constraints.

Использование регулярного выражения в ваших параметрах параметров маршрута позволяет получить подкатегории в виде строки, например. subcategory1/subcategory2, а затем передать его через другое пользовательское связывание или непосредственно на ваш контроллер.

Вот пример маршрута вам нужно с помощью параметра маршрута ограничения добавлено:

// Route to closure 
Route::get('/{category}/{subcategories}/{article}', function($category, $subcategories, $article) 
{ 
    return $subcategories; 
})->where('subcategories', '(.*)'); 

// Route to controller method 
Route::get('/{category}/{subcategories}/{article}', '[email protected]')->where('subcategories', '(.*)'); 

И пример обычая связывания для параметра подкатегорий, который возвращает подкатегории как массив:

$router->bind('subcategories', function ($value) { 
    return explode('/', $value); 
}); 

Предостережение: Единственная проблема, с которой вы столкнетесь в использовании привязок параметров маршрута в том виде, в котором вы описали, заключается в том, что загруженная здесь статья зависит только от правильности пули. Он по-прежнему будет загружаться, если категории в URL-адресе не связаны друг с другом, что вам нужно позаботиться в логике вашего контроллера.

+0

Спасибо, я постараюсь сделать это, как вы объяснили здесь, и сообщите, если это сработало. Каково ваше мнение о сохранении полного пути в поле, может ли оно быть лучшим решением в случае глубоко вложенных категорий? Каковы недостатки по сравнению с решением, которое вы представили здесь ... Я имею в виду, каково ваше мнение. Еще раз спасибо и извините за моего бедного английского. – PeraMika

+0

Я не уверен, что вы просите. Вы имеете в виду сохранение полного пути в переменной, чтобы перейти к контроллеру? Или хранится в базе данных? –

Смежные вопросы