Урок 25. Произвольные ЧПУ в Laravel с примером
На этом уроке из серии уроков по Laravel вы узнаете вариант работы с любыми произвольными адресами страниц сайта, в том числе динамическими, без жесткого прописывания в коде.
ЧПУ
ЧПУ расшифровывается как человеко-понятный URL. Лично мне кажется, что на продвижение сайта и вообще удобство пользования влияет мало, но все же заказчикам часто требуется реализовать данную функцию.
ЧПУ для одной страницы Laravel
В ларавель ЧПУ на самом простом варианте реализуется через роутинг, например, через файл web.php. Что-то типа:
Route::get('/profile', [ProfileController::class, 'showProfile'])->middleware(['auth'])->name('profile');
Здесь если идет гет запрос по адресу /profile, то после проверки на авторизацию, вызывается функция showProfile из класса ProfileController. Что-то типа такой:
class ProfileController extends Controller
{
public function showProfile(Request $request)
{
$user_id = Auth::user()->id;
$info = DB::table('users')
->where('id', $user_id)
->first();
return view('profile', ["info" => $info]);
}
}
Ну а представление уже любое можно - там только работать с переменной $info – выводить данные по пользователю в каком угодно и удобно виде.
А если страниц много в Laravel?
Данный подход оправдан, если таких точек входа немного и все они отличаются друг от друга. А если нам надо сделать десятки, даже сотни страниц с одинаковым расположением, одинаковыми забираемыми типами данных? Например, это статьи – они отличаются только заголовком и текстом (html код)?
В таком случае как вариант можно использовать вот такой подход. Сначала делаем роутинг:
Route::get('/{pageNotFound1}', [BanlanceController::class, 'show']);
Дальше класс балансер:
class BanlanceController extends Controller
{
public function show(Request $request, String $pageNotFound1 = "")
{
if ($pageNotFound1){
$html = DB::table('html')
->where("chpu", $pageNotFound1)
->first();
if ($html){
$name = $html->name;
$txt = $html->txt;
return view('html', ["name" => $name, "txt" => $txt]);
}
}
abort(404);
}
}
Смотрите, что тут происходит. Если роутер в ларавель не может понять, куда сунуть этот адрес, то он передает его в балансер. Балансер в свою очередь проверяет наличие чпу в некой таблице и если находит такую строку, то возвращает представление. Таблица может быть, например такая:
Миграция её:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateHtmlTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('html', function (Blueprint $table) {
$table->id();
$table->string('chpu', 255);
$table->string('name', 255);
$table->text('txt');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('html');
}
}
Вот так несложно можно обработать произвольный чпу первого уровня вложенности в ларавель. Для второго и выше придется немного изменить код, но тоже большой проблемы не составит.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты