Laravel: руководство по созданию мощных веб-приложений на PHP
Для кого эта статья:
- Начинающие и опытные PHP-разработчики, заинтересованные в изучении Laravel.
- Студенты или учащиеся, желающие освоить веб-разработку и фреймворки.
Специалисты, ищущие современные инструменты для создания веб-приложений и повышения своей квалификации.
Laravel — это не просто PHP-фреймворк, а настоящий прорыв для тех, кто хочет создавать мощные веб-приложения без лишней головной боли.
Помню свой первый проект на "чистом" PHP — тонны кода, запутанная логика и постоянные ошибки. С Laravel этот хаос превращается в элегантную архитектуру, где каждый элемент находится на своем месте. Неудивительно, что за последние годы Laravel стал выбором №1 среди PHP-разработчиков, которые ценят свое время и нервы. Готовы упростить свою жизнь и создать первый сайт на этом мощном фреймворке? Давайте начнем! 🚀
Хотите освоить Laravel на профессиональном уровне? Курс Обучение веб-разработке от Skypro — это не просто теория, а реальные проекты под руководством практикующих разработчиков. За время обучения вы создадите полноценный сайт на Laravel с нуля, освоите архитектуру MVC и научитесь работать с базами данных. Бонус — личный наставник и помощь в трудоустройстве после обучения. Инвестируйте в навыки, которые реально востребованы на рынке!
Разработка сайта на Laravel: что нужно знать в начале
Прежде чем мы погрузимся в код, давайте разберемся, почему Laravel заслуживает вашего внимания. Этот фреймворк — не просто модный инструмент, а продуманная экосистема, которая решает большинство типовых задач веб-разработки.
Laravel построен на принципах MVC (Model-View-Controller), что обеспечивает четкое разделение логики приложения. Это значительно упрощает поддержку кода и работу в команде — каждый разработчик точно знает, где искать нужный функционал.
Александр Петров, Lead PHP-разработчик Помню, как несколько лет назад ко мне пришел клиент с проектом, который нужно было срочно переписать. Сайт был создан на "самописном фреймворке" и представлял собой настоящую спагетти-кодовую катастрофу. Ни документации, ни структуры — классический пример технического долга.
Я предложил перейти на Laravel, и хотя клиент сомневался ("зачем платить за переписывание того, что уже работает?"), мы решились на этот шаг. Через месяц у нас был не просто работающий сайт, а масштабируемая система с понятной архитектурой. Добавление новых функций, которое раньше занимало недели, теперь требовало считанных часов. А когда клиент решил расширить команду, новые разработчики подключились к проекту за считанные дни, а не месяцы.
Laravel окупил себя уже через три месяца только на экономии времени разработчиков. А сайт до сих пор успешно развивается и масштабируется без необходимости переписывать код.
Ключевые преимущества Laravel, которые сразу оцените:
- Элегантный синтаксис — код читается почти как обычный английский
- Встроенная система аутентификации — забудьте о написании своего велосипеда
- Мощный ORM Eloquent — работа с базами данных на уровне объектов
- Artisan — консольный инструмент для автоматизации рутинных задач
- Миграции — система контроля версий для вашей базы данных
- Blade — шаблонизатор, который делает верстку приятной
Перед началом разработки вам понадобятся базовые знания:
| Необходимые навыки | Уровень владения | Где изучить |
|---|---|---|
| PHP | Средний | php.net, Codecademy |
| HTML/CSS | Базовый | MDN Web Docs |
| JavaScript | Начальный | JavaScript.info |
| SQL | Базовый | W3Schools |
| MVC-концепция | Понимание принципов | Laravel документация |
Laravel имеет низкий порог входа для начинающих, но при этом предоставляет продвинутые инструменты для опытных разработчиков. Это редкое сочетание делает фреймворк идеальным выбором для профессионального роста. 🌟

Подготовка окружения и установка фреймворка Laravel
Установка Laravel — процесс, который может показаться сложным новичку, но на деле занимает менее 15 минут. Давайте разберем весь процесс пошагово, чтобы у вас получилось с первого раза.
Прежде всего, убедитесь, что ваш компьютер соответствует минимальным требованиям:
- PHP >= 8.1
- BCMath PHP Extension
- Ctype PHP Extension
- Fileinfo PHP Extension
- JSON PHP Extension
- Mbstring PHP Extension
- OpenSSL PHP Extension
- PDO PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
Существует несколько способов настройки окружения, но я рекомендую использовать один из этих вариантов:
| Инструмент | Преимущества | Недостатки | Идеально для |
|---|---|---|---|
| Laravel Homestead (Vagrant) | Полная изоляция, максимально приближена к боевому серверу | Требует больше ресурсов, сложнее в настройке | Командной разработки |
| Laravel Valet (macOS) | Легкий, быстрый, минимальная конфигурация | Только для macOS | Разработчиков на Mac |
| Docker | Высокая портативность, изоляция, масштабируемость | Кривая обучения | Профессиональной разработки |
| XAMPP/WAMP | Простота установки, знаком многим | Меньше контроля, возможны конфликты | Быстрого старта новичков |
Для начинающих я рекомендую XAMPP — это самый быстрый способ запустить локальный сервер и начать разработку. После установки XAMPP необходимо установить Composer — менеджер зависимостей для PHP. Скачайте установщик с официального сайта getcomposer.org и следуйте инструкциям.
После установки Composer выполните следующие шаги для создания нового проекта Laravel:
- Откройте командную строку (Terminal или CMD)
- Перейдите в директорию, где хотите создать проект (например, cd C:\xampp\htdocs\)
- Выполните команду: composer create-project --prefer-dist laravel/laravel my-project
- Дождитесь завершения установки (это может занять несколько минут)
- Перейдите в папку проекта: cd my-project
- Запустите встроенный сервер: php artisan serve
Теперь ваш проект доступен по адресу http://localhost:8000. Если вы видите стартовую страницу Laravel — поздравляю! Вы успешно установили фреймворк и готовы к разработке. 🎉
Несколько полезных команд Artisan, которые стоит запомнить с самого начала:
- php artisan list — показывает список всех доступных команд
- php artisan make:controller UserController — создает контроллер
- php artisan make:model User — создает модель
- php artisan make:migration createuserstable — создает миграцию
- php artisan migrate — запускает миграции
- php artisan tinker — запускает REPL для тестирования кода
Установка IDE с поддержкой Laravel также значительно облегчит разработку. PhpStorm предлагает лучшую интеграцию с Laravel, но для начала подойдет и бесплатный Visual Studio Code с расширениями для PHP и Laravel.
Структура проекта и маршрутизация в Laravel
Первое, что поражает в Laravel — это продуманная структура проекта. Каждая папка имеет свое предназначение, что делает навигацию по коду интуитивно понятной даже для новичков.
Михаил Соколов, Senior Backend Developer На старте карьеры я работал в студии, где мне поручили первый проект на Laravel. До этого я писал на "чистом" PHP, где файловая структура была, мягко говоря, творческой. Помню свое удивление, когда открыл проект на Laravel — все папки были логично организованы, и я сразу понял, где что искать.
Особенно меня впечатлила маршрутизация. В старых проектах мы использовали монструозные switch-case конструкции или самописные роутеры, которые постоянно ломались. В Laravel я просто открыл файл routes/web.php и увидел четкую структуру всех маршрутов приложения.
Самый показательный момент случился, когда я заболел, и проект на неделю передали другому разработчику. Вернувшись, я обнаружил, что коллега без проблем разобрался в коде и добавил новый функционал — и все благодаря понятной структуре Laravel. С тех пор я фанат этого фреймворка и всегда рекомендую его начинающим разработчикам.
Давайте разберем ключевые директории Laravel-проекта:
- app/ — основной код приложения (модели, контроллеры, middleware)
- config/ — файлы конфигурации
- database/ — миграции, фабрики и сидеры для БД
- public/ — публично доступные файлы (CSS, JS, изображения)
- resources/ — исходные файлы (шаблоны Blade, SASS, неминифицированный JS)
- routes/ — файлы маршрутизации
- storage/ — сгенерированные файлы, кэши, логи
- tests/ — автоматические тесты
- vendor/ — зависимости Composer (не редактируются вручную)
Маршрутизация — одна из самых мощных и элегантных особенностей Laravel. В отличие от других фреймворков, здесь нет необходимости создавать сложные XML или YAML файлы — все маршруты определяются в PHP-коде, что делает их гибкими и читаемыми.
Основные файлы маршрутов находятся в директории /routes:
- web.php — маршруты для веб-интерфейса (с поддержкой сессий, CSRF)
- api.php — маршруты для API (без состояния, с токен-аутентификацией)
- console.php — кастомные Artisan команды
- channels.php — каналы для websocket-коммуникации
Давайте создадим несколько базовых маршрутов для нашего сайта. Откройте файл routes/web.php и добавьте следующий код:
Route::get('/', function () {
return view('welcome');
});
Route::get('/about', function () {
return view('about');
});
Route::get('/contact', function () {
return view('contact');
});
Это простейшие маршруты, которые возвращают статические шаблоны. Но настоящая мощь Laravel раскрывается при работе с контроллерами. Давайте создадим контроллер для блога:
php artisan make:controller BlogController
Теперь добавим маршруты с использованием этого контроллера:
Route::get('/blog', [BlogController::class, 'index'])->name('blog.index');
Route::get('/blog/{post}', [BlogController::class, 'show'])->name('blog.show');
Обратите внимание на метод name() — это позволяет давать маршрутам имена для последующего использования в приложении. Например, генерировать URL можно так:
$url = route('blog.show', ['post' => 1]); // Вернет /blog/1
Laravel также поддерживает группировку маршрутов, что особенно полезно для создания административной панели:
Route::prefix('admin')->middleware(['auth', 'admin'])->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::resource('posts', AdminPostController::class);
});
Здесь мы создаем группу маршрутов с префиксом /admin, которые защищены middleware для аутентификации и проверки прав администратора.
Особого внимания заслуживает метод resource(), который автоматически создает маршруты для типичных CRUD-операций:
- GET /admin/posts — индекс (список всех записей)
- GET /admin/posts/create — форма создания
- POST /admin/posts — сохранение новой записи
- GET /admin/posts/{post} — просмотр записи
- GET /admin/posts/{post}/edit — форма редактирования
- PUT/PATCH /admin/posts/{post} — обновление записи
- DELETE /admin/posts/{post} — удаление записи
Такой подход к маршрутизации делает код предсказуемым и соответствующим RESTful-принципам. 🧩
Работа с базами данных и создание моделей в Laravel
Одна из причин, почему разработчики выбирают Laravel — это Eloquent ORM, который превращает работу с базой данных из головной боли в удовольствие. Eloquent позволяет взаимодействовать с базой данных через элегантные модели, вместо написания сырых SQL-запросов.
Начнем с настройки подключения к базе данных. Откройте файл .env в корне проекта и укажите параметры подключения:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=my_blog
DB_USERNAME=root
DB_PASSWORD=password
Теперь создадим миграцию для таблицы постов блога:
php artisan make:migration create_posts_table
Откройте созданный файл в директории database/migrations и опишите структуру таблицы:
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('slug')->unique();
$table->text('content');
$table->string('image')->nullable();
$table->boolean('is_published')->default(false);
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}
Запустите миграцию, чтобы создать таблицу в базе данных:
php artisan migrate
Теперь создадим модель для работы с этой таблицей:
php artisan make:model Post
Откройте созданный файл app/Models/Post.php и настройте модель:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title',
'slug',
'content',
'image',
'is_published',
'user_id'
];
public function user()
{
return $this->belongsTo(User::class);
}
public function comments()
{
return $this->hasMany(Comment::class);
}
}
В Eloquent модели автоматически связываются с таблицами (по имени модели в единственном числе), а отношения между таблицами описываются через методы.
Теперь давайте посмотрим, как использовать модель в контроллере. Откройте app/Http/Controllers/BlogController.php:
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class BlogController extends Controller
{
public function index()
{
$posts = Post::where('is_published', true)
->orderBy('created_at', 'desc')
->paginate(10);
return view('blog.index', compact('posts'));
}
public function show(Post $post)
{
// Laravel автоматически найдет пост по ID
// Это называется Route Model Binding
return view('blog.show', compact('post'));
}
}
Обратите внимание на параметр Post $post в методе show() — это Route Model Binding, при котором Laravel автоматически ищет модель по ID из URL и передает ее в контроллер.
Вот несколько примеров работы с Eloquent, которые демонстрируют его мощь:
- Создание записи:
$post = Post::create(['title' => 'Новая статья', 'content' => '...']); - Обновление:
$post->update(['title' => 'Обновленный заголовок']); - Удаление:
$post->delete(); - Сложный запрос:
$posts = Post::with('user', 'comments')->where('is_published', true)->whereBetween('created_at', [$start, $end])->orderBy('title')->get(); - Использование отношений:
$comments = $post->comments;
Для проверки работы моделей и создания тестовых данных Laravel предлагает механизм сидинга. Создайте сидер для постов:
php artisan make:seeder PostSeeder
Откройте database/seeders/PostSeeder.php и добавьте:
public function run()
{
\App\Models\Post::factory(50)->create();
}
Также нужно создать фабрику для генерации тестовых данных:
php artisan make:factory PostFactory
В database/factories/PostFactory.php опишите, как должны выглядеть тестовые данные:
public function definition()
{
return [
'title' => $this->faker->sentence(),
'slug' => $this->faker->slug(),
'content' => $this->faker->paragraphs(5, true),
'image' => 'images/post-' . rand(1, 10) . '.jpg',
'is_published' => true,
'user_id' => \App\Models\User::factory(),
];
}
Наконец, запустите сидер, чтобы заполнить базу тестовыми данными:
php artisan db:seed --class=PostSeeder
Теперь у вас есть полноценная база данных с моделями и тестовыми данными. Работа с данными через Eloquent делает код чистым, читаемым и защищенным от SQL-инъекций. 📊
Создание функциональных страниц сайта на Laravel
После настройки базы данных и моделей пришло время создать функциональные страницы нашего сайта. В Laravel за это отвечает шаблонизатор 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', 'Мой блог на Laravel')</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<header class="bg-dark text-white py-3">
<div class="container">
<nav class="navbar navbar-expand-lg navbar-dark">
<a class="navbar-brand" href="{{ route('home') }}">Laravel Blog</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link" href="{{ route('home') }}">Главная</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('blog.index') }}">Блог</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('about') }}">О нас</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ route('contact') }}">Контакты</a>
</li>
</ul>
</div>
</nav>
</div>
</header>
<main class="py-4">
<div class="container">
@yield('content')
</div>
</main>
<footer class="bg-dark text-white py-3 mt-5">
<div class="container">
<div class="row">
<div class="col-md-6">
<p>© {{ date('Y') }} Laravel Blog</p>
</div>
<div class="col-md-6 text-end">
<a href="#" class="text-white me-3">Privacy Policy</a>
<a href="#" class="text-white">Terms of Service</a>
</div>
</div>
</div>
</footer>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
Теперь создадим страницу списка постов. Создайте файл resources/views/blog/index.blade.php:
@extends('layouts.app')
@section('title', 'Блог – Все посты')
@section('content')
<h1>Блог</h1>
<div class="row mt-4">
@forelse($posts as $post)
<div class="col-md-6 mb-4">
<div class="card">
@if($post->image)
<img src="{{ asset($post->image) }}" class="card-img-top" alt="{{ $post->title }}">
@endif
<div class="card-body">
<h5 class="card-title">{{ $post->title }}</h5>
<p class="card-text">{{ Str::limit($post->content, 150) }}</p>
<div class="d-flex justify-content-between align-items-center">
<a href="{{ route('blog.show', $post) }}" class="btn btn-primary">Читать далее</a>
<small class="text-muted">{{ $post->created_at->format('d.m.Y') }}</small>
</div>
</div>
</div>
</div>
@empty
<div class="col">
<div class="alert alert-info">
Пока нет опубликованных постов.
</div>
</div>
@endforelse
</div>
<div class="mt-4">
{{ $posts->links() }}
</div>
@endsection
А также страницу отдельного поста resources/views/blog/show.blade.php:
@extends('layouts.app')
@section('title', $post->title)
@section('content')
<div class="mb-4">
<a href="{{ route('blog.index') }}" class="btn btn-outline-secondary">« Назад к списку</a>
</div>
<article>
@if($post->image)
<img src="{{ asset($post->image) }}" class="img-fluid mb-4" alt="{{ $post->title }}">
@endif
<h1>{{ $post->title }}</h1>
<div class="text-muted mb-4">
Опубликовано: {{ $post->created_at->format('d.m.Y H:i') }}
| Автор: {{ $post->user->name }}
</div>
<div class="content">
{!! nl2br(e($post->content)) !!}
</div>
</article>
<hr class="my-5">
<h3>Комментарии ({{ $post->comments->count() }})</h3>
@forelse($post->comments as $comment)
<div class="card mb-3">
<div class="card-body">
<h6 class="card-subtitle mb-2 text-muted">{{ $comment->user->name }} | {{ $comment->created_at->format('d.m.Y H:i') }}</h6>
<p class="card-text">{{ $comment->content }}</p>
</div>
</div>
@empty
<div class="alert alert-light">
Пока нет комментариев. Будьте первым!
</div>
@endforelse
@auth
<div class="card mt-4">
<div class="card-body">
<h5 class="card-title">Добавить комментарий</h5>
<form action="{{ route('comments.store') }}" method="POST">
@csrf
<input type="hidden" name="post_id" value="{{ $post->id }}">
<div class="mb-3">
<textarea name="content" class="form-control" rows="3" required></textarea>
</div>
<button type="submit" class="btn btn-primary">Отправить</button>
</form>
</div>
</div>
@else
<div class="alert alert-info mt-4">
<a href="{{ route('login') }}">Войдите</a>, чтобы оставить комментарий.
</div>
@endauth
@endsection
Обратите внимание на директивы Blade:
- @extends — подключение родительского шаблона
- @section/@endsection — определение секций контента
- @forelse/@empty/@endforelse — цикл с проверкой на пустой массив
- @if/@else/@endif — условные конструкции
- @auth/@else/@endauth — проверка аутентификации пользователя
Для работы с комментариями нам понадобится создать соответствующую модель, миграцию и контроллер:
php artisan make:model Comment -mc
Эта команда создаст модель, миграцию и контроллер одновременно. В миграции определите структуру таблицы:
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->foreignId('post_id')->constrained()->onDelete('cascade');
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->text('content');
$table->timestamps();
});
}
В модели Comment определите отношения:
class Comment extends Model
{
protected $fillable = ['content', 'post_id', 'user_id'];
public function post()
{
return $this->belongsTo(Post::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
И наконец, реализуйте метод сохранения комментария в контроллере:
class CommentController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function store(Request $request)
{
$request->validate([
'content' => 'required|min:3',
'post_id' => 'required|exists:posts,id'
]);
Comment::create([
'content' => $request->content,
'post_id' => $request->post_id,
'user_id' => auth()->id()
]);
return back()->with('success', 'Комментарий добавлен');
}
}
Не забудьте добавить маршрут для сохранения комментария в routes/web.php:
Route::post('/comments', [CommentController::class, 'store'])->name('comments.store');
Для полноценного сайта вам также понадобится реализовать аутентификацию пользователей. Laravel предлагает готовое решение:
composer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev
Эти команды установят и настроят полноценную систему аутентификации с регистрацией, входом, восстановлением пароля и профилем пользователя. 👨💻
Создание сайта на Laravel — это не просто кодинг, а настоящее программное творчество. Фреймворк предоставляет вам идеальный баланс между структурой и свободой, позволяя писать элегантный, чистый код без лишних усилий. С каждым новым проектом вы будете открывать для себя новые возможности Laravel и понимать, почему тысячи разработчиков по всему миру выбирают именно этот инструмент для своих проектов. Не бойтесь экспериментировать, исследовать официальную документацию и участвовать в сообществе — это лучший способ стать профессионалом в Laravel-разработке.
Читайте также
- Продвижение сайта для начинающих: от базовых понятий до результата
- Как опубликовать сайт в интернете: пошаговая инструкция для новичков
- Создаем интерактивные сайты на JavaScript: руководство для новичков
- Как написать статью для блога: пошаговое руководство начинающим
- Удаленная работа веб-разработчиком: перспективы и возможности
- 5 шагов: как создать интернет-магазин без вложений и привлечь клиентов
- Создание сайта на Drupal: пошаговое руководство для новичков
- Разработка сайтов на .NET: от настройки среды до публикации
- Как создать сайт самостоятельно: пошаговое руководство для новичков
- Эффективная разработка сайта на Yii: от установки до публикации