Лаб. работа 2 "Добавление главной страницы и базовых маршрутов"
Цель: Освоить маршрутизацию, Blade-шаблоны и организацию кода в Laravel 11 с использованием Tailwind CSS.
Задачи:
- Создать контроллеры и маршруты для статических страниц.
- Реализовать наследование шаблонов через Blade.
- Использовать Tailwind CSS для стилизации.
Методическая часть
1. Создание контроллера для статических страниц
Создайте контроллер
PageController:1php artisan make:controller PageControllerДобавьте методы в
app/Http/Controllers/PageController.php:1public function home() { 2 return view('pages.home', ['title' => 'Главная страница']); 3} 4 5public function about() { 6 return view('pages.about', ['title' => 'О нас']); 7} 8 9public function contact() { 10 return view('pages.contact', ['title' => 'Контакты']); 11}
2. Настройка маршрутов
В файле routes/web.php:
1use App\Http\Controllers\PageController;
2
3// Статические страницы
4Route::get('/', [PageController::class, 'home'])->name('home');
5Route::get('/about', [PageController::class, 'about'])->name('about');
6Route::get('/contact', [PageController::class, 'contact'])->name('contact');
7
8// Динамический маршрут с параметром
9Route::get('/post/{slug}', function ($slug) {
10 return view('pages.post', ['slug' => $slug]);
11})->where('slug', '[a-z0-9-]+');
3. Создание Blade-шаблонов с Tailwind CSS
Базовый шаблон (
resources/views/layouts/app.blade.php):1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>{{ $title ?? 'Блог' }}</title> 7 @vite(['resources/css/app.css', 'resources/js/app.js']) 8</head> 9<body class="bg-gray-100"> 10 <!-- Навигационное меню --> 11 <nav class="bg-white shadow"> 12 <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> 13 <div class="flex justify-between h-16"> 14 <div class="flex items-center"> 15 <a href="{{ route('home') }}" class="text-xl font-bold text-gray-800">Мой Блог</a> 16 </div> 17 <div class="flex space-x-8"> 18 <a href="{{ route('about') }}" class="text-gray-600 hover:text-gray-800">О нас</a> 19 <a href="{{ route('contact') }}" class="text-gray-600 hover:text-gray-800">Контакты</a> 20 </div> 21 </div> 22 </div> 23 </nav> 24 25 <!-- Контент страницы --> 26 <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8"> 27 @yield('content') 28 </div> 29</body> 30</html>Шаблон главной страницы (
resources/views/pages/home.blade.php):1@extends('layouts.app') 2 3@section('content') 4 <div class="bg-white p-6 rounded-lg shadow"> 5 <h1 class="text-3xl font-bold text-gray-800 mb-4">Добро пожаловать в блог!</h1> 6 <p class="text-gray-600">Здесь вы найдете интересные статьи на разные темы.</p> 7 </div> 8@endsectionСоздайте аналогичные шаблоны для
about.blade.phpиcontact.blade.php.
4. Форма обратной связи с Tailwind CSS
В шаблоне contact.blade.php:
1@section('content')
2 <div class="bg-white p-6 rounded-lg shadow">
3 <h1 class="text-3xl font-bold text-gray-800 mb-4">Свяжитесь с нами</h1>
4 <form class="space-y-4">
5 <div>
6 <label class="block text-gray-700">Email</label>
7 <input type="email" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm">
8 </div>
9 <div>
10 <label class="block text-gray-700">Сообщение</label>
11 <textarea class="mt-1 block w-full rounded-md border-gray-300 shadow-sm" rows="4"></textarea>
12 </div>
13 <button type="submit" class="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700">
14 Отправить
15 </button>
16 </form>
17 </div>
18@endsection
Индивидуальные задания
1. Динамические страницы с параметрами
- Создайте маршрут
/post/{slug}, который принимает строковый параметрslug. - Добавьте метод
showPostвPageControllerи шаблонpost.blade.php, выводящий заголовок поста на основеslug. - Пример шаблона:
1<div class="bg-white p-6 rounded-lg shadow"> 2 <h1 class="text-3xl font-bold text-gray-800">{{ $slug }}</h1> 3</div>
2. Кастомный компонент формы
- Создайте компонент
Form:1php artisan make:component Form - В
resources/views/components/form.blade.php:1<form {{ $attributes->merge(['class' => 'space-y-4']) }}> 2 @csrf 3 {{ $slot }} 4 <button type="submit" class="bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700"> 5 {{ $buttonText ?? 'Отправить' }} 6 </button> 7</form> - Используйте компонент в шаблоне контактов:
1<x-form action="/contact" method="POST" buttonText="Отправить сообщение"> 2 <!-- Поля формы --> 3</x-form>
3. Адаптивная навигация
- Модифицируйте навигационное меню, чтобы оно сворачивалось на мобильных устройствах.
- Добавьте кнопку “бургер-меню” с использованием Alpine.js (уже включен в Laravel по умолчанию):
1<div x-data="{ isOpen: false }" class="md:hidden"> 2 <button @click="isOpen = !isOpen" class="p-2"> 3 <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> 4 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-16 6h16"/> 5 </svg> 6 </button> 7 <div x-show="isOpen" class="mt-2 space-y-2"> 8 <a href="{{ route('about') }}" class="block px-4 py-2 text-gray-600 hover:bg-gray-100">О нас</a> 9 <a href="{{ route('contact') }}" class="block px-4 py-2 text-gray-600 hover:bg-gray-100">Контакты</a> 10 </div> 11</div>
4. Валидация формы на стороне клиента
- Добавьте валидацию полей формы через JavaScript:
1<script> 2 document.querySelector('form').addEventListener('submit', (e) => { 3 const email = document.querySelector('input[type="email"]'); 4 if (!email.value.includes('@')) { 5 e.preventDefault(); 6 alert('Введите корректный email!'); 7 } 8 }); 9</script>
Примечания для Tailwind CSS в Laravel 11
- Интеграция: Tailwind уже настроен в Laravel 11. Файлы стилей находятся в
resources/css/app.css. - Компиляция: Для применения изменений запустите:
1npm run dev - Документация: Официальный сайт Tailwind — tailwindcss.com.