---
title: "Методические рекомендации по выполнению работы"
---

# Методические рекомендации по выполнению расчетно-графической работы

## Подготовка окружения

### Требования к системе

1. **PHP версии 8.1 или выше**
2. **Composer** - менеджер пакетов PHP
3. **СУБД** - SQLite, MySQL/MariaDB или PostgreSQL
4. **Web-сервер** - Apache или Nginx (опционально, можно использовать встроенный сервер Laravel)
5. **Git** - система контроля версий

### Установка Laravel

```bash
# Создание нового проекта
composer create-project laravel/laravel project-name

# Переход в директорию проекта
cd project-name

# Настройка файла окружения
cp .env.example .env

# Генерация ключа приложения
php artisan key:generate
```

### Настройка базы данных

SQLite:

```env
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
```

MySQL:
```env
# .env файл
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password
```

## Пошаговое руководство по разработке

### Этап 1: Анализ и проектирование

1. **Изучите предметную область** вашего варианта
2. **Определите основные сущности** и их атрибуты
3. **Постройте ER-диаграмму** связей между сущностями
4. **Спланируйте структуру** приложения

### Этап 2: Создание миграций

```bash
# Создание миграции для таблицы
php artisan make:migration create_books_table

# Применение миграций
php artisan migrate

# Откат миграций
php artisan migrate:rollback
```

Пример миграции:

```php
// 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: Создание моделей

```bash
# Создание модели с миграцией и factory
php artisan make:model Book -mf
```

Пример модели:

```php
// app/Models/Book.php
class Book extends Model
{
    use HasFactory;
    
    protected $fillable = [
        'title',
        'description',
        'year',
        'price',
        'author_id'
    ];
    
    public function author()
    {
        return $this->belongsTo(Author::class);
    }
    
    public function categories()
    {
        return $this->belongsToMany(Category::class);
    }
}
```

### Этап 4: Создание контроллеров

```bash
# Создание resource-контроллера
php artisan make:controller BookController --resource
```

Пример контроллера:

```php
// 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: Настройка маршрутов

```php
// routes/web.php
Route::resource('books', BookController::class);
Route::get('/books/search', [BookController::class, 'search'])->name('books.search');

// Маршруты аутентификации
Auth::routes();
```

### Этап 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
```

#### Пример главного макета:

```blade
<!-- 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: Реализация валидации

#### Валидация в контроллере:

```php
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 символов',
    ]);
    
    // Сохранение данных
}
```

#### Форма с выводом ошибок:

```blade
<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: Аутентификация и авторизация

```bash
# Установка пакетов аутентификации
composer require laravel/ui

# Генерация scaffold аутентификации
php artisan ui bootstrap --auth

# Установка зависимостей и компиляция
npm install && npm run dev
```

#### Middleware для проверки прав доступа:

```bash
# Создание middleware
php artisan make:middleware AdminMiddleware
```

```php
// app/Http/Middleware/AdminMiddleware.php
public function handle(Request $request, Closure $next)
{
    if (!Auth::check() || !Auth::user()->isAdmin()) {
        abort(403, 'Доступ запрещен');
    }
    
    return $next($request);
}
```

### Этап 9: Работа с коллекциями

```php
// Фильтрация данных
$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
    ];
});
```

## Рекомендации по качеству кода

### Принципы написания кода

1. **Следуйте PSR-12** для форматирования кода
2. **Используйте осмысленные имена** переменных и методов
3. **Разделяйте ответственность** между классами
4. **Пишите комментарии** для сложного кода
5. **Используйте Type Hinting** для параметров и возвращаемых значений

### Оптимизация запросов

```php
// Плохо: проблема 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; // Дополнительные запросы не требуются
}
```

### Безопасность

1. **Используйте CSRF-токены** в формах
2. **Экранируйте вывод** данных в шаблонах
3. **Валидируйте все входные данные**
4. **Используйте подготовленные выражения** (Laravel делает это автоматически)
5. **Правильно настраивайте права доступа** к файлам

## Тестирование

### Написание тестов

```bash
# Создание теста
php artisan make:test BookTest
```

```php
// 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']);
    }
}
```

### Запуск тестов

```bash
# Запуск всех тестов
php artisan test

# Запуск конкретного теста
php artisan test --filter BookTest
```

## Распространенные ошибки и их решение

### 1. Ошибка "Class not found"

**Решение**: Выполните `composer dump-autoload`

### 2. Проблемы с правами доступа к файлам

**Решение**: 
```bash
chmod -R 775 storage
chmod -R 775 bootstrap/cache
```

### 3. Ошибка подключения к базе данных

**Решение**: Проверьте настройки в файле `.env` и выполните `php artisan config:cache`

### 4. Проблемы с миграциями

**Решение**: Проверьте порядок миграций и внешние ключи

## Полезные ресурсы

1. [Laravel Documentation](https://laravel.com/docs)
2. [Laracasts](https://laracasts.com/)
3. [Laravel News](https://laravel-news.com/)
4. [Laravel Package Repository](https://packagist.org/)
5. [Laravel Debugbar](https://github.com/barryvdh/laravel-debugbar) - инструмент отладки

## Советы по успешному выполнению работы

1. **Начинайте с простого** и постепенно добавляйте функциональность
2. **Используйте систему контроля версий** Git для отслеживания изменений
3. **Регулярно делайте резервные копии** проекта
4. **Тестируйте каждую функцию** после реализации
5. **Обращайтесь к документации** Laravel при возникновении вопросов
6. **Не бойтесь экспериментировать** с различными подходами
7. **Планируйте время** равномерно на все этапы работы

Помните, что качественное приложение требует времени и внимания к деталям. Начинайте работу как можно раньше и не откладывайте сложные задачи на последний момент.