Урок 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.