Injecting entities
One can reference entities by passing a specific field for the given object spec. The following template assigns the key “task” with the task ID, which the GET request can intercept.
@extends('layouts.app')
@section('title', 'Task list')
@section('content')
@forelse($tasks as $theTask)<li><a href=""></a></li>
@empty
<div>No tasks presented</div>
@endforelse
@endsection
The route “tasks.index” would be defined as follows. Note the name of the parameter is the same as that passed.
Route::get('/blade/{task}', function (Task $task) {
// attempt to return the entity, or return a 404 if null
return view('show', ['task' => $task]);
})->name('tasks.index');
Similarly, one can invoke an edit screen for the task, via a PUT request.
@extends('layouts.app')
@section('title', 'Edit task')
@section('styles')
<style>
.error-message {
color: red;
font-size: 0.8rem;
}
</style>
@endsection
@section('content')
<form method="POST" action="">
@csrf@method('PUT')
<div>
<label for="title">
Task title
</label>
<input name="title" id="title" value=""/>
</div>
@error('title')
<p class="error-message">
</p>
@enderror
<div>
<label for="description">
Description
</label>
<textarea name="description" id="description" rows="5">
</textarea>
</div>
@error('description')
<p class="error-message">
</p>
@enderror
<div>
<label for="long_description">
Long description
</label>
<textarea name="long_description" id="long_description" rows="10">
</textarea>
</div>
@error('long_description')
<p class="error-message">
</p>
@enderror
<div>
<button type="submit">Edit task</button>
</div>
</form>
@endsection
The route would then take the following definition:
Route::put('/blade/{task}', function (Request $request, Task $task) {
$data = $request->validate([
'title' => 'required|max:255',
'description' => 'required',
'long_description' => 'required',
]);
// Laravel will automatically return a 404
// still don't need the Model definition
$task->title = $data['title'];
$task->description = $data['description'];
$task->long_description = $data['long_description'];
// this handles save/update db transaction automatically
$task->save();
// save key-value "success":"Task created!" to session, flash as message, and then remove the key-value pair from
// the session
return redirect()->route('tasks.show', ['task' => $task])
->with('success', 'Task updated!');
})->name('tasks.update');