Hejka
Mam pewien problem ze zmodyfikowanym kodem w laravelu. Do mojego projektu dodałem Sanctum. Jak wiadomo, dodaje on do bazy token, user_id etc. Zmodyfikowałem kod tak, aby zapisywałby także IP osoby logującej się. Wszystko działa dobrze (stworzenie tokenu, id, ip i zapisanie do bazy danych) po za jednym detalem: Laravel zwraca następujący błąd
Argument 1 passed to Laravel\Sanctum\NewAccessToken::__construct() must be an instance of Laravel\Sanctum\PersonalAccessToken, instance of App\PersonalAccessTokens given, called in...
Jak wykonałem modyfikację kodu:
1. Stworzyłem model PersonalAccessTokens do którego dodałem proteced filable
2. W pliku AppServiceProvider, funkcji boot dodałem następujący kod:
Sanctum::usePersonalAccessTokenModel('App\PersonalAccessTokens');
3. Do modelu User dodałem następujący kod:
public function createToken(string $name, array $abilities = ['*']) {
$token = $this->tokens()->create([
'name' => $name,
'ip_address' => request()->ip(),
'token' => hash('sha256', $plainTextToken = Str::random(80)),
'abilities' => $abilities,
]);
return new NewAccessToken($token, $token->id.'|'.$plainTextToken); }
4. Tworze token następująco:
$token = $user->createToken($request->device_name)->plainTextToken;
A tutaj constructor z sanctuma:
<?php
namespace Laravel\Sanctum;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
class NewAccessToken implements Arrayable, Jsonable
{
/**
* The access token instance.
*
* @var \Laravel\Sanctum\PersonalAccessToken
*/
public $accessToken;
/**
* The plain text version of the token.
*
* @var string
*/
public $plainTextToken;
/**
* Create a new access token result.
*
* @param \Laravel\Sanctum\PersonalAccessToken $accessToken
* @param string $plainTextToken
* @return void
*/
public function __construct(PersonalAccessToken $accessToken, string $plainTextToken)
{
$this->accessToken = $accessToken;
$this->plainTextToken = $plainTextToken;
}
/**
* Get the instance as an array.
*
* @return array
*/
public function toArray()
{
return [
'accessToken' => $this->accessToken,
'plainTextToken' => $this->plainTextToken,
];
}
/**
* Convert the object to its JSON representation.
*
* @param int $options
* @return string
*/
public function toJson($options = 0)
{
return json_encode($this->toArray(), $options);
}
}