Laravel – formularze

  laravel

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>