Урок 1. Laravel контроллеры

видим, самый верхний слой, там где обычно лежит html в Laravel называется view (вид, вьюха). Все вьюхи лежат по адресу resources/view. Давайте в этой папке создадим свою вьюху для отображения главной страницы: home.blade.php

Чтобы отправить пользователя по этому адресу мы должны указать путь до него. Это делается в файле роутов routes/web.php

Route::get(‘/’, function () {
return view(‘home’)
});

(При вызове любого статического метода у Route нужно попробовать из контейнера найти роутер вернуть этот объект роутер и вызвать у него метод get (фасад Router))

Метод view возвращает блейд по его названию, путь до папки и расшерние указывать не надо.
Во view можно передать вторым параметром массив с данными:

return view(‘home’, [‘id’=>10, ‘myid’=>12])

В блейде переменные из массива можно будет вызвать так:

{{ $id }}

Контроллеры

Обычно роуты передают управление контроллерам

Route::get(‘/posts’, [PostController::class, ‘index’]);

Первый параметр это путь, далее в массиве передаем название контроллера PostController::class и метод который у него надо вызвать ‘index’

namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
// Метод для отображения списка постов
public function index()
{
$posts = Post::all();
return view(‘posts.index’, compact(‘posts’));
}

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

При создании ресурсного контроллера создается сразу несколько адресов которые он способен обрабатывать. Обращение к ресурсному контроллеру в файле роутов выглядит так:

Route::resource(‘/posts’, PostController::class);

Действия ресурсного контроллера, и адреса которые он обрабатывает.

МетодURIДействиеИмя маршрутаРасшифровка действия
GET/postsindexposts.indexпоказать все
GET/posts/createcreateposts.createсоздать
POST/postsstoreposts.storeсохранить
GET/posts/{post}showposts.showпоказать конкретный
GET/posts/{post}/editeditposts.editотображение формы редактирования
PUT/PATCH/posts/{post}updateposts.updateсохранить редактирование
DELETE/posts/{post}destroyposts.destroyудалить

Пример кода ресурсного контроллера:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostsController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return ‘posts list’;
}

/**
 * Show the form for creating a new resource.
 */
public function create()
{
    //
    return 'post create form';
}

/**
 * Store a newly created resource in storage.
 */
public function store(Request $request)
{
    //
}

/**
 * Display the specified resource.
 */
public function show(Request $request, string $id)
{
    dump($request->get('a'));
    return $id;
}

/**
 * Show the form for editing the specified resource.
 */
public function edit(string $id)
{
    //
}

/**
 * Update the specified resource in storage.
 */
public function update(Request $request, string $id)
{
    //
}

/**
 * Remove the specified resource from storage.
 */
public function destroy(string $id)
{
    //
}

}

Во всех контроллерах присутствует use Illuminate\Http\Request — это объект который содержит в себе все что есть в запросе. Laravel перед тем как вызывать метод контроллера сам определяет что этому методу нужно. Это тема в php называется рефлексия.

Пример:

Laravel увидел что сейчас будет вызван /posts/{post}/edit, он создает экземпляр контроллера, но не сразу вызывает его метод edit. Он создает reflection класс, который узнает какие параметры хочет метод edit.

Например встречая код public function show(Request $request, Post $post) Laravel понимает что нужно создать экземпляр модели Post которая найдет по этому id сущность в базе.





Сервис провайдеры, контейнеры зависимостей и фасады в Ларе требуют знания ООП