我正在使用Laravel guard
保护路由,现在我想让用户id
进入不受保护的(公用)路由,例如:
受保护:
/个人资料
不受保护:
/搜索
我能够在受保护的路由中获取用户ID,例如ProfileController.php,如下所示:
$id = auth()->guard('agent')->user()->id;
但是我想在searchController.php中获得它,但是它返回null,知道吗?
api.php:
Route::middleware('auth:agent')->group(function () {
Route::get('profile', 'ProfileController@details');
});
Route::post('search', 'searchController@search');
另一方面,当用户登录并打开搜索页面时,我想获取用户ID。
答案 0 :(得分:2)
您应该创建一个传递id
等数据的控制器:
Route::middleware('auth:agent')->group(function () {
Route::get('userdata', 'ProfileController@userdata'); // return user id
});
并且:
public function userdata(){
...
$id = auth()->guard('agent')->user()->id; // just id
return $id;
}
此控制器可以获取所有用户数据,现在您需要在搜索控制器中调用此请求:
app('App\Http\Controllers\ProfileController')->userdata();
答案 1 :(得分:1)
因此,从我上面的评论继续进行-这是我尝试且无故障的工作方式:
config / auth.php
'guards' => [
//..
'agent' => [
'driver' => 'session',
'provider' => 'users',
],
//...
],
app / Http / Controllers / HomeController.php
public function index(): JsonResponse
{
return new JsonResponse([
'user' => auth()->guard('agent')->user(),
]);
}
routes / web.php
Route::get('/', 'HomeController@index')->name('home');
tests / Feature / HomeTest.php
/**
* @test
*/
public function returns_user()
{
$this->actingAs($user = factory(User::class)->create(), 'agent');
$this->assertTrue($user->exists);
$this->assertAuthenticatedAs($user, 'agent');
$response = $this->get(route('home'));
$response->assertExactJson([
'user_id' => $user->toArray()
]);
}
/**
* @test
*/
public function does_not_return_user_for_non_agent_guard()
{
$this->actingAs($user = factory(User::class)->create(), 'web');
$this->assertTrue($user->exists);
$this->assertAuthenticatedAs($user, 'web');
$response = $this->get(route('home'));
$response->assertExactJson([
'user_id' => null
]);
}
测试通过得很好,所以我只能猜测您的agent
防护或auth:agent
中间件的实现与否。