Урок 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по Laravel, laravel, php, чпу




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 9. Простое ограничение доступа в Laravel
Java и MySQL
Java: нахождение и скачивание файла