Как создать интернет-магазин на Laravel: Полное руководство

🔧 Что нужно для начала

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

  • PHP >= 8.1
  • Composer
  • Laravel (последняя версия)
  • MySQL или PostgreSQL
  • Node.js и npm (для фронтенда)
  • Laravel Mix / Vite (для сборки фронтенда)

Вы можете установить Laravel с помощью Composer:

composer create-project laravel/laravel shop
cd shop

🗂️ Архитектура интернет-магазина

Прежде чем писать код, определим основные модули интернет-магазина:

  1. Каталог товаров
  2. Карточка товара
  3. Корзина
  4. Оформление заказа
  5. Панель администратора
  6. Аутентификация пользователей
  7. Оплата (например, Stripe, PayPal)
  8. Email-уведомления

Шаг 1: Настройка базы данных

Откройте файл .env и настройте параметры подключения к базе данных:

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

Создайте БД:

CREATE DATABASE shop;

Шаг 2: Создание моделей и миграций

Создадим базовые сущности: ProductCategoryUserOrderOrderItemCart.

php artisan make:model Product -m
php artisan make:model Category -m
php artisan make:model Order -m
php artisan make:model OrderItem -m
php artisan make:model Cart -m

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

public function up()
{
Schema::create(‘products’, function (Blueprint $table) {
$table->id();
$table->string(‘name’);
$table->text(‘description’)->nullable();
$table->decimal(‘price’, 10, 2);
$table->unsignedBigInteger(‘category_id’);
$table->string(‘image’)->nullable();
$table->timestamps();

$table->foreign(‘category_id’)->references(‘id’)->on(‘categories’);
});
}

Аналогично создаём миграции для других таблиц.

Запускаем миграции:

php artisan migrate

Шаг 3: Роутинг и контроллеры

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

php artisan make:controller ProductController
php artisan make:controller CartController
php artisan make:controller OrderController
php artisan make:controller Admin/ProductController —resource

Пример маршрутов (routes/web.php):

use App\Http\Controllers\ProductController;
use App\Http\Controllers\CartController;
use App\Http\Controllers\OrderController;

Route::get(‘/’, [ProductController::class, ‘index’]);
Route::get(‘/product/{id}’, [ProductController::class, ‘show’]);

Route::post(‘/cart/add’, [CartController::class, ‘add’]);
Route::get(‘/cart’, [CartController::class, ‘index’]);
Route::post(‘/cart/remove’, [CartController::class, ‘remove’]);

Route::get(‘/checkout’, [OrderController::class, ‘checkout’])->middleware(‘auth’);
Route::post(‘/order’, [OrderController::class, ‘placeOrder’])->middleware(‘auth’);

Шаг 4: Каталог товаров

В ProductController:

public function index()
{
$products = Product::all();
return view(‘products.index’, compact(‘products’));
}

public function show($id)
{
$product = Product::findOrFail($id);
return view(‘products.show’, compact(‘product’));
}

Создайте представления в resources/views/products/:

  • index.blade.php
  • show.blade.php

Шаг 5: Корзина и оформление заказа

Для корзины можно использовать сессии:

public function add(Request $request)
{
$cart = session()->get(‘cart’, []);
$productId = $request->input(‘product_id’);
$quantity = $request->input(‘quantity’, 1);

if (isset($cart[$productId])) {
$cart[$productId][‘quantity’] += $quantity;
} else {
$product = Product::findOrFail($productId);
$cart[$productId] = [
‘name’ => $product->name,
‘price’ => $product->price,
‘quantity’ => $quantity,
];
}

session()->put(‘cart’, $cart);
return redirect()->back()->with(‘success’, ‘Товар добавлен в корзину!’);
}

Шаг 6: Оформление заказа

public function placeOrder(Request $request)
{
$cart = session(‘cart’);
if (!$cart) {
return redirect()->back()->with(‘error’, ‘Корзина пуста!’);
}

$order = new Order();
$order->user_id = auth()->id();
$order->total = collect($cart)->sum(fn($item) => $item[‘price’] * $item[‘quantity’]);
$order->save();

foreach ($cart as $productId => $item) {
OrderItem::create([
‘order_id’ => $order->id,
‘product_id’ => $productId,
‘quantity’ => $item[‘quantity’],
‘price’ => $item[‘price’],
]);
}

session()->forget(‘cart’);
return redirect(‘/’)->with(‘success’, ‘Заказ оформлен!’);
}

Шаг 7: Аутентификация

Laravel Breeze или Jetstream:

composer require laravel/breeze —dev
php artisan breeze:install
npm install && npm run dev
php artisan migrate

Шаг 8: Админ-панель

Создайте роуты в routes/web.php:

Route::middleware([‘auth’, ‘admin’])->prefix(‘admin’)->group(function () {
Route::resource(‘products’, \App\Http\Controllers\Admin\ProductController::class);
});

Создайте middleware admin:

php artisan make:middleware AdminMiddleware

public function handle($request, Closure $next)
{
if (!auth()->check() || !auth()->user()->is_admin) {
abort(403);
}

return $next($request);
}

Шаг 9: Подключение оплаты (например, Stripe)

Установите Stripe SDK:

composer require stripe/stripe-php

Создайте сервис оплаты и интегрируйте Stripe Checkout.

Шаг 10: Email уведомления

Используем встроенные уведомления Laravel:

php artisan make:notification OrderPlaced

В OrderController после оформления заказа:

auth()->user()->notify(new OrderPlaced($order));

Дополнительно

  • SEO (мета-теги, Sitemap)
  • Фильтры и поиск
  • Статистика
  • Мобильная адаптация
  • Vue.js / React для SPA

Заключение

Создание интернет-магазина на Laravel — это процесс, включающий в себя как backend, так и frontend разработку. Laravel предлагает мощные и удобные инструменты, которые позволяют быстро разрабатывать качественные e-commerce проекты.

Если вы только начинаете, можно использовать готовые пакеты, такие как:

  • Bagisto — полноценная eCommerce-платформа на Laravel
  • Aimeos — мощный e-commerce движок