Last active
July 7, 2020 09:40
-
-
Save Juhlinus/73176e11f5a65e61422831e9d71e0002 to your computer and use it in GitHub Desktop.
A more elegant way to handle validation in Inertia.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers; | |
use App\Http\Requests\StoreOrganization; | |
use App\Organization; | |
use Illuminate\Support\Facades\Auth; | |
use Illuminate\Support\Facades\Redirect; | |
use Illuminate\Support\Facades\Request; | |
use Inertia\Inertia; | |
class OrganizationsController extends Controller | |
{ | |
public function index() | |
{ | |
return Inertia::render('Organizations/Index', [ | |
'filters' => Request::all('search', 'trashed'), | |
'organizations' => Auth::user()->account->organizations() | |
->orderBy('name') | |
->filter(Request::only('search', 'trashed')) | |
->paginate() | |
->only('id', 'name', 'phone', 'city', 'deleted_at'), | |
]); | |
} | |
public function create() | |
{ | |
return Inertia::render('Organizations/Create'); | |
} | |
public function store(StoreOrganization $request) | |
{ | |
Auth::user()->account->organizations()->create( | |
$request->validated() | |
); | |
return Redirect::route('organizations')->with('success', 'Organization created.'); | |
} | |
public function edit(Organization $organization) | |
{ | |
return Inertia::render('Organizations/Edit', [ | |
'organization' => [ | |
'id' => $organization->id, | |
'name' => $organization->name, | |
'email' => $organization->email, | |
'phone' => $organization->phone, | |
'address' => $organization->address, | |
'city' => $organization->city, | |
'region' => $organization->region, | |
'country' => $organization->country, | |
'postal_code' => $organization->postal_code, | |
'deleted_at' => $organization->deleted_at, | |
'contacts' => $organization->contacts()->orderByName()->get()->map->only('id', 'name', 'city', 'phone'), | |
], | |
]); | |
} | |
public function update(Organization $organization) | |
{ | |
$organization->update( | |
Request::validate([ | |
'name' => ['required', 'max:100'], | |
'email' => ['nullable', 'max:50', 'email'], | |
'phone' => ['nullable', 'max:50'], | |
'address' => ['nullable', 'max:150'], | |
'city' => ['nullable', 'max:50'], | |
'region' => ['nullable', 'max:50'], | |
'country' => ['nullable', 'max:2'], | |
'postal_code' => ['nullable', 'max:25'], | |
]) | |
); | |
return Redirect::back()->with('success', 'Organization updated.'); | |
} | |
public function destroy(Organization $organization) | |
{ | |
$organization->delete(); | |
return Redirect::back()->with('success', 'Organization deleted.'); | |
} | |
public function restore(Organization $organization) | |
{ | |
$organization->restore(); | |
return Redirect::back()->with('success', 'Organization restored.'); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Requests; | |
use App\Exceptions\ValidatedException; | |
use Illuminate\Foundation\Http\FormRequest; | |
class StoreOrganization extends FormRequest | |
{ | |
/** | |
* Get the validation rules that apply to the request. | |
* | |
* @return array | |
*/ | |
public function rules() | |
{ | |
return [ | |
'name' => ['required', 'max:100'], | |
'email' => ['nullable', 'max:50', 'email'], | |
'phone' => ['nullable', 'max:50'], | |
'address' => ['nullable', 'max:150'], | |
'city' => ['nullable', 'max:50'], | |
'region' => ['nullable', 'max:50'], | |
'country' => ['nullable', 'max:2'], | |
'postal_code' => ['nullable', 'max:25'], | |
]; | |
} | |
/** | |
* Handle a passed validation attempt. | |
* | |
* @return void | |
*/ | |
public function passedValidation() | |
{ | |
if ($this->request->get('validate', false)) { | |
throw new ValidatedException(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Exceptions; | |
use Exception; | |
use Illuminate\Http\Request; | |
use Illuminate\Support\Facades\Redirect; | |
class ValidatedException extends Exception | |
{ | |
/** | |
* Render the exception into an HTTP response. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @return \Illuminate\Http\Response | |
*/ | |
public function render(Request $request) | |
{ | |
return Redirect::back(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
After some docs-diving I realized that we don't need to modify anything in the handler.
The
render
method is called on each exception by the handler, so all we have to do is define it and add the redirect.I've updated the files accordingly.