Кэширование. Как устранить & quot; ErrorException в VerifyCsrfToken.php & quot; в Ларавеле

Это был мой подход:

Я запускаю следующее PHP Artisan команды:

php artisan make:middleware AfterCacheMiddleware

php artisan make:middleware BeforeCacheMiddleware

Затем я обновил свои недавно созданные промежуточные программы (AfterCacheMiddleware а также BeforeCacheMiddleware) как показано ниже:

AfterCacheMiddleware

class AfterCacheMiddleware  {

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);

$key = $this->keygen($request->url());

if( ! Cache::has( $key ) ) Cache::put( $key, $response->getContent(), 1 );

return $response;
}

protected function keygen( $url )
{
return 'route_' . Str::slug( $url );
}
}

BeforeCacheMiddleware

namespace App\Http\Middleware;

use Closure;
use Cache;
use Str;

class BeforeCacheMiddleware {

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$key = $this->keygen($request->url());

if( Cache::has( $key ) ) return Cache::get( $key );

return $next($request);
}

protected function keygen( $url )
{
return 'route_' . Str::slug( $url );
}
}

Кроме того, я зарегистрировал оба промежуточного программного обеспечения в моем app/Http/Kernel.php

'App\Http\Middleware\AfterCacheMiddleware',
'App\Http\Middleware\BeforeCacheMiddleware',

'cacheafter' => 'App\Http\Middleware\AfterCacheMiddleware',
'cachebefore' => 'App\Http\Middleware\BeforeCacheMiddleware',

Ниже мой маршрут:

Route::get('middle', ['middleware' => 'cachebefore','cacheafter', function()
{
echo "success";
}]);

На первой странице загрузки все нормально (потому что страница не кэшируется).

При последующем доступе я получаю эту ошибку: ErrorException in VerifyCsrfToken.php line 76: Trying to get property of non-object.

Я думаю, что ошибка происходит из этой строки:

if( Cache::has( $key ) ) return Cache::get( $key );

но я не могу понять это.

2

Решение

Нет необходимости добавлять все эти вещи. Это хорошо иметь, если вы хотите обновить информацию заголовка тоже.

В вашем ПО до кэширования:

if( Cache::has( $key ) ) return Cache::get( $key );

Измените приведенный выше код в соответствии с предложением @Den

 if( Cache::has( $key ) )
{
$content=Cache::get( $key );
return response($content);
}

Это будет работать Вернитесь назад, если у вас есть какие-либо проблемы.

1

Другие решения

Попытайся.

<?php namespace App\Http\Middleware;

use Closure;
use Cache;
use Illuminate\Support\Str;
use Event;

class AfterCacheMiddleware {

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{

/* Event::listen('illuminate.query', function($query)
{

var_dump($query);

return false;
});*/

$response = $next($request);

$key = $this->keygen($request->url());
$key2 = $this->keygen($request->url()).'_2';

if( ! Cache::has( $key ) )
{

Cache::put( $key, $response->getContent(), 1 );

Cache::put( $key2, $response->headers, 1);
}

return $next($request);
}

protected function keygen( $url )
{
return 'route_' . Str::slug( $url );
}

}<?php namespace App\Http\Middleware;

use Closure;
use Cache;
use Illuminate\Support\Str;

class BeforeCacheMiddleware {

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{

$key = $this->keygen($request->url());
$key2 = $this->keygen($request->url()).'_2';

if( Cache::has( $key )&& Cache::has( $key2 ) )
{
$content=Cache::get( $key );
$header=Cache::get( $key2 );

$header=explode('Cache-Control:',$header);
$header1=explode('Content-Type:',$header[1]);
$header2=explode('Date:',$header1[1]);
$header3=explode('Set-Cookie:',$header2[1]);

$CacheControl=trim($header1[0]);
$ContentType=trim($header2[0]);
$Date=trim($header3[0]);
$SetCookie=trim($header3[1]);

return response($content)
->header('Cache-Control',$CacheControl)
->header('Content-Type',$ContentType)
->header('Date',$Date)
->header('Set-Cookie',$SetCookie);

}return $next($request);
}

protected function keygen( $url )
{
return 'route_' . Str::slug( $url );
}

}
1

По вопросам рекламы [email protected]