Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决;VerifyCsrfToken.php中的ErrorException;在拉维尔_Php_Caching_Laravel_Middleware - Fatal编程技术网

如何解决;VerifyCsrfToken.php中的ErrorException;在拉维尔

如何解决;VerifyCsrfToken.php中的ErrorException;在拉维尔,php,caching,laravel,middleware,Php,Caching,Laravel,Middleware,这就是我的方法: 我运行以下PHP Artisan命令: php artisan make:middleware AfterCacheMiddleware php artisan make:middleware BeforeCacheMiddleware 然后,我更新了我新创建的中间件(AfterCacheMidleware和BeforCacheMidleware),如下所示: 后缓存中间件 在缓存中间件之前 此外,我已经在我的app/Http/Kernel.php中注册了这两个中间件 cl

这就是我的方法:

我运行以下PHP Artisan命令:

php artisan make:middleware AfterCacheMiddleware

php artisan make:middleware BeforeCacheMiddleware
然后,我更新了我新创建的中间件(
AfterCacheMidleware
BeforCacheMidleware
),如下所示:

后缓存中间件

在缓存中间件之前

此外,我已经在我的app/Http/Kernel.php中注册了这两个中间件

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 );
    }
}
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\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";
}]);
在第一个页面加载时,一切正常(因为页面不会被缓存)

在随后的访问中,我得到以下错误:
VerifyCsrfToken.php第76行中的ErrorException:尝试获取非对象的属性

我认为错误源于这一行:

if(Cache::has($key))返回Cache::get($key)

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 );
    }
}
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\Middleware\AfterCacheMiddleware',
'App\Http\Middleware\BeforeCacheMiddleware',

'cacheafter' => 'App\Http\Middleware\AfterCacheMiddleware',
'cachebefore' => 'App\Http\Middleware\BeforeCacheMiddleware',
但是我想不出来。试试看

<?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 );
    }

}

无需添加所有这些内容。如果你想更新标题信息,这些都很好

在您的beforecacheiddleware中:

if(Cache::has($key))返回Cache::get($key)

按照@Den的建议更改上述代码

 if( Cache::has( $key ) ) 
 { 
     $content=Cache::get( $key );
     return response($content);
}
这会奏效的。如果您有任何问题,请返回