Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Контроллеры

Пока маршрутов мало, код можно писать прямо в routes/web.php. Но с ростом проекта файл разрастается. Контроллер — это класс, в котором собраны обработчики запросов для одной части сайта, например для статей.

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

Контроллер создаётся командой Artisan:

php artisan make:controller PostController

Файл появится в app/Http/Controllers/PostController.php.

Метод контроллера

Каждый метод обрабатывает один запрос и возвращает ответ:

namespace App\Http\Controllers;
 
class PostController extends Controller
{
    public function index()
    {
        return 'Список статей';
    }
}

Привязка к маршруту

В маршруте указывают класс и имя метода:

use App\Http\Controllers\PostController;
 
Route::get('/posts', [PostController::class, 'index']);

Параметры маршрута

Параметр из адреса приходит в аргумент метода:

public function show(string $id)
{
    return "Статья $id";
}
Route::get('/posts/{id}', [PostController::class, 'show']);

Данные запроса

Чтобы прочитать данные формы или строки запроса, в аргументы добавляют объект Request — Laravel подставит его сам:

use Illuminate\Http\Request;
 
public function search(Request $request)
{
    $query = $request->input('q', '');
 
    return "Ищем: $query";
}

Второй аргумент input() — значение по умолчанию, если параметра нет.

Ресурсный контроллер

Для типового набора действий — список, просмотр, создание, изменение, удаление — есть готовая заготовка:

php artisan make:controller PostController --resource

Все семь маршрутов подключаются одной строкой:

Route::resource('posts', PostController::class);
Метод и адресМетод контроллера
GET /postsindex
GET /posts/createcreate
POST /postsstore
GET /posts/{post}show
GET /posts/{post}/editedit
PUT /posts/{post}update
DELETE /posts/{post}destroy

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

Если забыть строку use с контроллером в файле маршрутов, Laravel не найдёт класс и выдаст ошибку Target class [PostController] does not exist. Проверьте, что вверху routes/web.php есть use App\Http\Controllers\PostController;.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.