我提出了与众不同的方法。但是,当我尝试喜欢这篇文章时,它返回一个错误。 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');
});
如果您需要查看其他文件。请在评论中命名。
答案 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');
您还需要确保您的前端也使用正确的动词。
有两个原因:
auth:api
中间软件,否则Laravel将尝试使用默认保护(通常是会话)对用户进行身份验证。使用API时,您不应使用会话答案 2 :(得分:0)
答案 3 :(得分:0)
很少有简单的要点可以解决您的困惑:
Auth::user()
不是一个对象,这意味着它为空,您正在尝试公开访问需要经过身份验证的用户的路由,该路由会导致我们的下一个观点。 / li>
postLikeArticle()
和deleteLikeArticle()
的路由应位于授权中间件'auth:api'
内get
,其中一种应该使用delete
方法。Auth::id()
代替Auth::user()->id
,只是为了简化操作。使用PASSPORT进行身份验证时,您不会遵循常用的Laravel用户授权方式,因此Auth :: user()是无用的。为了获取经过身份验证的用户,您需要使用:
$user = $request->user();
$request
是Illuminate\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);
}
我希望对您有帮助