Auth :: user()-> id返回“试图获取非对象的属性”-Laravel 5.8

时间:2019-06-12 09:11:18

标签: php laravel laravel-5

更新2

我提出了与众不同的方法。但是,当我尝试喜欢这篇文章时,它返回一个错误。 Route [login] not defined.

我正在使用护照API登录。我给令牌登录等...我没有问题登录。我看到只有auth用户才能看到的页面。但是,当我喜欢这篇文章时,Auth::似乎无法理解用户是否登录。也许这就是问题所在。因为我在使用护照?因此,在控制器中而不是Auth::

我像$user = $request->user();那样使用它(您可以在下面看到控制器。)但是当我喜欢这篇文章时,仍然弹出同样的错误。 Route [login] not defined.

控制器

public function postLikeArticle( Request $request, $articleID )
{
    $article = Article::where('id', '=', $articleID)->first();
    $user = $request->user();

    $article->likes()->attach( $user->id, [
        'created_at'    => date('Y-m-d H:i:s'),
        'updated_at'    => date('Y-m-d H:i:s')
    ]);

  return response()->json( ['article_liked' => true], 201 );
}

public function deleteLikeArticle( Request $request, $articleID )
{
    $article = Article::where('id', '=', $articleID)->first();
    $user = $request->user();

    $article->likes()->detach( $user->id );

    return response(null, 204);
}

路线

Route::middleware('auth:api')->group(function() {
    Route::get('/user', function (Request $request) {
        return $request->user();
    });

    Route::get('/articles/{id}/like', 'Api\ArticlesController@postLikeArticle');
    Route::get('/articles/{id}/like', 'Api\ArticlesController@deleteLikeArticle');

});

如果您需要查看其他文件。请在评论中命名。

4 个答案:

答案 0 :(得分:1)

您的喜欢/不喜欢的路由不受auth保护,这意味着该用户可能未登录,因此您可以将所有需要经过身份验证的用户的路由归类如下:

// public routes out of the group, for example:

Auth::routes();

Route::middleware('auth:api')->group(function() {
    Route::get('/user', function (Request $request) {
        return $request->user();
    });

    Route::get('/articles/{id}/like', 'Api\ArticlesController@postLikeArticle');


    // you cannot have same routes for both, so this
    // Route::get('/articles/{id}/like', 'Api\ArticlesController@deleteLikeArticle');
    // should be this:
    Route::get('/articles/{id}/dislike', 'Api\ArticlesController@deleteLikeArticle');

});

然后,Auth::id()Auth::user()->id应该给您相同的内容。甚至是辅助功能,因此您不必担心导入。

auth()->id();

// or
auth()->user()->id;

答案 1 :(得分:1)

如果您需要对用户进行身份验证,则需要使用可确保身份验证的中间件。另外,您还需要确保根据您的操作使用正确的HTTP动词,如果当前定义正在引起冲突,则为

Route::middleware('auth:api')->post('/articles/{id}/like', 'Api\ArticlesController@postLikeArticle');
Route::middleware('auth:api')->delete('/articles/{id}/like', 'Api\ArticlesController@deleteLikeArticle');

您还需要确保您的前端也使用正确的动词。

有两个原因:

  1. 如果您不使用中间件,则基本上是在说那些路由不需要身份验证
  2. 如果您使用API​​保护对用户进行身份验证,则需要显式使用auth:api中间软件,否则Laravel将尝试使用默认保护(通常是会话)对用户进行身份验证。使用API​​时,您不应使用会话

答案 2 :(得分:0)

代替

Auth::user()->id

您可以尝试

auth()->user()->id

您可以参考laravel documentation以获得更多信息

答案 3 :(得分:0)

很少有简单的要点可以解决您的困惑:

  1. “尝试获取非对象的属性”表示Auth::user()不是一个对象,这意味着它为空,您正在尝试公开访问需要经过身份验证的用户的路由,该路由会导致我们的下一个观点。 / li>
  2. 使用功能postLikeArticle()deleteLikeArticle()的路由应位于授权中间件'auth:api'
  3. 对于使用上述功能的两条路由,您都使用方法get,其中一种应该使用delete方法。
  4. 您可以使用Auth::id()代替Auth::user()->id,只是为了简化操作。

使用PASSPORT进行身份验证时,您不会遵循常用的Laravel用户授权方式,因此Auth :: user()是无用的。为了获取经过身份验证的用户,您需要使用:

$user = $request->user();

$requestIlluminate\Http\Request的实例

以下是您的示例: 在控制器文件的开头导入Request类:

use Illuminate\Http\Request;

和您的控制器逻辑:

public function postLikeArticle( Request $request, $articleID )
{
    $article = Article::where('id', '=', $articleID)->first();
    $user = $request->user();

    $article->likes()->attach( $user->id, [
        'created_at'    => date('Y-m-d H:i:s'),
        'updated_at'    => date('Y-m-d H:i:s')
    ]);

  return response()->json( ['article_liked' => true], 201 );
}

public function deleteLikeArticle( Request $request, $articleID )
{
    $article = Article::where('id', '=', $articleID)->first();
    $user = $request->user();

    $article->likes()->detach( $user->id );

    return response(null, 204);
} 

我希望对您有帮助