Методические рекомендации по выполнению работы
Материалы для выполнения расчетно-графической работы по разработке веб-приложений с использованием фреймворка Laravel
Методические рекомендации по выполнению расчетно-графической работы
Подготовка окружения
Требования к системе
- PHP версии 8.1 или выше
- Composer - менеджер пакетов PHP
- СУБД - SQLite, MySQL/MariaDB или PostgreSQL
- Web-сервер - Apache или Nginx (опционально, можно использовать встроенный сервер Laravel)
- Git - система контроля версий
Установка Laravel
Настройка базы данных
SQLite:
MySQL:
Пошаговое руководство по разработке
Этап 1: Анализ и проектирование
- Изучите предметную область вашего варианта
- Определите основные сущности и их атрибуты
- Постройте ER-диаграмму связей между сущностями
- Спланируйте структуру приложения
Этап 2: Создание миграций
Пример миграции:
// database/migrations/create_books_table.php
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description')->nullable();
$table->integer('year');
$table->decimal('price', 8, 2);
$table->foreignId('author_id')->constrained();
$table->timestamps();
});
}Этап 3: Создание моделей
Пример модели:
Этап 4: Создание контроллеров
Пример контроллера:
// app/Http/Controllers/BookController.php
class BookController extends Controller
{
public function index()
{
$books = Book::with(['author', 'categories'])->paginate(10);
return view('books.index', compact('books'));
}
public function create()
{
$authors = Author::all();
$categories = Category::all();
return view('books.create', compact('authors', 'categories'));
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'description' => 'nullable|string',
'year' => 'required|integer|min:1900|max:' . date('Y'),
'price' => 'required|numeric|min:0',
'author_id' => 'required|exists:authors,id',
'categories' => 'nullable|array',
'categories.*' => 'exists:categories,id'
]);
$book = Book::create($validated);
$book->categories()->attach($request->categories);
return redirect()->route('books.index')
->with('success', 'Книга успешно добавлена');
}
// Другие методы...
}Этап 5: Настройка маршрутов
Этап 6: Создание представлений
Структура директории представлений:
resources/views/
├── layouts/
│ └── app.blade.php
├── books/
│ ├── index.blade.php
│ ├── create.blade.php
│ ├── edit.blade.php
│ └── show.blade.php
└── partials/
├── navbar.blade.php
└── sidebar.blade.php
Пример главного макета:
<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('title', 'Приложение')</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<a class="navbar-brand" href="{{ route('home') }}">Мое приложение</a>
@guest
<a class="btn btn-outline-light" href="{{ route('login') }}">Войти</a>
@else
<span class="navbar-text me-3">{{ Auth::user()->name }}</span>
<a class="btn btn-outline-light" href="{{ route('logout') }}">Выйти</a>
@endguest
</div>
</nav>
<main class="container mt-4">
@include('partials.messages')
@yield('content')
</main>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Этап 7: Реализация валидации
Валидация в контроллере:
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
'password' => 'required|string|min:8|confirmed',
], [
'title.required' => 'Поле название обязательно для заполнения',
'email.email' => 'Введите корректный email адрес',
'password.min' => 'Пароль должен содержать минимум 8 символов',
]);
// Сохранение данных
}Форма с выводом ошибок:
<form method="POST" action="{{ route('books.store') }}">
@csrf
<div class="mb-3">
<label for="title" class="form-label">Название</label>
<input type="text" class="form-control @error('title') is-invalid @enderror"
id="title" name="title" value="{{ old('title') }}">
@error('title')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<!-- Другие поля -->
<button type="submit" class="btn btn-primary">Сохранить</button>
</form>Этап 8: Аутентификация и авторизация
Middleware для проверки прав доступа:
Этап 9: Работа с коллекциями
// Фильтрация данных
$activeBooks = Book::where('status', 'active')->get();
$expensiveBooks = $activeBooks->filter(function ($book) {
return $book->price > 100;
});
// Группировка данных
$booksByAuthor = Book::with('author')->get()->groupBy('author.name');
// Преобразование данных
$bookTitles = Book::all()->pluck('title');
$bookStats = Book::all()->map(function ($book) {
return [
'title' => $book->title,
'price_with_tax' => $book->price * 1.2
];
});Рекомендации по качеству кода
Принципы написания кода
- Следуйте PSR-12 для форматирования кода
- Используйте осмысленные имена переменных и методов
- Разделяйте ответственность между классами
- Пишите комментарии для сложного кода
- Используйте Type Hinting для параметров и возвращаемых значений
Оптимизация запросов
// Плохо: проблема N+1 запроса
$books = Book::all();
foreach ($books as $book) {
echo $book->author->name; // Отдельный запрос для каждой книги
}
// Хорошо: предварительная загрузка
$books = Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name; // Дополнительные запросы не требуются
}Безопасность
- Используйте CSRF-токены в формах
- Экранируйте вывод данных в шаблонах
- Валидируйте все входные данные
- Используйте подготовленные выражения (Laravel делает это автоматически)
- Правильно настраивайте права доступа к файлам
Тестирование
Написание тестов
// tests/Feature/BookTest.php
class BookTest extends TestCase
{
public function test_book_can_be_created()
{
$user = User::factory()->create();
$author = Author::factory()->create();
$response = $this->actingAs($user)->post('/books', [
'title' => 'Test Book',
'author_id' => $author->id,
'year' => 2023,
'price' => 29.99
]);
$response->assertRedirect('/books');
$this->assertDatabaseHas('books', ['title' => 'Test Book']);
}
}Запуск тестов
Распространенные ошибки и их решение
1. Ошибка “Class not found”
Решение: Выполните composer dump-autoload
2. Проблемы с правами доступа к файлам
Решение:
3. Ошибка подключения к базе данных
Решение: Проверьте настройки в файле .env и выполните php artisan config:cache
4. Проблемы с миграциями
Решение: Проверьте порядок миграций и внешние ключи
Полезные ресурсы
- Laravel Documentation
- Laracasts
- Laravel News
- Laravel Package Repository
- Laravel Debugbar - инструмент отладки
Советы по успешному выполнению работы
- Начинайте с простого и постепенно добавляйте функциональность
- Используйте систему контроля версий Git для отслеживания изменений
- Регулярно делайте резервные копии проекта
- Тестируйте каждую функцию после реализации
- Обращайтесь к документации Laravel при возникновении вопросов
- Не бойтесь экспериментировать с различными подходами
- Планируйте время равномерно на все этапы работы
Помните, что качественное приложение требует времени и внимания к деталям. Начинайте работу как можно раньше и не откладывайте сложные задачи на последний момент.