Laravel в разработке на PHP: архитектура и практические примеры

Раздел: Разработка на PHP -> Фреймворки PHP

Основы работы с Laravel

Установка и создание нового проекта

Для начала работы с Laravel требуется PHP 8.1+ и Composer. Процесс установки выполняется одной командой:

composer create-project laravel/laravel my-app

Php symfony (фреймворк symfony на php)

После завершения в папке my-app появляется готовая структура каталогов. Для запуска встроенного сервера используется Artisan:

cd my-app
php artisan serve

Php laravel (laravel php фреймворк)

Приложение становится доступно по адресу http://localhost:8000. Данная команда удобна для локальной разработки, но не предназначена для продакшн-окружения.

Как определить маршрут для главной страницы?

Маршруты в Laravel хранятся в файле routes/web.php. Простейший маршрут, возвращающий строку:

Route::get('/', function () {
    return 'Привет, мир!';
});

Если требуется вернуть представление (Blade-шаблон), используется view():

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

Частая ошибка:

При изменении маршрутов не очищается кэш. Если маршруты не обновляются, выполните php artisan route:cache и php artisan route:clear.

Как создать контроллер и подключить его к маршруту?

Контроллер создаётся через Artisan:

php artisan make:controller PageController

Файл появляется в app/Http/Controllers. Пример метода index:

class PageController extends Controller
{
    public function index()
    {
        return view('home');
    }
}

Маршрут с привязкой к контроллеру:

Route::get('/home', [PageController::class, 'index']);

Проблема:

Если контроллер не найден, проверьте пространство имён и регистр имени файла. Laravel следует PSR-4, поэтому PageController должен находиться в файле PageController.php.

Как использовать Eloquent ORM для работы с базой данных?

Eloquent позволяет работать с таблицами как с объектами. После настройки подключения в .env, создаётся модель:

php artisan make:model Post -m

Флаг -m также создаёт миграцию. Пример миграции для таблицы posts:

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('content');
    $table->timestamps();
});

После выполнения php artisan migrate таблица создаётся. В модели Post можно указать связи, например, отношение к пользователю:

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

Типичная ошибка:

Имя таблицы в базе данных должно совпадать с множественной формой имени модели (по умолчанию posts). Если таблица называется иначе, укажите свойство protected $table = 'my_posts'; в модели.

Расширенные примеры использования Laravel

Работа с коллекциями и агрегатными запросами Eloquent

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

Пример
$posts = Post::with('user')
    ->withCount('comments')
    ->where('published', true)
    ->orderBy('created_at', 'desc')
    ->paginate(10);

foreach ($posts as $post) {
    echo $post->title . ' (' . $post->comments_count . ' комментариев) от ' . $post->user->name;
}
Первая запись (3 комментариев) от Иван
Вторая запись (1 комментарий) от Мария

Кастомная Artisan команда

Создадим команду для очистки старых логов:

Пример
php artisan make:command CleanLogs

Реализация:

Пример
protected $signature = 'logs:clean {days=30}';
protected $description = 'Удалить логи старше N дней';

public function handle()
{
    $days = $this->argument('days');
    $count = Log::where('created_at', '<', now()->subDays($days))->delete();
    $this->info("Удалено $count записей.");
}

Запуск:

Пример
php artisan logs:clean 7
Удалено 150 записей.

Middleware для ограничения доступа по ролям

Создадим middleware CheckRole:

Пример
php artisan make:middleware CheckRole

Код проверки:

Пример
public function handle(Request $request, Closure $next, $role)
{
    if ($request->user() && $request->user()->role !== $role) {
        abort(403, 'Нет прав доступа');
    }
    return $next($request);
}

Регистрация в Kernel.php и использование:

Пример
Route::get('/admin', function () {
    return view('admin');
})->middleware('role:admin');

Возможная проблема:

Middleware не вызывается, если маршрут объявлен в группе без явного указания. Убедитесь, что middleware добавлен в глобальный стек или применён к группе маршрутов.

Laravel PHP фреймворк - comments

En
Php laravel (php)