当社は現在、Laravel
开发项目,同时还增加了Biz
层和Repositories
层,来实现业务逻辑封装,反而model
里面什么代码都没有。
在Controller
里写代码的时候,尝尝困扰我的问题是如果复用Biz
对象,Repositories
对象和Model
对象。
以前用Yii
开发项目的时候,有一个工厂模式,所以调用Model
的时候,基本都不new
XXX::model() を使用した bytes を使用しています。オブジェクトを一度新規作成するだけで十分であり、効果的にメモリを節約できます。 コントローラーコード:
リーリー
なんとシンプルでしょう?
Laravel
では、Model
にはファクトリーがないようです。Repositories
が 5 つのメソッドをカプセル化する場合、それぞれインスタンスが必要です。 Model
を使用し、次に Controller
でこれら 5 つのメソッドを呼び出しました。Model
は 5 回新しくなりました。 現在、インターネットで方法を確認しています。これは、Model オブジェクトを Repositories
のコンストラクターに挿入し、それを Repositories のプライベート メンバー変数に入れることです。この方法では、5 つのメソッドすべてが を呼び出すことができます。現在のクラスのプライベート変数。ただし、Controllerでコードを書くときは、次のように記述する必要があります。
リーリー
Laravel
里,Model
好像没有工厂,要调用,都需要实例,假如Repositories
里面封装了5个方法,每个都使用了Model
,那么我在Controller
里调用了这5个方法,Model
就被new了5次。
目前在网上看到一种办法,就是在Repositories
これをリポジトリに記述する必要があります:
new には
オブジェクトがあり、名前空間はまだ長いので、基本的に文字列を記述することになり、名前を記述するためにファイルを開く必要もあり、コードを書く効率が非常に低くなります。
Biz
的时候,还必须传入Repositories
漂亮男人2017-05-16 16:55:44
興味深い質問ですが、Yii は Laravel よりもパフォーマンスの高いフレームワークとして業界でも認識されています。そこで、ActiveRecord の構造から 2 つの主要なフレームワークの具体的な実装を見ていきたいと思いました。
Laravel でリレーショナルクエリを使用するのは簡単です:
リーリーUser クラスに find メソッドが見つかりませんでした。なんと、何が起こったのでしょうか。 ?
User の基本クラスは Model であり、静的呼び出しを使用するため、Model の __callStatic マジック メソッドが呼び出されます。 リーリー
実際には、__call マジック メソッドを再度呼び出すことになります:リーリー
ソースをたどると、find メソッドは実際には IlluminateDatabaseEloquentBuilder から来ており、このクラスは内部で IlluminateDatabaseQueryBuilder の実装を使用していることがわかりました。ちょっと待って、
IlluminateDatabaseEloquentBuilder と IlluminateDatabaseQueryBuilder の違いは何ですか?
実際、EloquentBuilder は、リレーショナル オブジェクト クエリをより適切に実装するために、QueryBuilder をさらにカプセル化したものです。
実際のプロセスは次のとおりです:
言い換えると、Model メソッドを
さて、Yii を使ってリレーショナルクエリを実装し、最初に以下を定義します:
リーリー
お問い合わせ:リーリー
明らかにクエリ オブジェクトはモデルから来ています。親クラスがこの関数をどのように実装するかを見てみましょう:リーリー
findAllByPk メソッドは CActiveRecord 内に直接カプセル化されます:リーリー
そのプロセスは次のとおりです:Laravel を使用した 0x3 依存関係の注入
同じオブジェクトを簡単に再利用できます:
リーリーウェアハウスを実装した後、手動でインスタンス化する必要がありますか:
リーリーいいえ、これは Laravel の哲学に沿っていません。次のように簡単に実行できます:
リーリーはい、その通りです。手動で構築したり、ユーザー インスタンスを渡したりする必要はありません。すべては単純な自動インジェクションだけです。そして質問者は、ここでは名前空間が使用されていることに気づきました。そのため、名前空間を使用する必要があるのは 1 回だけです。 (もちろん、これほど長い名前空間を書きたくない場合は、IDE に変更する時期が来ています。Alt + Enter を使用して、PhpStorm にすばやくインポートできます
静的および非静的オーバーヘッドの問題については、StackOverflow で議論されています: http://stackoverflow.com/questions/14727...
最終的には、ビジネス ニーズ 23333 に依存します
阿神2017-05-16 16:55:44
依存関係注入を通じて
コントローラーに直接注入できます
この記事を読むことができます
http://slides.com/howtomakeaturn/model#/
高洛峰2017-05-16 16:55:44
あなたはまだ Laravel についてあまり知らないと思います。
まず、Laravel の Model は明示的なインスタンス化を必要としないモデルです。呼び出しメソッドは次のとおりです (公式ドキュメントから抜粋)。 リーリー
第二に、あなたの説明は間違っています。探しているのはファクトリ パターンではなく、リクエストのライフ サイクル中に 1 回インスタンス化するだけで済むシングルトン パターンです。 LaravelではIOC(制御反転)コンテナまたはサービスコンテナを使用する必要があります。このように:リーリー
上記は簡単な抜粋です。具体的な使用方法については、Laravel の公式ドキュメントを参照してください:サービスコンテナ (IOC コンテナ/サービスコンテナ)
PHP中文网2017-05-16 16:55:44
当社はBaseRepositoryで定義されたBaseRepositoryを継承しています
リーリークーポンリポジトリ
リーリーBizでも同様にBaseBizを継承して以下のようにメソッドを書きます
リーリーコントローラー
で呼び出されました リーリーコントローラー ---> ビジネス ---> リポジトリ
淡淡烟草味2017-05-16 16:55:44
これが私がやったことです。基礎となるモデルにこの関数を作成します
bootstrap/app.php と AppServiceProvider.php を変更します
詳細については、サービスプロバイダーを参照してください
コントローラーで Foo::load() を呼び出すだけです