當(dāng)社は現(xiàn)在、Laravel
開發(fā)項(xiàng)目,同時(shí)還增加了Biz
層和Repositories
層,來實(shí)現(xiàn)業(yè)務(wù)邏輯封裝,反而model
里面什么代碼都沒有。
在Controller
里寫代碼的時(shí)候,嘗嘗困擾我的問題是如果復(fù)用Biz
對(duì)象,Repositories
對(duì)象和Model
對(duì)象。
以前用Yii
開發(fā)項(xiàng)目的時(shí)候,有一個(gè)工廠模式,所以調(diào)用Model
的時(shí)候,基本都不new
XXX::model() を使用した bytes を使用しています。オブジェクトを一度新規(guī)作成するだけで十分であり、効果的にメモリを節(jié)約できます。 コントローラーコード:
リーリー
なんとシンプルでしょう?
Laravel
では、Model
にはファクトリーがないようです。Repositories
が 5 つのメソッドをカプセル化する場(chǎng)合、それぞれインスタンスが必要です。 Model
を使用し、次に Controller
でこれら 5 つのメソッドを呼び出しました。Model
は 5 回新しくなりました。 現(xiàn)在、インターネットで方法を確認(rèn)しています。これは、Model オブジェクトを Repositories
のコンストラクターに挿入し、それを Repositories のプライベート メンバー変數(shù)に入れることです。この方法では、5 つのメソッドすべてが を呼び出すことができます?,F(xiàn)在のクラスのプライベート変數(shù)。ただし、Controllerでコードを書くときは、次のように記述する必要があります。
リーリー
Laravel
里,Model
好像沒有工廠,要調(diào)用,都需要實(shí)例,假如Repositories
里面封裝了5個(gè)方法,每個(gè)都使用了Model
,那么我在Controller
里調(diào)用了這5個(gè)方法,Model
就被new了5次。
目前在網(wǎng)上看到一種辦法,就是在Repositories
これをリポジトリに記述する必要があります:
new には
オブジェクトがあり、名前空間はまだ長(zhǎng)いので、基本的に文字列を記述することになり、名前を記述するためにファイルを開く必要もあり、コードを書く効率が非常に低くなります。
Biz
的時(shí)候,還必須傳入Repositories
小伙看你根骨奇佳,潛力無限,來學(xué)PHP伐。
興味深い質(zhì)問ですが、Yii は Laravel よりもパフォーマンスの高いフレームワークとして業(yè)界でも認(rèn)識(shí)されています。そこで、ActiveRecord の構(gòu)造から 2 つの主要なフレームワークの具體的な実裝を見ていきたいと思いました。
Laravel でリレーショナルクエリを使用するのは簡(jiǎn)単です:
リーリーUser クラスに find メソッドが見つかりませんでした。なんと、何が起こったのでしょうか。 ?
User の基本クラスは Model であり、靜的呼び出しを使用するため、Model の __callStatic マジック メソッドが呼び出されます。 リーリー
実際には、__call マジック メソッドを再度呼び出すことになります:リーリー
ソースをたどると、find メソッドは実際には IlluminateDatabaseEloquentBuilder から來ており、このクラスは內(nèi)部で IlluminateDatabaseQueryBuilder の実裝を使用していることがわかりました。ちょっと待って、
IlluminateDatabaseEloquentBuilder と IlluminateDatabaseQueryBuilder の違いは何ですか?
実際のプロセスは次のとおりです:
さて、Yii を使ってリレーショナルクエリを?qū)g裝し、最初に以下を定義します:
リーリー
お問い合わせ:リーリー
明らかにクエリ オブジェクトはモデルから來ています。親クラスがこの関數(shù)をどのように実裝するかを見てみましょう:リーリー
findAllByPk メソッドは CActiveRecord 內(nèi)に直接カプセル化されます:リーリー
そのプロセスは次のとおりです:
同じオブジェクトを簡(jiǎn)単に再利用できます:
リーリーウェアハウスを?qū)g裝した後、手動(dòng)でインスタンス化する必要がありますか:
リーリーいいえ、これは Laravel の哲學(xué)に沿っていません。次のように簡(jiǎn)単に実行できます:
リーリーはい、その通りです。手動(dòng)で構(gòu)築したり、ユーザー インスタンスを渡したりする必要はありません。すべては単純な自動(dòng)インジェクションだけです。そして質(zhì)問者は、ここでは名前空間が使用されていることに気づきました。そのため、名前空間を使用する必要があるのは 1 回だけです。 (もちろん、これほど長(zhǎng)い名前空間を書きたくない場(chǎng)合は、IDE に変更する時(shí)期が來ています。Alt + Enter を使用して、PhpStorm にすばやくインポートできます
靜的および非靜的オーバーヘッドの問題については、StackOverflow で議論されています: http://stackoverflow.com/questions/14727...
最終的には、ビジネス ニーズ 23333 に依存します
依存関係注入を通じて
コントローラーに直接注入できます
この記事を読むことができます
http://slides.com/howtomakeaturn/model#/
あなたはまだ Laravel についてあまり知らないと思います。
まず、Laravel の Model は明示的なインスタンス化を必要としないモデルです。呼び出しメソッドは次のとおりです (公式ドキュメントから抜粋)。 リーリー
第二に、あなたの説明は間違っています。探しているのはファクトリ パターンではなく、リクエストのライフ サイクル中に 1 回インスタンス化するだけで済むシングルトン パターンです。 LaravelではIOC(制御反転)コンテナまたはサービスコンテナを使用する必要があります。このように:リーリー
上記は簡(jiǎn)単な抜粋です。具體的な使用方法については、Laravel の公式ドキュメントを參照してください:サービスコンテナ (IOC コンテナ/サービスコンテナ)
當(dāng)社はBaseRepositoryで定義されたBaseRepositoryを継承しています
リーリークーポンリポジトリ
リーリーBizでも同様にBaseBizを継承して以下のようにメソッドを書きます
リーリーコントローラー
で呼び出されました リーリーコントローラー ---> ビジネス ---> リポジトリ
これが私がやったことです?;A(chǔ)となるモデルにこの関數(shù)を作成します
bootstrap/app.php と AppServiceProvider.php を変更します
詳細(xì)については、サービスプロバイダーを參照してください
コントローラーで Foo::load() を呼び出すだけです