Laravel – гайд по выживанию
Шрифт:
zombies table
Совет: Laravel автоматически управляет полями updated_at и created_at, если они существуют, регистрируя временные метки для новых добавленных строк и любых обновлений. Данные поля не нужно создавать. При написании миграции достаточно добавить timestamps, но об этом позже.
Предположим, что у нас есть эта таблица в нашей базе данных. В одной из следующих глав мы обсудим миграции, которые позволяют нам легко создавать таблицы базы данных через наш код.
Теперь, когда вышеупомянутая таблица создана, мы можем взаимодействовать с базой данных с помощью Eloquent.
Eloquent, ORM (Object-Relational Mapper) в Laravel, упрощает и украшает работу с базой данных. Вспомним код из предыдущего раздела:
<?php
use App\Models\Zombie; Route::get('/zombie/{id}', function($id){
$zombie = Zombie::find($id);
echo 'Name: ' . $zombie->name . '<br />';
echo 'Strength: ' . $zombie->strength . '<br />'; echo 'Health: ' . $zombie->health . '<br />';
});
Если раньше наше приложение не могло найти класс Zombie, то с появлением модели мы можем обращаться к нему без проблем.
Стоит отметить, что, вызывая Zombie, мы обращаемся именно к классу Zombie, расположенному по адресу App\Models\Zombie. Это понятие известно, как пространство имен, которое мы рассмотрим в одной из следующих глав.
Тем не менее, препятствие все еще существует.
Не имея в базе данных ни одного зомби, мы не можем получить доступ к упомянутому выше маршруту. Поэтому давайте создадим нового зомби по приведенному ниже маршруту:
<?php
Route::get('/admin/zombies/create', function{
echo '<form method="POST" action="/admin/zombies/create">
<input type="text" name="name" placeholder="Name"><br>
<input type="text" name="strength" placeholder="Strength"><br>
<input type="text" name="health" placeholder="Health"><br>
<input type="hidden" name="_token" value="' . csrf_token . '">
<input type="submit" value="Create New Zombie">
</form>';
});
При посещении этого маршрута в браузере (site.com/admin/zombies/create) отображается простая форма.
При отправке формы данные публикуются в файл
site.com/admin/zombies/create POST-маршрут, который должен выглядеть следующим образом:
<?php
Route::post('/admin/zombies/create', function {
// создаем нового зомби
});
Добавив следующую реализацию:
<?php
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 позволяет использовать более лаконичный подход:
<?php
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'];
Переделанный класс выглядит следующим образом:
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model; class Zombie extends Model {
protected $table = 'zombies';
protected $fillable = ['name', 'strength', 'health'];
}
Теперь, без ошибки массового присвоения, можно без труда создать еще одного зомби без особых усилий.