Такова основная структура приложения Laravel. По мере дальнейшей работы с Laravel все это станет для вас более привычным.
Отличная работа! Вам понравится работать с Laravel. Засучим рукава и углубимся в работу с кодом.
2. Маршрутизация
Надежная система маршрутизации имеет решающее значение для выживания. Как опытный выживальщик находит верный путь к безопасности, так и мощная система маршрутизации гарантирует, что пользователь никогда не заблудится и всегда достигнет желаемого пункта назначения.
Обзор маршрутизации
Чтобы убедиться в том, что все находятся на одной волне, давайте сначала разберемся, что такое маршрутизация приложений.
Маршрут можно представить себе, как подобие дороги. Например, "Мы ехали по дороге (маршруту), чтобы добраться до кладбища". Маршрут определяет, как вы добираетесь из одного места в другое. Когда вы набираете URL-адрес веб-сайта, например, site.com/graveyard, вы сообщаете браузеру, что кладбище это маршрут, по которому вы хотите проехать. Затем приложение говорит: "Хорошо, вы хотите отправиться на "кладбище"? Вот вывод, который я получил для маршрута "graveyard".
Создание маршрута с помощью Laravel довольно простое:
Route::get('graveyard', function(){
echo 'Добро пожаловать на кладбище!';
});
Здесь создается маршрут для страницы "кладбище". Приложение, получив запрос на "get" маршрута "graveyard", выполнит функцию и выдаст сообщение "Добро пожаловать на кладбище!".
Маршрутизация в Laravel
Наша маршрутизация в Laravel находится по адресу routes\web.php. Именно здесь мы будем добавлять все маршруты для нашего приложения.
В принципе, у нас есть четыре типа маршрутов: POST, GET, PUT и DELETE. Они выглядят следующим образом:
Route::post('/zombie', function () {
echo "We want to create a new zombie";
});
Route::get('/zombie', function () {
echo 'We want to read or view a zombie';
});
Route::put('/zombie', function () {
echo "We want to update an existing zombie";
});
Route::delete('/zombie', function () {
echo "We want to destroy a zombie";
});
Эти методы POST, GET, PUT и DELETE являются частью архитектуры RESTful, каждый из которых отражает определенное действие:
POST: Создание сущности (Create).
GET: Чтение сущности или нескольких сущностей (Read).
PUT: Обновить сущность (Update).
DELETE: удаление сущности (Delete).
Эта техника также называется CRUD (Create, Read, Update, Delete).
Чаще всего мы будем использовать метод GET, но есть также маршрут, который можно использовать для получения любого метода:
Route::any('/zombie', function () {
echo "Any request from this zombie route";
});
Отлично!
Итак, как мы инициируем наши маршруты из браузера? В большинстве случаев мы используем GET-запрос. Введя site.com/zombie, мы получаем функцию GET. Но как насчет передачи данных?
Легко! Для этого подойдет HTML-форма, подобная этой:
При нажатии кнопки submit на этой форме данные будут отправлены на POST-маршрут site.com/zombie.
Обратите внимание на передачу @csrf и дополнительного указания метода. Указание метода необходимо из-за того, что в HTTP не существует метода PATCH. Таким образом мы даем понять Laravel, какое именно действие нужно совершить с данными из этой формы.
Пример быстрой маршрутизации
Представьте, что перед вами стоит задача убить (удалить) зомби-изгоя! Сначала необходимо создать форму:
На ней отображается кнопка "Уничтожить". Для простоты мы жестко задали идентификатор 2, который, как правило, зависит от конкретного зомби.
Далее, давайте составим маршрут:
use Illuminate\Http\Request;
Route::delete('/zombie', function(Request $request){
$id = $request->id; Zombie::destroy($id);
});
И вот уже нет проблемного зомби с идентификатором 2! Обратите внимание на включение класса Request из Laravel, который перехватывает данные запроса. Вам придется не забыть объявить пространство имен, когда вы захотите использовать объект запроса.
Внимание! Этот пример пока не будет полностью рабочим, так как наша база данных и модели еще находятся в процессе создания. Мы займемся этим в ближайшее время.
Мы использовали закрытие маршрутов. Далее обсудим разницу между закрытием маршрутов и контроллерами маршрутов.
Закрытие маршрута и действия контроллера маршрута
Закрытие маршрута это непосредственная функция, содержащая код, как показано здесь:
Route::get('/zombie', function(){
echo 'Greetings from the Zombie Page!';
});
Для действия контроллера маршрута мы указываем, какой метод контроллера следует вызвать:
Route::get('/zombie', [ZombieController::class, 'index']);
Обращение к /zombie вызывает метод index в ZombieController.
Более подробно мы рассмотрим контроллеры в ближайшее время. Запомните эти различия, и они станут более понятными.
Параметры маршрута
Иногда маршруты требуют параметров.
Например, для просмотра конкретного зомби по адресу site.com/zombie/5 требуется включить в маршрут параметр:
Route::get('/zombie/{id}', function($id){
echo "You've encountered a zombie with ID: " . $id;
});
Если наши модели и база данных работают, то это позволит получить и отобразить информацию о конкретном зомби:
Route::get('/zombie/{id}', function($id){
$zombie = Zombie::find($id);
echo 'Name: ' . $zombie->name . '
';
echo 'Strength: ' . $zombie->strength . '
'; echo 'Health: ' . $zombie->health . '
';
});
Напоминаем, что наша настройка не завершена, поэтому данный пример пока не будет работать идеально. С учетом сказанного, в следующей теме мы рассмотрим все это вместе.
3. Модели
Зомби-разработчики часто используют сложные запросы, которые могут привести к плохому и зараженному коду. Как разработчик Laravel, мы должны поддерживать наши запросы сильными и здоровыми.
Что же такое модели?
В Laravel модель это PHP-класс, который управляет взаимодействием между кодом вашего приложения и базой данных. Расширение класса Laravel Eloquent Model позволяет сделать эти взаимодействия простыми и понятными.
Модель Zombie
Возьмем, к примеру, модель Zombie, которая будет размещена по адресу /app/Models/Zombie.php:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Zombie extends Model {
protected $table = 'zombies';
}
Этот код сообщает Laravel, что класс Zombie соответствует таблице zombies в вашей базе данных. Гипотетическая таблица zombies может выглядеть следующим образом:
zombies table
Совет: Laravel автоматически управляет полями updated_at и created_at, если они существуют, регистрируя временные метки для новых добавленных строк и любых обновлений. Данные поля не нужно создавать. При написании миграции достаточно добавить timestamps(), но об этом позже.
Предположим, что у нас есть эта таблица в нашей базе данных. В одной из следующих глав мы обсудим миграции, которые позволяют нам легко создавать таблицы базы данных через наш код.
Теперь, когда вышеупомянутая таблица создана, мы можем взаимодействовать с базой данных с помощью Eloquent.
Eloquent: ORM в Laravel
Eloquent, ORM (Object-Relational Mapper) в Laravel, упрощает и украшает работу с базой данных. Вспомним код из предыдущего раздела:
use App\Models\Zombie;
Route::get('/zombie/{id}', function($id){
$zombie = Zombie::find($id);
echo 'Name: ' . $zombie->name . '
';
echo 'Strength: ' . $zombie->strength . '
'; echo 'Health: ' . $zombie->health . '
';
});
Если раньше наше приложение не могло найти класс Zombie, то с появлением модели мы можем обращаться к нему без проблем.
Стоит отметить, что, вызывая Zombie, мы обращаемся именно к классу Zombie, расположенному по адресу App\Models\Zombie. Это понятие известно, как пространство имен, которое мы рассмотрим в одной из следующих глав.
Тем не менее, препятствие все еще существует.
Не имея в базе данных ни одного зомби, мы не можем получить доступ к упомянутому выше маршруту. Поэтому давайте создадим нового зомби по приведенному ниже маршруту:
Route::get('/admin/zombies/create', function(){
echo '
});
При посещении этого маршрута в браузере (site.com/admin/zombies/create) отображается простая форма.
При отправке формы данные публикуются в файл
site.com/admin/zombies/create POST-маршрут, который должен выглядеть следующим образом:
Route::post('/admin/zombies/create', function () {
// создаем нового зомби
});
Добавив следующую реализацию:
use App\Models\Zombie;
use Illuminate\Http\Request;
Route::post('/admin/zombies/create', function(Request $request){
// instantiate a new zombie
$zombie = new Zombie();
$zombie->name = $request->name;
$zombie->strength = $request->strength;
$zombie->health = $request->health;
$zombie->save();
echo 'Zombie Created';
});
И затем отправить форму со следующими данными:
Имя: Johnny Bullet Holes
Strength: Сильный
Здоровье: 70
Вы получите сообщение 'Zombie Created'. При просмотре нашей базы данных обнаруживается новая запись.
Впечатляет, не правда ли? Однако вместо того, чтобы вручную указывать имя, силу и здоровье, Laravel позволяет использовать более лаконичный подход:
use App\Zombie;
use Illuminate\Http\Request;
Route::post('/admin/zombies/create', function(Request $request){
// instantiate a new zombie using posted data
$zombie = Zombie::create($request->all());
echo 'Zombie Created';
});
При попытке использовать этот маршрут может возникнуть ошибка 'MassAssignmentException'. Это означает, что мы пытаемся выполнить массовое назначение классу "Зомби", не указав допустимые поля. В Laravel такая защита предусмотрена по умолчанию.
Чтобы разрешить массовое присвоение для атрибутов имени, силы и здоровья в нашем классе Zombie, просто добавьте:
protected $fillable = ['name', 'strength', 'health'];
Переделанный класс выглядит следующим образом:
use Illuminate\Database\Eloquent\Model; class Zombie extends Model {
protected $table = 'zombies';
protected $fillable = ['name', 'strength', 'health'];
}
Теперь, без ошибки массового присвоения, можно без труда создать еще одного зомби без особых усилий.
Предположим, что мы создали еще одного зомби:
Имя: Ted Manwalking
Strength: Слабый
Здоровье: 90
Тогда в нашей базе данных появятся следующие записи:
Eloquent значительно облегчает процессы создания, чтения, обновления и удаления записей в базе данных. Далее мы рассмотрим отношения, облегчающие связывание данных между таблицами базы данных.