Inhalt
- Einführung
- Controller
- ExceptionHandler
- View
Einführung
Eigentlich sollte hier der 2. Teil des Kommentarsystems folgen, nur leider ist momentan die Zeit für den etwas komplexeren Artikel nicht vorhanden. Daher als Entschädigung ein kleinerer Artikel zur Exceptionbehandlung.
Bei dem Laravel Beauty Projekt, worauf dieser Blog basiert, gibt es die Möglichkeit Beiträge darzustellen, die noch nicht freigegeben wurden. Der Workaround ist sehr schnell und ohne viel Aufwand gemacht.
Controller
Durch die Prüfung, ob es sich um einen Entwurf handelt und der User eingeloggt ist, kann man schön eine Exception werfen. Die ModelNotFoundException ermöglicht quasi einen 404, dass der Beitrag nicht vorhanden ist.
// app\Http\Controllers\BlogController.php
// Füge in der Funktion showPost
// nach ->whereSlug($slug)
// ->firstOrFail(); folgendes ein
if($post->is_draft == 1 && Auth::check() === false)
{
throw new ModelNotFoundException();
}
// Falls das Kommentarsystem genutzt wird, dann bitte vor
// $post->comments = approved($post->comments, true);
// $post->replies = approved($post->replies, true);
ExceptionHandler
Durch die Anpassung der Rendermethode wird es möglich eine individuelle view für die Exception zu erstellen / nutzen.
// App/Exceptions/Handler
// Am Anfang einfügen
use Illuminate\Database\Eloquent\ModelNotFoundException;
// Render auf folgendes anpassen
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if($e instanceof ModelNotFoundException)
{
return response()->view('errors.custom', compact('e'));
}
return parent::render($request, $e);
}
View
Es sind alle Informationen vorhanden. Durch die Erstellung von custom.blade.php ist eine individuelle Fehlerausgabe möglich. Sie kann natürlich angepasst und optimiert werden.
// resources/views/errors/custom.blade.php
@extends('blog.layouts.error')
@section('page-header')
<header class="intro-header" style="background-image: url('{{ page_image(null) }}')">
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
<div class="post-heading">
<h1>Error</h1>
<h2 class="subheading">The page you are requested has caused an error. Please check the message for more details.</h2>
</div>
</div>
</div>
</div>
</header>
@stop
@section('content')
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
Your Article was not found on this Site.
</div>
</div>
</div>
@stop
Kurz und knapp. Für Anregungen oder Fehler schreibt einfach einen kleinen Kommentar. Bin für jede Verbesserung oder aber auch für jeden Vorschlag offen.
Viele Grüße
_ Cyrix _