2017-01-11 7 views
1

私はJenssegers Optimusパッケージを使用してURLを難読化しています。Jenssegers OptimusをLaravel Modelsで使用するには?

現在、私はget要求を処理するすべてのコントローラで呼び出しています。問題は、コントローラのほぼすべてのメソッドでIDを常にエンコードしてデコードする必要があることです。

例えば:

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

     } 

    } 

私はいつも私がURLに難読化する必要があるモデルのIDを暗号化するためにアクセサ&ミューテータを作成すると思いました。だから私はコードを再利用するためにそれらを特性に入れました。私は試した:

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 

は、私はむしろ私のコントローラでそのエンコードとデコード機能を複数回呼び出すよりも、モデルレベルでオプティマスの難読化を使用することができればそれは本当にいいだろう。

これを行うためのFakeIDという別のパッケージがあります。私は私のプロジェクトでそれを実装しようとしましたが、うまくいきませんでした。私はそれが簡単な作業のように見えるので、私はそれを自分で処理できると確信しています。

+0

あなたの質問を正確なエラーで更新して、コメントすることができます – Gayan

+0

@Gayan確かに。私は自分の形質ファイルを失ったので、そこに置かなかった。まもなく私はそれを再現してエラーを再現します。私が家に帰ると、私は質問を更新します。ありがとう – Leandro

+0

@ガヤン私はちょうど完全なエラーを追加しました。 – Leandro

答えて

1

Get mutator(AKAアクセサ)は、単一の引数とともに呼び出されます。そのため、Jenssegers\Optimus\Optimusは、コントローラのようにacessorsまたはmutatorsを呼び出すときにフレームワークによってインジェクトされないため、expected to be a type of Jenssegers\Optimus\Optimusエラーが発生しています。

だけで、ソースコード(ライン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); 
    } 

あなたは今理解しましたか? Acessor/getミューテータは、ただ1つの引数($value)とともに呼び出されます。

ソリューション

あなたは可能性があり、このような何かしようとする:

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

コンテナ(app())からオプテ​​ィマスインスタンスを起動すると、トリックを行うだろうし。

+0

ああ実際に私はそれが問題になると思った。私はdocの例が1つの引数しか渡されていないことを知っていましたが、1つの引数しか許されていなかったとしてもわかりませんでした。Optimusの静的メソッドとしてエンコードを使用しようとしましたが、明らかに機能しませんでした。私は家に帰るとあなたの解決策を試してみるつもりです。 – Leandro

+0

@Leandro私は提案されたソリューションをテストしていませんが、コンテナからオプテ​​ィマスのインスタンスを取得する方法があります。 ---いいえ、あなたは病気や病気にかかっていませんか? – felipsmartins

+0

はい、それは動作します。どうもありがとう。 – Leandro

関連する問題