Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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
Php Auth::id()可以';无法找到用户id并返回null,laravel_Php_Laravel - Fatal编程技术网

Php Auth::id()可以';无法找到用户id并返回null,laravel

Php Auth::id()可以';无法找到用户id并返回null,laravel,php,laravel,Php,Laravel,我在文章上设置喜欢和不喜欢选项。但在LikeControl中存在问题。当我按下like按钮时,它会显示-> SQLSTATE[23000]:完整性约束冲突:1048列“用户id” 不能为空(SQL:insert intolikes(user\u id,article\u id, 在处更新,在处创建)值(?,5,2019-05-30 07:58:34, 2019-05-3007:58:34) 更新JWT和路线 类似模型: class Like extends Model { public

我在文章上设置喜欢和不喜欢选项。但在LikeControl中存在问题。当我按下like按钮时,它会显示->

SQLSTATE[23000]:完整性约束冲突:1048列“用户id” 不能为空(SQL:insert into
likes
user\u id
article\u id
处更新,
处创建)值(?,5,2019-05-30 07:58:34, 2019-05-3007:58:34)

更新JWT和路线 类似模型:

class Like extends Model
{
    public $timestamps = true;
    public $with = ["user"];

    protected $fillable = ["user_id", "article_id"];

    public function article()
    {
        return $this->belongsTo("App\Article");
    }

    public function user()
    {
        return $this->belongsTo("App\User");
    }
}
就像控制者一样:

use Auth;
use App\Article;
use App\Like;

public function like($id)
{
    $article = Article::find($id);

    $like =  Like::create([
        "user_id" => Auth::id(),
        "article_id" => $article->id
    ]);

    return Like::find($like->id);
}

public function unlike($id)
{
    $article = Article::find($id);

    Like::where("user_id", Auth::id())
        ->where("article_id", $article->id)
        ->first()
        ->delete();

    return 1;
}
我不太清楚为什么
Auth::id()
找不到用户id并返回null

将JWT与vue.js一起使用

路线:

Route::group(['prefix' => 'auth'], function ($router) {

  Route::post('register', 'AuthController@register');
  Route::post('login', 'AuthController@login');
  Route::post('logout', 'AuthController@logout');
  Route::post('refresh', 'AuthController@refresh');
  Route::post('me', 'AuthController@me');

});

Route::get("/like/{id}", [
        "uses" => "LikeController@like"
    ]);
Route::get("/unlike/{id}", [
        "uses" => "LikeController@unlike"
    ]);
AuthControllerUser


要设置控制器和用户模型,我遵循文档:

尝试导入Auth

使用light\Support\Facades\Auth

然后像这样获得身份证:

$user = Auth::user();
$id = $user->id;
Route::group([
    'middleware' => 'api',
], function ($router) {

    Route::get("/like/{id}", [
        "uses" => "LikeController@like"
    ]);
    Route::get("/unlike/{id}", [
        "uses" => "LikeController@unlike"
    ]);

});
希望这有帮助

在kernel.php上添加此中间件

protected $middlewareGroups = [
        'web' => [
            \Illuminate\Session\Middleware\StartSession::class,
        ],
];
此链接可能有助于:


首先使用此代码:

确保
路由
控制器
受到身份验证中间件的保护

second:如果使用了
多个保护
,请确保对身份验证使用了正确的
保护

you should specify your guard name like this: `Auth::guard('admin')->id()`

您没有从路由组中指定
中间件=>api
。还包括
类似的
相关路由或此路由组中的任何受保护路由

config/auth.php
应更新为

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

...

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
routes/api.php中的

Route::post('login', 'AuthController@login')->name('login');

Route::group(['middleware' => 'api'], function ($router) {

    Route::group(['prefix' => 'auth'], function ($router) {
        Route::post('register', 'AuthController@register');
        # Route::post('login', 'AuthController@login'); // commented.
        Route::post('logout', 'AuthController@logout');
        Route::post('refresh', 'AuthController@refresh');
        Route::post('me', 'AuthController@me');

    });

    Route::get("/like/{id}", [
        "uses" => "LikeController@like"
    ]);
    Route::get("/unlike/{id}", [
        "uses" => "LikeController@unlike"
    ]);

});

您似乎没有使用auth保护您的LikeControl路由

除非构造函数的
LikeController
中有类似的内容:

    public function __construct()
    {
        $this->middleware('auth:api');
    }
然后,您应该让LikeControl路由受到如下保护:

$user = Auth::user();
$id = $user->id;
Route::group([
    'middleware' => 'api',
], function ($router) {

    Route::get("/like/{id}", [
        "uses" => "LikeController@like"
    ]);
    Route::get("/unlike/{id}", [
        "uses" => "LikeController@unlike"
    ]);

});
那么使用登录的正确方法是

auth('api')->user()

因此,当我在vue js中使用jwt时,我的应用程序也遇到了这个问题。 用于获取当前的
Auth::user()

您需要在请求时传递令牌。 若您检查jwt核心文件,它将从令牌获取用户。 我猜你不是在传递令牌

如果是,请将令牌与您的请求一起传递。 并检查
jwt
的文档。你的软件包安装正确了吗? 请记住,对于laravel 5.5或更高版本,要使用的软件包版本是
jwt>1.0.0

另外,请正确检查该版本的文档。

您也可以使用您拥有OAuth2:-)的Laravel的passport

关于Laravel护照的Laravel文件说明:

Laravel使用Laravel Passport使API身份验证变得轻而易举, 它为您的Laravel提供了完整的OAuth2服务器实现 几分钟内申请。护照是建在护照顶部的 由Andy Millington和Simon维护的联盟OAuth2服务器 汉普


检查用户是否经过身份验证, 不要忘记使用Auth类

use Auth;
检查是否授权而不是删除, 并使用Auth::user()->id


检查Auth::user()->id;你成功登录应用程序了吗?是的,我成功了。。。但是我将JWT与vue.js一起使用,这是原因吗?也许?
将JWT与vue.js一起使用
无法使用Auth::user()。您必须使用
$user=JWTAuth::toUser($params['token'])
请提供更多关于如何实现JWT的信息,例如,您是否在使用某个包(它是什么),如何将JWT身份验证强制到您的控制器/路由,前提是路由配置可能也很有用。好的,错误现在已更改。上面说,
试图获取非对象的属性
更新了答案。我尝试了更新,但结果是一样的<代码>尝试获取非对象的属性
谢谢,我做了完全相同但仍然相同的错误<代码>尝试获取非对象的属性顺便说一句,如果我在组中插入其他路由,则会出现一个错误,显示为:TypeError:无法读取未定义的属性“user”\n您可以将其排除在组外。或者可以添加<代码>公共函数uu construct(){$this->middleware('auth:api',['except'=>['login']])}好的,你把我弄丢了:)如果你编辑你的答案,我会的appreciate@parabellum现在试试这个解决方案。好的,我试过了。现在错误被改变了<代码>路由[登录]未定义。和
抛出新的InvalidArgumentException(“路由[{$name}]未定义”)请参考关于命名路由的讨论:(您可能需要像这样定义登录路由:
路由::post('login',['as'=>'login','uses'=>'AuthController@login“];
)如果您也在问题中提供您的
AuthConroller
,则可能会很有用。
if (Auth::user())
{
   Like::where("user_id", Auth::user()->id)
    ->where("article_id", $article->id)
    ->first()
    ->delete();
}