Laravel Restful Api:会话未提交



我正在使用Laravel 5.8,我想构建我自己的API。

基本上,我已经制作了这个API控制器方法,用于注册手机号码的新用户:

public function register(Request $request)
{
// Validation Data
$validData = $this->validate($request, [
'user_input' => 'required|unique:users,usr_name|unique:members,mbr_mobile|regex:/^09d{9}$/|max:11|min:11',
]);

session(['user_phone_number' => $request->input('user_input')]);
// dd(session('user_phone_number')) properly returns the entered phone number

$sms = new SendSms(request()->all()['user_input'],43,request()->all());
$sms->send();

return response([
'data' => 'Verification code has been sent',
'status' => 200
]);
}

它运行良好,并正确地向用户的手机号码发送验证码。

正如你在代码中看到的,我调用了一个会话变量,并将其分配给用户的手机号码:

session(['user_phone_number' => $request->input('user_input')]);

现在为了验证代码,我添加了这个方法:

public function verifyCode(Request $request)
{
dd(session('user_phone_number'));
}

但现在的问题是,dd(session('user_phone_number'))verfiyCode方法中以某种方式返回null

因此,我没有用于验证代码的用户电话号码。

所以,如果你知道我如何将用户电话号码作为会话正确发送到另一种方法(或任何其他方式(,请告诉我。。。


更新#1:

以下是我的api路线:

Route::prefix('v1')->namespace('Apiv1')->group(function(){     
Route::post('register','UserController@register');  
Route::post('verify-code','UserController@verifyCode');
});

更新#2:

这是我的session.php:

<?php
use IlluminateSupportStr;
return [
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
|            "memcached", "redis", "dynamodb", "array"
|
*/
'driver' => env('SESSION_DRIVER', 'file'),
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => true,
/*
|--------------------------------------------------------------------------
| Session Encryption
|--------------------------------------------------------------------------
|
| This option allows you to easily specify that all of your session data
| should be encrypted before it is stored. All encryption will be run
| automatically by Laravel and you can use the Session like normal.
|
*/
'encrypt' => false,
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/
'files' => storage_path('framework/sessions'),
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => env('SESSION_CONNECTION', null),
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/
'table' => 'sessions',
/*
|--------------------------------------------------------------------------
| Session Cache Store
|--------------------------------------------------------------------------
|
| When using the "apc", "memcached", or "dynamodb" session drivers you may
| list a cache store that should be used for these sessions. This value
| must match with one of the application's configured cache "stores".
|
*/
'store' => env('SESSION_STORE', null),
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => [2, 100],
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/
'path' => '/',
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/
'domain' => env('SESSION_DOMAIN', null),
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/
'secure' => env('SESSION_SECURE_COOKIE', false),
/*
|--------------------------------------------------------------------------
| HTTP Access Only
|--------------------------------------------------------------------------
|
| Setting this value to true will prevent JavaScript from accessing the
| value of the cookie and the cookie will only be accessible through
| the HTTP protocol. You are free to modify this option if needed.
|
*/
'http_only' => true,
/*
|--------------------------------------------------------------------------
| Same-Site Cookies
|--------------------------------------------------------------------------
|
| This option determines how your cookies behave when cross-site requests
| take place, and can be used to mitigate CSRF attacks. By default, we
| do not enable this as other CSRF protection services are in place.
|
| Supported: "lax", "strict"
|
*/
'same_site' => null,
];

会话标识符通过cookie传输。默认情况下,cookie名称为laravel_session

这意味着,如果你想在API中使用会话,你必须在每个访问会话的请求。如果你不这样做,那么Laravel将创建一个新的会话。

很明显,您在Postman的测试中没有传输cookie,因此会话为空。

备注:RESTful服务应该是无状态的,这意味着没有会话。您的API没有遵循REST原则。

找到您的app/Http/Kernel.php并添加"会话">$middlewareGroups的值,如下所示:

protected $middlewareGroups = [
'web' => [
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
'sessions' => [
IlluminateSessionMiddlewareStartSession::class,
]
];

然后将一些中间件添加到你的整个api.php块中,如下所示:

Route::middleware('sessions')->name('api.')->group(function (){
Route::post('/usersList', [UserController::class, 'usersList'])->middleware(['hasPermission:ucvSystemUsers'])->name('users.list');
});

忘记y内部中间件"中间件(['hasPermission:ucvSystemUsers'](">。我写这篇文章是为了管理我的用户权限。

最后,我使用这个方法,根本没有问题

我刚刚在routes/web.php中写了这段代码,它运行得很好:

Route::get('/', function () {
session()->put('user_phone_number', 'my phone number is here');
});
Route::get('/check', function () {
dd(session()->has('user_phone_number'), session()->get('user_phone_number'));
});

而且你的代码也很好,肯定还有另一个问题。你应该检查你的服务器会话设置

======更新======

我忘了说为什么不直接将这些带有会话的API路由添加到您的网络组路由中(在routes/web.php中(,如下所示:

Route::prefix('api')->group(function (){
Route::get('/', function () {
session()->put('user_phone_number', 'my phone number is here');
return view('welcome');
});
Route::get('/check', function () {
dd(session()->has('user_phone_number'), session()->get('user_phone_number'));
});
});

最新更新