Средство доступа, которое расшифровывает значение модели, не работает
У меня есть черта, которая использует методы доступа и мутаторы для шифрования значений модели:
trait Encryptable
{
public function getAttribute($key)
{
$value = parent::getAttribute($key);
if (in_array($key, $this->encryptable)) {
$value = Crypt::decrypt($value);
return $value;
} else {
return $value;
}
}
public function setAttribute($key, $value)
{
if (in_array($key, $this->encryptable)) {
$value = Crypt::encrypt($value);
}
return parent::setAttribute($key, $value);
}
}
Модель Комментариев
protected $fillable = ['content','user_id','commentable_id', 'commentable_type'];
protected $encryptable = [
'content'
];
Классе commentcontroller
public function storePostComment(Request $request, Post $Post)
{
$this->validate($request, [
'content' => 'required',
]);
$comment = $post->comments()->create([
'user_id' => auth()->user()->id,
'content' => $request->content
]);
dd($comment->content);
//return new CommentResource($comment);
}
То, что происходит, когда я передаю return new CommentResource($comment);
дает мне зашифрованное содержимое комментариев, но dd($comment->content);
расшифровывает содержимое комментариев. Как расшифровать весь объект комментария, чтобы можно было вывести его в ресурс?
Редактировать Для CommentResource
class CommentResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'content' => $this->content,
'owner' => $this->owner,
];
}
}
Правка 2 для ответа
Вот моя попытка.:
use App\Comment;
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class CommentResource extends JsonResource
{
public function __construct(Comment $resource)
{
$this->resource = $resource;
}
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'content' => $this->content,
'owner' => $this->owner,
];
}
}
Ошибка:
Аргумент 1 принят к приложение\НТТР\ресурсы\CommentResource:: метод__Construct() должен быть экземпляр приложения\НТТР\ресурсы\комментарий, экземпляр приложения\комментарий, учитывая, называемая В /применения/MAMP/htdocs в/Мои приложения/приложение/и HTTP/контроллеры/по API/классе commentcontroller.php на строке 31
Редактировать 3 (окончательная правка)
Вот что я выяснил::
Я попробовал кучу различных комбинаций вместе с ответом @ Edwin Krause. У меня есть другая модель, использующая эту шифруемую черту и выводящая в ресурс, который отлично работает.
Чтобы дать немного больше контекста этому вопросу, я обнаружил, что существует проблема с использованием assertJsonFragment в тесте:
CommentsTest
/* @test **/
public function a_user_can_comment_on_a_post()
{
$decryptedComment = ['content'=>'A new content']
$response = $this->json('POST', '/api/comment/' . $post->id, $decryptedComment);
$response->assertStatus(201);
$response->assertJsonStructure([
'data' => [
'owner',
'content'
]
])
->assertJsonFragment(['content' => $decryptedContent['content']]);
}
assertJsonFragment
возвращал зашифрованное содержимое и поэтому терпел неудачу, потому что он был протестирован против расшифрованного содержимого комментариев.
Я использовал dd(new CommentResource($comment));
в контроллере, чтобы проверить, расшифровывается ли содержимое, его не было.
Я пробовал разные разные вещи, снимающие проблемы с dd()
в методе контроллера и даже тестирование в браузере. По-прежнему ничего. Я добавил код @Edwin Krause и по-прежнему ничего на dd()
Мне наконец повезло, и я избавился от dd () с @Edwin Krause и изменил свой контроллер на:
Рабочий код в сочетании с ответом @Edwin Krause в моем CommentResource
$comment = Comment::create([
'user_id' => auth()->user()->id,
'content' => $request->content,
'commentable_type' => 'App\Post',
'commentable_id' => $post->id,
]);
return new CommentResource($comment);
Тесты стали зелеными. Я попробовал dd(new CommentResource($comment));
и содержимое все еще было зашифровано. Вывод содержимого на Browser и assertJsonFragment
работал. Должно быть, я перепробовал столько комбинаций, чтобы попытаться понять это, и мне просто повезло.
Я не уверен, почему это так, но я уже потратил часы на это, поэтому я не могу устранить причину, почему это ломается. Может быть, кто-то другой сможет.




Ответы - Средство доступа, которое расшифровывает значение модели, не работает / Accessor that decrypts model value isn't working

26.01.2020 11:56:46
Просто предлагаю попробовать переопределить конструктор JsonResource и ввести параметр $resource В класс Modelclass. Это работает для других вещей, не уверен, что это исправит вашу проблему, которую нужно протестировать
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Comment;
class CommentResource extends JsonResource
{
public function __construct(Comment $resource)
{
$this->resource = $resource;
$this->resource->content = $resource->content;
}
....
Редактировать: Я еще немного поиграл с конструктором, и модифицированная версия должна действительно работать. У меня нет никаких зашифрованных данных, чтобы играть с ними, но логически это должно сработать.



use App\Comment;
заявление, если именно там находится ваша модель




