【问题标题】:Cookies not working in Laravel?Cookie 在 Laravel 中不起作用?
【发布时间】:2022-04-08 21:39:20
【问题描述】:

当一个新用户访问我的网站时,我想将他们重定向到 /welcome 但只有一次,我想这样做我可以使用 cookie 并在他们访问欢迎页面后永久设置一个 cookie,然后检查 cookie 是否存在在将它们发送到 /welcome 之前。

这里我有一个基本控制器

class BaseController extends Controller
{
    public function __construct(Request $request) 
    {
        $this->checkWelcome($request);
    }

    private function checkWelcome(Request $request) {
        $currentRoute = Route::currentRouteName();

        if ($currentRoute != 'frontend.guest.welcome' && Cookie::get('visited_welcome') != '1') {
            header('location: ' . route('frontend.guest.welcome'));
            exit();
        }
    }
}

当发送到frontend.guest.welcome 时,它有一个到 WelcomeController 的路由

Route::get('/welcome', ['uses' => 'WelcomeController@getView', 'as' => 'frontend.guest.welcome']);

这里是 WelcomeController

class WelcomeController extends BaseController
{
    public function getView()
    {
        Cookie::forever('visited_welcome', '1');

        return view('frontend.guest.welcome');
    }
}

问题是,它不断地发送到 /welcome,不是一次而是总是。

【问题讨论】:

    标签: php laravel cookies


    【解决方案1】:

    尝试在 app\Http\Middleware\EncryptCookies.php 中排除你的 cookie

    class EncryptCookies extends Middleware
    {
        /**
         * The names of the cookies that should not be encrypted.
         *
         * @var array
         */
        protected $except = [
            'visited_welcome'
        ];
    }
    

    【讨论】:

      【解决方案2】:

      您没有在响应中返回 cookie,请将其附加到响应中,如下所示:

      public function checkWelcome(Request $request) {
      {
          if (!$request->cookie('visited_welcome')) {
              return redirect('frontend.guest.welcome')->withCookie(Cookie::forever('visited_welcome', '1'));
          }
      
          // otherwise proceed as normal
      }
      

      或者,您可以在 Cookie 门面上使用 queue 方法:

      Cookie::queue(Cookie::forever('visited_welcome', '1'));
      

      https://laravel.com/docs/5.5/responses#attaching-cookies-to-responses

      更好的方法可能是使用中间件,这样您就无需在控制器代码中实施任何检查。例如:

      // CheckIfFirstTimeVisit.php
      public function handle(Request $request, Closure $next)
      {
          if ($request->cookies->has('visited_welcome')) {
              return $request($next);
          }
      
          return response()->view('frontend.guest.welcome')
                           ->withCookie(Cookie::forever('visited_welcome', '1'));
      }
      

      【讨论】:

      • ILU。与这个斗争了几个小时。
      【解决方案3】:

      这样用

      <?php
      namespace App\Http\Controllers;
      use Illuminate\Http\Request;
      use Illuminate\Http\Response;
      use App\Http\Requests;
      use App\Http\Controllers\Controller;
      
      class CookieController extends Controller {
      
         /* below code a set a cookie in browser */
         public function setCookie(Request $request){
            $response = new Response('Hello World');
            $response->withCookie(cookie('name', 'Anything else'));
            return $response;
         }
         /* below code a get a cookie in browser */
         public function getCookie(Request $request){
            $value = $request->cookie('name');
            echo $value;
         }
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多