Laravel: руководство по созданию мощных веб-приложений на PHP

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Начинающие и опытные 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:

  1. Откройте командную строку (Terminal или CMD)
  2. Перейдите в директорию, где хотите создать проект (например, cd C:\xampp\htdocs\)
  3. Выполните команду: composer create-project --prefer-dist laravel/laravel my-project
  4. Дождитесь завершения установки (это может занять несколько минут)
  5. Перейдите в папку проекта: cd my-project
  6. Запустите встроенный сервер: 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 и добавьте следующий код:

php
Скопировать код
Route::get('/', function () {
return view('welcome');
});

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

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

Это простейшие маршруты, которые возвращают статические шаблоны. Но настоящая мощь Laravel раскрывается при работе с контроллерами. Давайте создадим контроллер для блога:

Bash
Скопировать код
php artisan make:controller BlogController

Теперь добавим маршруты с использованием этого контроллера:

php
Скопировать код
Route::get('/blog', [BlogController::class, 'index'])->name('blog.index');
Route::get('/blog/{post}', [BlogController::class, 'show'])->name('blog.show');

Обратите внимание на метод name() — это позволяет давать маршрутам имена для последующего использования в приложении. Например, генерировать URL можно так:

php
Скопировать код
$url = route('blog.show', ['post' => 1]); // Вернет /blog/1

Laravel также поддерживает группировку маршрутов, что особенно полезно для создания административной панели:

php
Скопировать код
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

Теперь создадим миграцию для таблицы постов блога:

Bash
Скопировать код
php artisan make:migration create_posts_table

Откройте созданный файл в директории database/migrations и опишите структуру таблицы:

php
Скопировать код
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();
});
}

Запустите миграцию, чтобы создать таблицу в базе данных:

Bash
Скопировать код
php artisan migrate

Теперь создадим модель для работы с этой таблицей:

Bash
Скопировать код
php artisan make:model Post

Откройте созданный файл app/Models/Post.php и настройте модель:

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:

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 предлагает механизм сидинга. Создайте сидер для постов:

Bash
Скопировать код
php artisan make:seeder PostSeeder

Откройте database/seeders/PostSeeder.php и добавьте:

php
Скопировать код
public function run()
{
\App\Models\Post::factory(50)->create();
}

Также нужно создать фабрику для генерации тестовых данных:

Bash
Скопировать код
php artisan make:factory PostFactory

В database/factories/PostFactory.php опишите, как должны выглядеть тестовые данные:

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(),
];
}

Наконец, запустите сидер, чтобы заполнить базу тестовыми данными:

Bash
Скопировать код
php artisan db:seed --class=PostSeeder

Теперь у вас есть полноценная база данных с моделями и тестовыми данными. Работа с данными через Eloquent делает код чистым, читаемым и защищенным от SQL-инъекций. 📊

Создание функциональных страниц сайта на Laravel

После настройки базы данных и моделей пришло время создать функциональные страницы нашего сайта. В Laravel за это отвечает шаблонизатор Blade, который сочетает в себе простоту использования и мощные возможности.

Сначала создадим базовый шаблон, который будет использоваться всеми страницами. Создайте файл resources/views/layouts/app.blade.php:

HTML
Скопировать код
<!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>&copy; {{ 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:

HTML
Скопировать код
@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:

HTML
Скопировать код
@extends('layouts.app')

@section('title', $post->title)

@section('content')
<div class="mb-4">
<a href="{{ route('blog.index') }}" class="btn btn-outline-secondary">&laquo; Назад к списку</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 — проверка аутентификации пользователя

Для работы с комментариями нам понадобится создать соответствующую модель, миграцию и контроллер:

Bash
Скопировать код
php artisan make:model Comment -mc

Эта команда создаст модель, миграцию и контроллер одновременно. В миграции определите структуру таблицы:

php
Скопировать код
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 определите отношения:

php
Скопировать код
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);
}
}

И наконец, реализуйте метод сохранения комментария в контроллере:

php
Скопировать код
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:

php
Скопировать код
Route::post('/comments', [CommentController::class, 'store'])->name('comments.store');

Для полноценного сайта вам также понадобится реализовать аутентификацию пользователей. Laravel предлагает готовое решение:

Bash
Скопировать код
composer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev

Эти команды установят и настроят полноценную систему аутентификации с регистрацией, входом, восстановлением пароля и профилем пользователя. 👨‍💻

Создание сайта на Laravel — это не просто кодинг, а настоящее программное творчество. Фреймворк предоставляет вам идеальный баланс между структурой и свободой, позволяя писать элегантный, чистый код без лишних усилий. С каждым новым проектом вы будете открывать для себя новые возможности Laravel и понимать, почему тысячи разработчиков по всему миру выбирают именно этот инструмент для своих проектов. Не бойтесь экспериментировать, исследовать официальную документацию и участвовать в сообществе — это лучший способ стать профессионалом в Laravel-разработке.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой фреймворк рассматривается в руководстве?
1 / 5

Загрузка...