Средство доступа, которое расшифровывает значение модели, не работает

Средство доступа, которое расшифровывает значение модели, не работает

26.01.2020 10:52:19 Просмотров 25 Источник

У меня есть черта, которая использует методы доступа и мутаторы для шифрования значений модели:

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работал. Должно быть, я перепробовал столько комбинаций, чтобы попытаться понять это, и мне просто повезло.

Я не уверен, почему это так, но я уже потратил часы на это, поэтому я не могу устранить причину, почему это ломается. Может быть, кто-то другой сможет.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working#comment105957586_59916511
@apokryfos, просто поделился им в правке
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working#comment105958577_59916511
Я получаю ту же ошибку при добавлении инструкции use перед пространством имен

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

Является ответом!
Edwin Krause

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;
  }

  ....

Редактировать: Я еще немного поиграл с конструктором, и модифицированная версия должна действительно работать. У меня нет никаких зашифрованных данных, чтобы играть с ними, но логически это должно сработать.

https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105958076_59916884
Спасибо за помощь. Вот что у меня получилось: >Аргумент 1 принят к приложение\НТТР\\ресурсы CommentResource:: метод__Construct() должен быть экземпляр приложения\НТТР\\ресурсами комментарий, экземпляр приложения\комментарий
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105958102_59916884
Я на Laravel 5.6, и он работает нормально, без ошибок
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105958121_59916884
Не забудьте use App\Comment;заявление, если именно там находится ваша модель
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105958203_59916884
Я просто отредактировал свой пост, чтобы показать свою попытку
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105958546_59916884
Оператор use должен находиться ниже пространства имен
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105971053_59916884
Спасибо, что убрали ошибку, но к сожалению мой контент до сих пор не расшифровывается.
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105973813_59916884
Эй, я отредактировал свой вопрос. Я получил ответ, но не уверен в том, что происходит. Я думаю, что вы сыграли в этом определенную роль. Если вы знаете, что произойдет, и хотите отредактировать свой ответ, я обязательно отмечу Ваш ответ как правильный. Пожалуйста, предупредите меня, когда измените свой ответ. Спасибо еще раз.
https://stackoverflow.com/questions/59916511/accessor-that-decrypts-model-value-isnt-working/59916884#comment105985996_59916884
Извините, тоже не уверен. И, к сожалению, не могу воспроизвести, так как у меня нет ни одного проекта на данный момент, который использует зашифрованные поля. Но я рад, что у тебя все получилось...
Закрыть X