Laravel 在 API 中设置 cookie 未设置

dan*_*agh 7 php laravel

我使用 laravel 5 作为 Rest API,我想在控制器中设置 cookie:

return response()->json(['success' => $data], $this-> successStatus)->cookie('name', 'myvalue');
Run Code Online (Sandbox Code Playgroud)

这样成功返回了response cookie,但是前面无法访问,我也用过:

Cookie::queue($name, $value);
Run Code Online (Sandbox Code Playgroud)

或者

Cookie::queue(Cookie::make('cookieName', 'value'));
Run Code Online (Sandbox Code Playgroud)

或者在谷歌、stackoverflow 中都可以,但这些都没有在浏览器中设置 cookie,我需要通过 laravel 控制器在浏览器中设置 http only cookie。我怎样才能做到这一点?

我也用了php cookie,没有成功

Haf*_*ari 2

Cookie 只会设置在web中间件组上api。根据文档,Laravel 附带了web一个api中间件组,其中包含您可能想要应用于 Web UI 和 API 路由的常见中间件:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        //...
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];
Run Code Online (Sandbox Code Playgroud)

如您所见,EncryptCookiesAddQueuedCookiesToResponse中间件仅应用于webgroup 而不是api.

// This works and sets encrypted cookie on response.
Route::group(['middleware' => ['web']], function () {
    return response()
        ->cookie('name', 'value');
});

// This won't set cookie on response.
Route::group(['middleware' => ['api']], function () {
    return response()
        ->cookie('name', 'value');
});
Run Code Online (Sandbox Code Playgroud)