1

私は Laravel 5 のパッケージを開発しています。Laravel の Core クラスを使用するときにパッケージの依存性注入の恩恵を受けることにしましたが、詳細を読み、この質問も行った後 、Laravel 5 パッケージでの依存性注入のベスト アプローチ

Facadesここで、コンテナのような静的メソッドを大量に使用して呼び出している場合、実際にオブジェクトを作成してそのメソッドを呼び出すという考えを思いつきました。FaceadeName:nameOfMethodそのため、Facades からも利用できるクラスの laravel の依存性注入を使用して拡張することもできます。はほとんど役に立ちません。

たとえば、次のクラスがあります。

class MyController extends \App\Http\Controllers\Controller
{        
  public $text;
  public $lang;

 public function __construct()
 {         
   // Some codes here                            
}

public function myFunction(){
   $this->text = \Lang::get('package::all.text1');           
 }
}

これを行う:

 App::bind('lang', function($app)
 {
    return new \Lang();
  });    

そして、関数で:

public function myFunction()
{
    $lang = \App::make('lang');       
    $this->text = $lang::get('package::all.text1');           
}

すでにそこにバインドされているコンテナに何かをバインドするため、ほとんど役に立ちません

myFunctionに変更するのは良い考えではありません

 public function myFunction(\Lang $lang){
     $this->text = $lang::get('package::all.text1');           
 }

また、メソッド インジェクションのように見えるかもしれませんが、あまり利点はありません。したがって、Laravelではdependency injectionforを使用しない方がよいでしょう。Facades私が正しいかどうか教えてください。間違っている場合は、正しい答えで私の意見を議論してください。

4

1 に答える 1

5

ファサードは、クラスを介してコンテナーにアクセスする方法を提供するため、アクセスするときは、\Lang::function()実際には を呼び出していますapp('translator')->function()。したがって、上記の例では、Langファサードをコンテナーにバインドしているときに、それを 2 回バインドしていますが、これは望んでいるものではありません。

すべての Laravel の機能は既にコンテナーにバインドされており、 を呼び出すことでアクセスできますapp('object')。ここですべてのバインディングを見ることができますhttp://laravel.com/docs/5.0/facades

依存性注入の場合、ファサードを注入しようとするのではなく、ファサードが既に参照しているクラスを注入しようとするべきです。たとえば、コンテナにバインドされている\Langファサード参照は次のようになります。Illuminate\Translation\Translatortranslator

クラスでは、次のことができます

use App\Http\Controllers\Controller;
use Illuminate\Translation\Translator;

class MyController extends Controller
{
    protected $translator;

    // Dependency injection example
    public function __construct(Translator $translator)
    {
        $this->translator = $translator;
    }

    public function index()
    {
        $text = $this->translator->get('package::all.text1');
    }

    // Method injection example
    public function myFunction(Translator $translator)
    {
        $text = $translator->get('package::all.text1');
    }
}
于 2015-03-05T14:55:34.933 に答える