2017-01-11 2 views
1

Я использую пакет Jenssegers Optimus для обфускации своих URL.Как использовать Jenssegers Optimus в моделях Laravel?

В настоящее время я звоню в каждый контроллер, который имеет дело с запросами на получение. Проблема в том, что мне нужно постоянно кодировать и декодировать мои идентификаторы почти во всех методах моих контроллеров.

т.д .:

use Jenssegers\Optimus\Optimus; 

    class ResponseController extends Controller 
    { 
     protected $optimus; 

     public function __construct(Optimus $opt) 
     { 
      $this->optimus = $opt; 

     } 

     public function index() 
     { 

      $labels = Label->get(); 

      foreach ($labels as $key => $label){ 
       $label->id = $this->optimus->encode($label->id); 
       $labels[$key] = $label; 
      } 

      return view('responses/index', compact('labels')); 
     } 

     public function show($id) 
     { 
      $id = $this->optimus->decode($id); 

      $label = Label::get($id); 

     } 

    } 

Я думал о создании Accessors & Мутаторов всегда шифровать идентификаторы моделей, мне нужно, чтобы запутать в URL. Поэтому я использовал бы их для повторного использования кода. Я пробовал:

use Jenssegers\Optimus\Optimus; 

    trait EncodeId{ 

     public function getIdAttribute($value, Optimus $optimus) 
     { 

     return $optimus->encode($value); 
     } 

    } 

Затем я добавил эту черту к своей модели. Тем не менее, Laravel выкидывает ошибку, говорящую о Optimus $ optimus в определении метода. Он сказал, что ожидается, что $ optimus будет типом Jenssegers \ Optimus \ Optimus, хотя я его объявляю. Это прекрасно работает для контроллеров, но, по-видимому, это не работает для моделей. Или я не должен пытаться использовать черту в этом случае.

Вот фактическая ошибка:

FatalThrowableError in EncodeId.php line 10: 
Type error: Argument 2 passed to App\Label::getIdAttribute() must be an instance of Jenssegers\Optimus\Optimus, none given, called in /home/../vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 2734 

Было бы очень хорошо, если бы я мог бы использовать Optimus запутывание на уровне модели, а не вызывая его кодирование и декодирование ФУНКЦИИ несколько раз в моих контроллерах.

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

+0

Пожалуйста, уточните свой вопрос с точной погрешностью, чтобы мы могли комментировать его. – Gayan

+0

@Gayan. Я не помещал его туда, потому что потерял свой файл признаков. Вскоре я отзову его, чтобы воспроизвести ошибку. Как только я вернусь домой, я уточню свой вопрос. Спасибо – Leandro

+0

@Gayan Я просто добавил полную ошибку. – Leandro

ответ

1

Получить мутаторы (аксессоры AKA) вызывают вместе с одним аргументом. Вот почему вы получаете ошибку expected to be a type of Jenssegers\Optimus\Optimus, так как Jenssegers\Optimus\Optimus не вводится каркасом при вызове acessors или mutators (например, контроллеры).

Просто прочитал фрагмент из исходного кода (строка 2632):

public function getAttributeValue($key) 
    { 
     $value = $this->getAttributeFromArray($key); 
     // If the attribute has a get mutator, we will call that then return what 
     // it returns as the value, which is useful for transforming values on 
     // retrieval from the model to a form that is more useful for usage. 
     if ($this->hasGetMutator($key)) { 
      return $this->mutateAttribute($key, $value); 
     } 

     //...  
    } 

И теперь вызов $this->mutateAttribute($key, $value); (линия 2736)

protected function mutateAttribute($key, $value) 
    { 
     return $this->{'get'.Str::studly($key).'Attribute'}($value); 
    } 

Понимали ли вы сейчас? Атрибут/get mutator вызывается вместе с одним аргументом: $value.

Решение

Вы могли бы попробовать что-то вроде этого:

public function getIdAttribute($value) 
{ 
    return app(Optimus::class)->encode($value); 
} 

Вызов Оптимус экземпляр из контейнера (app()) будет делать трюк.

+0

Ох. На самом деле я думал, что это может быть проблемой. Я видел пример doc, содержащий только один аргумент, я не был уверен, хотя если бы ему разрешили только один аргумент.Я пытался использовать encode как статический метод для Optimus, он явно не работал. Я собираюсь проверить ваше решение, как только я вернусь домой. – Leandro

+0

@ Leandro Я не тестировал предлагаемое решение, но получить экземпляр Optimus из контейнера - это путь. --- Eu não testei ainda, mas obter a instância do Optimus do container é a direção certa. – felipsmartins

+0

Да, это работает. Большое спасибо. – Leandro

Смежные вопросы