Laravel в разработке на PHP: архитектура и практические примеры
Основы работы с Laravel
Установка и создание нового проекта
Для начала работы с Laravel требуется PHP 8.1+ и Composer. Процесс установки выполняется одной командой:
composer create-project laravel/laravel my-appPhp symfony (фреймворк symfony на php)
После завершения в папке my-app появляется готовая структура каталогов. Для запуска встроенного сервера используется Artisan:
cd my-app
php artisan servePhp 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 добавлен в глобальный стек или применён к группе маршрутов.