Auth :: user () -> id возвращает «Попытка получить свойство необъекта» - Laravel 5.8 - PullRequest
0 голосов
/ 12 июня 2019

ОБНОВЛЕНО 2

Я сделал как и в отличие от метода.Но когда я пытаюсь понравиться статья, она возвращает ошибку.Route [login] not defined.

Я использую логин API для паспорта.Я даю токен для входа в систему и т.д ... Я вхожу без проблем.Я вижу страницы, которые может видеть только авторизованный пользователь.Но, кажется, когда мне нравится статья, 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 ]

1 голос
/ 12 июня 2019

Если вам требуется аутентификация пользователя, вам необходимо использовать промежуточное программное обеспечение, обеспечивающее это. Кроме того, вам также необходимо убедиться, что вы используете правильные 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 не следует использовать сеанс
1 голос
/ 12 июня 2019

Ваши маршруты для лайков / нелюбов не защищены 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;
0 голосов
/ 12 июня 2019

Несколько простых точек должны решить вашу путаницу:

  1. «Попытка получить свойство необъекта» означает, что Auth::user() не является объектом, что означает, что он нулевой, вы пытаетесь получить доступ к маршруту публично, который требует аутентифицированного пользователя, который ведет к нашей следующей точке.
  2. Маршруты, которые используют функции postLikeArticle() и deleteLikeArticle(), должны находиться внутри промежуточного программного обеспечения авторизации 'auth:api'
  3. Вы используете метод get для обоих ваших маршрутов, которые используют вышеуказанные функции, следует использовать метод delete.
  4. Вы можете использовать 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);
} 

Надеюсь, это поможет

0 голосов
/ 12 июня 2019

вместо

Auth::user()->id

Вы можете попробовать это

auth()->user()->id

Вы можете обратиться Документация Laravel для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...