2016-08-11 18 views
7

私はルーメンで最初のAPIを開発しています。通常、ビジネスロジックを分離したり、コントローラからコードを再利用したり、他のコントローラと共有するためにサービスを使用しています。ルーメンにビジネスロジックを置く場所は?

ルーメンでこれを行う方法は?どこにサービスを置くのですか?これらのサービスを登録するのはServiceProvidersだけですが、私にとってはどこでどのように定義するのかは明確ではありません。

答えて

1

ルーメンとその兄ラベールには依存関係注入を扱うサービスコンテナが付属しています。

が容器の外に物事を解決するには、あなたかもしれないいずれかのタイプのヒントあなたは、このようなルートの閉鎖、コントローラのコンストラクタ、コントローラ方法、ミドルウェアとして、すでに自動的にコンテナによって解決されるクラスに必要な依存関係、イベントリスナー、またはキューに入れられたジョブ。

$instance = app(Something::class);

「物事を解決する」ためだ。それとも、あなたはどこでもあなたのアプリケーション内からapp機能を使用することができます。 「もの」を登録するのは、サービスプロバイダーのためのものです。サービスプロバイダは、Illuminate\Support\ServiceProviderを拡張し、インターフェイスまたはクラスを具体的な実装にバインドする単なるクラスです。 (。あなた自身の書き方の詳細はthe docsを読む)


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

$app->get('/test', '[email protected]');

をし、コントローラのメソッド、タイプヒンティングパラメータを作成します。

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}', '[email protected]'); 

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

それはのDatabaseManager依存、フレームワークのハンドルを持っているので、それは、あなたがProductRepository注射のために呼び出し、この例では面白い、と両方のインスタンス化。


サービスプロバイダのビジネスロジックの管理についてのご質問にお答えしたいと思います。私は、別の典型的な使用例が承認処理だと思います。このイントロの後にthe docs on this subjectに従うことができます。

3

サービスクラスとしてのサービス?サービスクラスはフレームワークの一部ではなく、ここで解決しようとしているアプリケーションアーキテクチャの問題によく似ています。

あなたが作業しているプロジェクトによっては、アプリケーションフォルダ内のサービスフォルダ(タイプ構造によってフォルダを使用する場合)またはそれが所属する機能フォルダ(機能スタイル別にアプリフォルダを使用する場合) 。これらは、フォルダ構造のための多くの可能な方法のうちの2つに過ぎません。

すべてのプロジェクトで異なるので、サービスクラスを配置する場所とアプリケーションの構造を決定するのはあなた次第です。

プロジェクトの開発サイクルでは、1つの規則に従うことを忘れないでください。今考えることができない場合は、後でリファクタリングセッションでクラスを構造化してください。私は通常、私がそれについて考えているときに、私が最初に何かに取り組んでいるときよりも多くのアイデアを得る。

関連する問題