Введение в Laravel

Laravel - это современный PHP-фреймворк с открытым исходным кодом, предназначенный для разработки веб-приложений по модели MVC (Model-View-Controller).

Ключевые особенности Laravel:

  • Элегантный синтаксис
  • Мощная система маршрутизации
  • Встроенная система аутентификации
  • ORM Eloquent для работы с базой данных
  • Шаблонизатор Blade
  • Миграции базы данных
  • Встроенная поддержка тестирования
  • Богатая экосистема (Forge, Envoyer, Horizon и др.)

История Laravel

Laravel был создан Тейлором Отвеллом в 2011 году как попытка предложить более продвинутую альтернативу фреймворку CodeIgniter. Первая стабильная версия Laravel 1 была выпущена в июне 2011 года.

Установка и настройка Laravel

Для работы с Laravel вам потребуется:

  • PHP ≥ 8.0
  • Composer (менеджер зависимостей для PHP)
  • База данных (MySQL, PostgreSQL, SQLite или SQL Server)
  • Расширения PHP: BCMath, Ctype, Fileinfo, JSON, Mbstring, OpenSSL, PDO, Tokenizer, XML

Установка через Composer

composer create-project laravel/laravel project-name

Запуск встроенного сервера

php artisan serve

Сервер запустится на http://localhost:8000

Настройка окружения

Основные настройки приложения находятся в файле .env в корне проекта:

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:...
APP_DEBUG=true
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

Маршрутизация в Laravel

Маршруты определяются в файле routes/web.php для веб-интерфейса и routes/api.php для API.

Базовые маршруты

Route::get('/', function () {
    return view('welcome');
});

Route::post('/user', function () {
    // Обработка POST запроса
});

Route::put('/user/{id}', function ($id) {
    // Обработка PUT запроса
});

Route::delete('/user/{id}', function ($id) {
    // Обработка DELETE запроса
});

Параметры маршрутов

Route::get('/user/{id}', function ($id) {
    return 'User '.$id;
});

// Необязательные параметры
Route::get('/user/{name?}', function ($name = null) {
    return $name;
});

// Ограничения регулярными выражениями
Route::get('/user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Именованные маршруты

Route::get('/user/profile', function () {
    //
})->name('profile');

Контроллеры в Laravel

Контроллеры позволяют организовать логику обработки запросов в отдельных классах.

Создание контроллера

php artisan make:controller UserController

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

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        return view('users.index');
    }
    
    public function show($id)
    {
        $user = User::findOrFail($id);
        return view('users.show', compact('user'));
    }
    
    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|max:255',
            'email' => 'required|email|unique:users',
        ]);
        
        User::create($validated);
        
        return redirect('/users');
    }
}

Привязка контроллера к маршруту

Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);
Route::post('/users', [UserController::class, 'store']);

Представления (Blade)

Blade - это мощный шаблонизатор, входящий в состав Laravel.

Создание представления

Файлы представлений хранятся в resources/views с расширением .blade.php.

Пример Blade-шаблона

<!DOCTYPE html>
<html>
<head>
    <title>@yield('title')</title>
</head>
<body>
    @section('sidebar')
        Это главный сайдбар.
    @show

    <div class="container">
        @yield('content')
    </div>
</body>
</html>

Наследование шаблонов

@extends('layouts.app')

@section('title', 'Page Title')

@section('sidebar')
    @parent
    <p>Дополнительный контент сайдбара</p>
@endsection

@section('content')
    <p>Основной контент страницы</p>
@endsection

Условные операторы и циклы

@if (count($users) === 1)
    У меня один пользователь!
@elseif (count($users) > 1)
    У меня несколько пользователей!
@else
    У меня нет пользователей!
@endif

@foreach ($users as $user)
    <p>Это пользователь {{ $user->id }}</p>
@endforeach

Миграции базы данных

Миграции - это система контроля версий для вашей базы данных.

Создание миграции

php artisan make:migration create_users_table

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

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
    
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Выполнение миграций

php artisan migrate

Откат миграций

php artisan migrate:rollback

Eloquent ORM

Eloquent - это реализация ActiveRecord в Laravel для работы с базой данных.

Создание модели

php artisan make:model User

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

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;
    
    protected $fillable = ['name', 'email', 'password'];
    
    protected $hidden = ['password', 'remember_token'];
}

Основные операции

// Получить всех пользователей
$users = User::all();

// Найти пользователя по ID
$user = User::find(1);

// Создать нового пользователя
$user = User::create([
    'name' => 'John',
    'email' => 'john@example.com',
]);

// Обновить пользователя
$user = User::find(1);
$user->name = 'New Name';
$user->save();

// Удалить пользователя
$user = User::find(1);
$user->delete();

Отношения

// Один ко многим
class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

Аутентификация

Laravel предоставляет готовую систему аутентификации.

Установка аутентификации

composer require laravel/ui
php artisan ui vue --auth
npm install && npm run dev

Маршруты аутентификации

Auth::routes();

Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

Проверка аутентификации

if (Auth::check()) {
    // Пользователь аутентифицирован
}

// Получить текущего пользователя
$user = Auth::user();

Защита маршрутов

Route::get('/profile', function () {
    // Доступно только аутентифицированным пользователям
})->middleware('auth');

ПО промежуточного слоя (Middleware)

Middleware обеспечивает удобный механизм для фильтрации HTTP-запросов.

Создание middleware

php artisan make:middleware CheckAge

Пример middleware

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }
        
        return $next($request);
    }
}

Регистрация middleware

В файле app/Http/Kernel.php:

protected $routeMiddleware = [
    'age' => \App\Http\Middleware\CheckAge::class,
];

Применение middleware

Route::get('/admin', function () {
    //
})->middleware('age');

Создание API

Laravel позволяет легко создавать RESTful API.

Маршруты API

Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{id}', [UserController::class, 'show']);
Route::put('/users/{id}', [UserController::class, 'update']);
Route::delete('/users/{id}', [UserController::class, 'destroy']);

Ресурсные контроллеры

php artisan make:controller API/UserController --api

Route::apiResource('users', 'API\UserController');

Формат ответа JSON

public function index()
{
    return response()->json([
        'success' => true,
        'data' => User::all()
    ], 200);
}

Аутентификация API (Sanctum)

composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

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

Laravel предоставляет удобные инструменты для тестирования.

Создание теста

php artisan make:test UserTest

Пример теста

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class UserTest extends TestCase
{
    use RefreshDatabase;
    
    public function test_user_can_be_created()
    {
        $response = $this->post('/users', [
            'name' => 'Test User',
            'email' => 'test@example.com',
        ]);
        
        $response->assertStatus(201);
        $this->assertDatabaseHas('users', [
            'email' => 'test@example.com',
        ]);
    }
}

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

php artisan test

Деплоймент Laravel-приложения

Подготовка к деплою

composer install --optimize-autoloader --no-dev
php artisan config:cache
php artisan route:cache
php artisan view:cache

Настройки сервера

Пример конфигурации Nginx:

server {
    listen 80;
    server_name example.com;
    root /var/www/laravel/public;
    
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";
    
    index index.php;
    
    charset utf-8;
    
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Настройки .env для продакшена

APP_ENV=production
APP_DEBUG=false
APP_URL=https://example.com

DB_* // Настройки базы данных
REDIS_* // Настройки Redis (если используется)
MAIL_* // Настройки почты