Skip to content

Instantly share code, notes, and snippets.

@shrekuu
Last active September 4, 2018 07:13
Show Gist options
  • Save shrekuu/318aab262e97112d8d61c5998fdd33d6 to your computer and use it in GitHub Desktop.
Save shrekuu/318aab262e97112d8d61c5998fdd33d6 to your computer and use it in GitHub Desktop.
laravel pjax middleware; A pjax middleware for Laravel 5; dump error if server gives error
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Symfony\Component\DomCrawler\Crawler;
class FilterIfPjax
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$response = $next($request);
if (!$request->pjax() || $response->isRedirection()) {
return $response;
}
// avoid pjax middleware intercepting server error
try {
$this->filterResponse($response, $request->header('X-PJAX-CONTAINER'))
->setUriHeader($response, $request);
return $response;
} catch (\Exception $e) {
}
return $response;
}
protected function filterResponse(Response $response, $container)
{
$crawler = new Crawler($response->getContent());
$response->setContent(
$this->makeTitle($crawler) .
$this->fetchContainer($crawler, $container)
);
return $this;
}
protected function makeTitle($crawler)
{
$pageTitle = $crawler->filter('head > title')->html();
return "<title>{$pageTitle}</title>";
}
protected function fetchContainer(Crawler $crawler, $container)
{
$content = $crawler->filter($container);
if (!$content->count()) {
abort(422);
}
return $content->html();
}
protected function setUriHeader(Response $response, Request $request)
{
$response->header('X-PJAX-URL', $request->getRequestUri());
}
}
@ngrcode
Copy link

ngrcode commented Sep 4, 2018

which version of crawler must be installed?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment