8

Lumen を使用して最初の API を開発しています。通常、私はビジネス ロジックまたは再利用されたコードをコントローラーから分離し、他のコントローラーと共有するためのサービスを使用しています。

ルーメンでこれを行う方法は?サービスをどこに置くか?これらのサービスを登録する ServiceProvider しか表示されませんが、どこでどのように定義するかは明確ではありません。

4

2 に答える 2

6

Lumen とその兄弟である Laravel には、依存関係の注入を処理するサービス コンテナーが付属しています。

コンテナーから問題を解決するには、ルート クロージャー、コントローラー コンストラクター、コントローラー メソッド、ミドルウェア、イベント リスナー、またはキューに入れられたジョブなど、コンテナーによって既に自動的に解決されているクラスに必要な依存関係をタイプヒントすることができます。 . または、appアプリケーションのどこからでも関数を使用できます。

$instance = app(Something::class);

それは「物事を解決する」ためです。「もの」を登録することは、サービスプロバイダーの目的です。Illuminate\Support\ServiceProviderサービス プロバイダーは、インターフェイスまたはクラスを具体的な実装に拡張およびバインドする単なるクラスです。(独自の記述方法の詳細については、ドキュメントを参照してください。)


例: いくつかのテスト ルートを作成します。

$app->get('/test', 'TestController@test');

コントローラー メソッドを作成し、パラメーターの型ヒントを指定します。

public function test(DatabaseManager $dbm)
{
    dd($dbm);
}

DatabaseManager インターフェイスが具体的なクラスに解決され、適切にインスタンス化され、DB 構成で構成されていることがわかります。これは、ある時点で、フレームワークがそれを処理するサービス プロバイダーを呼び出しているためです。

含めたいカスタム プロバイダーは、次の/bootstrap/app.phpように設定されます。

$app->register(App\Providers\AuthServiceProvider::class);

(それ以外の場合、プロバイダーによってバインドされていないクラスを要求すると、フレームワークnewはそのクラスのインスタンスを挿入するだけです。)


したがって、この問題に対しては、すべてのデータベース アクセスをカプセル化できる何らかのリポジトリ クラスが必要になるでしょう。

例:

// app/Repositories/ProductRepository.php
private $db;

public function __construct(DatabaseManager $dbm)
{
    $this->db = $dbm->connection();
}

public function findById($id)
{
    return $this->db->table('products')->where('id', '=', $id)->get();
}

//routes.php
$app->get('products/{id}', 'ProductsController@show');

//ProductsController.php
public function show(ProductRepository $repo, $id)
{
    $product = $repo->findById($id);
    dd($product);
}

この例で興味深いのは、ProductRepository インジェクションを呼び出すことです。これには DatabaseManager の依存関係があるため、フレームワークが両方のインスタンス化を処理します。


これにより、サービス プロバイダーでのビジネス ロジックの管理に関する質問の答えが得られることを願っています。別の典型的なユースケースは認証処理だと思います。このイントロの後、この件に関するドキュメントを参照できます 。

于 2016-08-17T19:24:14.013 に答える