// app/Http/Controllers/PersonController.php
namespace App\Http\Controllers;
use App\Http\Presenters\PersonFieldSet;
use App\Http\Requests\PersonFormRequest;
use App\Repositories\PersonRepository;
class PersonController extends Controller
{
private $repository;
public function __construct(PersonRepository $repository)
{
$this->repository = $repository;
}
public function get(PersonFieldSet $fieldSet, $id)
{
$person = $this->repository->find($id);
// Set the form data from the $person entity
$fieldSet->setModel($person);
return view("form", [
// Pass in the form for the fieldset
"form" => $fieldSet->form(),
"title" => "Update Person"
]);
}
public function post(PersonFieldSet $fieldSet, PersonFormRequest $request, $id)
{
$person = $this->repository->find($id);
// Get the data for each form field
$data = $request->only($fieldSet->fieldNames());
$this->repository->update($person, $data);
return redirect("/people/{$person->id}");
}
}
// app/Http/Request/PersonFormRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use App\Http\Presenters\FieldSets\PersonFieldSet;
class PersonFormRequest extends FormRequest
{
public function rules(PersonFieldSet $fieldset)
{
return $fieldset->rules();
}
}
// app/Providers/AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use SmallHadronCollider\LaravelFormPresenter\FieldPresenter;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
FieldPresenter::presenter(function ($attrs) {
return view("forms/field", $attrs);
});
}
}
// app/Http/Presenters/PersonFieldSet.php
namespace App\Http\Presenters;
use SmallHadronCollider\LaravelFormPresenter\FieldSetPresenter;
class PersonFieldSet extends FieldSetPresenter
{
protected function fields()
{
return [
[
"name" => "first_name",
"type" => "text",
"label" => "First Name",
// Custom field property
"message" => "Enter you first name"
],
];
}
}
{{-- forms/field.blade.php --}}
<div class="form__group {{ $errors->has($field->name()) ? "form__group--error" : "" }}">
{!! $field->label(["class" => "form__label"]) !!}
@if ($errors->has($field->name()))
<span class="form__info">{{ $errors->first($field->name()) }}</span>
@endif
{{-- use custom message field - will return null if no value set --}}
<p class="form__message">{!! $field->message() !!}</p>
{!! $field->display(["class" => "form__control form__control--grouped form__control--{$field->type()}"]) !!}
</div>
// app/Providers/AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use SmallHadronCollider\LaravelFormPresenter\FieldPresenter;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
FieldPresenter::presenter(function ($attrs) {
return view("form-presenter::bootstrap", $attrs);
});
}
}
// app/Http/Presenters/Forms/Fields/Boolean.php
namespace App\Http\Presenters\Forms\Fields;
use Illuminate\Foundation\Testing\TestCase;
use Faker\Generator;
use SmallHadronCollider\LaravelFormPresenter\Fields\AbstractField;
use SmallHadronCollider\LaravelFormPresenter\Fields\FieldInterface;
class Boolean extends AbstractField implements FieldInterface
{
// The html to display for the label
public function label($attrs = [])
{
return $this->formBuilder->label($this->name, $this->label, $attrs);
}
// The html to display for the field
public function display($attrs = [])
{
return view("embellish::forms/boolean", [
"name" => $this->name,
"value" => $this->value() || $this->value() === null,
]);
}
// Test function for integration testing
public function test(TestCase $test, Generator $faker)
{
return mt_rand(0, 1) ? $test->check($this->name) : $test->uncheck($this->name);
}
}
// app/Providers/AppServiceProvider
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use SmallHadronCollider\LaravelFormPresenter\FieldPresenter;
use App\Http\Presenters\Forms\Fields\Boolean;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
// Add boolean field type
FieldPresenter::add("boolean", Boolean::class);
}
}
// tests\AddPersonTest.php
use TestCase;
use SmallHadronCollider\LaravelFormPresenter\PubliciseFormMethods;
use App\Http\Presenters\FieldSets\PersonFieldSet;
class AddPersonTest extends TestCase
{
// puts form filling methods (type(), select(), etc.) into public scope using __call()
use PubliciseFormMethods;
public function testPersonForm()
{
// create fieldset
$fieldset = new PersonFieldSet();
// visit page
$test = $this->visit("/admin/people/create");
// populate test form automatically, then submit
$fieldset->populateTest($test)->press("Create Person")->assertResponseOk();
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.