laravel ファサードは最終的に利便性のために存在し、代わりにこれらのクラスを注入して疎結合を許可する必要があることを示唆する多くのソースを読みました。Taylor Otwellでさえ、これを行う方法を説明する投稿をしています。不思議に思うのは私だけではないようだ。
use Redirect;
class Example class
{
public function example()
{
return Redirect::route("route.name");
}
}
になるだろう
use Illuminate\Routing\Redirector as Redirect;
class Example class
{
protected $redirect;
public function __constructor(Redirect $redirect)
{
$this->redirect = $redirect
}
public function example()
{
return $this->redirect->route("route.name");
}
}
これは問題ありませんが、一部のコンストラクターとメソッドが 4 つ以上のパラメーターを取り始めていることがわかり始めています。
Laravel IoCはクラス コンストラクターと特定のメソッド (コントローラー) にのみ注入されるように見えるため、かなり無駄のない関数とクラスを使用している場合でも、クラスのコンストラクターが必要なクラスで詰め込まれていることがわかります。必要な方法。
このアプローチを続けると、laravel のようなフレームワークを使用している場合、車輪の再発明のように感じる独自の IoC コンテナーが必要になることがわかりました。
たとえば、サービスを使用して、それらを処理するコントローラーではなく、ビジネス/ビューロジックを制御します-それらは単にビューをルーティングします。したがって、コントローラーは最初に対応する を取得しservice
、次にparameter
をその URL で取得します。1 つのサービス関数もフォームからの値をチェックする必要があるため、 と が必要Request
ですValidator
。そのように、私は4つのパラメータを持っています。
// MyServiceInterface is binded using the laravel container
use Interfaces\MyServiceInterface;
use Illuminate\Http\Request;
use Illuminate\Validation\Factory as Validator;
...
public function exampleController(MyServiceInterface $my_service, Request $request, Validator $validator, $user_id)
{
// Call some method in the service to do complex validation
$validation = $my_service->doValidation($request, $validator);
// Also return the view information
$viewinfo = $my_service->getViewInfo($user_id);
if ($validation === 'ok') {
return view("some_view", ['view_info'=>$viewinfo]);
} else {
return view("another_view", ['view_info'=>$viewinfo]);
}
}
これは一例です。実際には、私のコンストラクターの多くには、すでに複数のクラス (モデル、サービス、パラメーター、ファサード) が注入されています。コンストラクター注入 (該当する場合) をメソッド注入に「オフロード」し、それらのメソッドを呼び出すクラスにコンストラクターを使用して依存関係を注入するようにしました。
経験則として、メソッドまたはクラス コンストラクターの 4 つを超えるパラメーターは、悪い習慣/コードのにおいがすると言われています。ただし、laravel ファサードを注入するパスを選択した場合、これを実際に回避する方法がわかりません。
この考えは間違っていますか?私のクラス/関数は十分に無駄がありませんか? 私はlaravelsコンテナの要点を見逃していますか、それとも独自のIoCコンテナを作成することを本当に考える必要がありますか? 他のいくつかの回答は、laravelコンテナが私の問題を解決できることを示唆しているようです?
とは言っても、この問題について決定的なコンセンサスはないようです...