Zabezpieczenie formularza tokenem
{{ csrf_field() }}
W routes funkcja zapisu odnosi się do parenta i zmieniamy typ na post
Route::get('/posts/create', 'PostController@create' );
Route::post('/posts', 'PostController@store');
Ewentualnie w routes dajemy coś takiego:
Route::post('/save', [
'uses' => 'SitesController@save',
'as' => 'sites.save'
])
a w formularzu akcję podpinamy tak, jak poniżej. Daje nam to elastyczność, gdybyśmy w routes zmieniali ścieżkę zapisu formularza (bo np doszło sporo podstron i sobie to organizujemy inaczej), to nie trzeba w formularzu już nic zmieniać, bo będzie działał.
<form action="{{route('sites.save')}}" method="POST">
</form>
Funkcja zapisu
u góry dajemy
use App\Post
i dalej w controllerze
public function store() {
$post = new Post;
$post->title = request('title');
$post->body = request('body');
$post->save();
//redirect to the homepage when saved
return redirect('/');
}
Druga metoda zapisu
Post::create([
'title' => request('title'),
'body' => request('body')
]);
oraz jej skrócona wersja
Post::create(request(['title', 'body']));
ale wtedy trzeba zdefiniować w modelu, które wartości będziemy mogli zapisywać (kwestia bezpieczeństwa). Jeżeli tego nie zrobimy, zapis wywali błąd. A oto, jak definiujemy wartości możliwe do zapisu: atrybut musi nazywać się fillable
class Post extends Model
{
protected $fillable = ['title', 'body'];
}
Dodawanie komentarzy do postów
public function addComment($body) {
Comment::create([
'body' => $body,
'post_id' => $this->id
]);
//lub tak szybciej
//$this->comments()->create(['body' => $body]);
}
szybsza metoda stworzenia nowego komentarza używa funkcji comments, która w moldelu posts wskazuje relację jeden do wielu. Dzięki tej relacji eloquent model wie, jak zapisać te dane i że w ogóle trzeba je zapisać. To jest trochę sick. Do tego w metodzie create można puścić normalnego compact
to wyżej w modelu post. No i w CommentsController:
$post->addComment(request('body'));
Formularz edycji
https://laracasts.com/discuss/channels/laravel/laravel-54-best-way-to-prefill-from-inputs?page=1
<input value="{{ old('name', $project->name) }}" name="name" type="text" class="form-control" required>