Laravelでモデルを再利用する方法
伊谢尔伦
伊谢尔伦 2017-05-16 16:53:44
0
5
724

当社は現在、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

Laravel でプロジェクトを開発する際に、Model などの論理層クラスの再利用の問題をどのように解決しているかお聞きしたいのですが。

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(5)
漂亮男人

0x0 序文

興味深い質問ですが、Yii は Laravel よりもパフォーマンスの高いフレームワークとして業界でも認識されています。そこで、ActiveRecord の構造から 2 つの主要なフレームワークの具体的な実装を見ていきたいと思いました。

0x1 Laravel 用の雄弁なフレームワーク

Laravel でリレーショナルクエリを使用するのは簡単です:

リーリー

User クラスに find メソッドが見つかりませんでした。なんと、何が起こったのでしょうか。 ?

User の基本クラスは Model であり、静的呼び出しを使用するため、Model の __callStatic マジック メソッドが呼び出されます。 リーリー

実際には、__call マジック メソッドを再度呼び出すことになります:

リーリー

ソースをたどると、find メソッドは実際には IlluminateDatabaseEloquentBuilder から来ており、このクラスは内部で IlluminateDatabaseQueryBuilder の実装を使用していることがわかりました。

ちょっと待って、

IlluminateDatabaseEloquentBuilderIlluminateDatabaseQueryBuilder の違いは何ですか?

実際、EloquentBuilder は、リレーショナル オブジェクト クエリをより適切に実装するために、QueryBuilder をさらにカプセル化したものです。

実際のプロセスは次のとおりです:

言い換えると、Model メソッドを

静的に呼び出すたびに、Model がインスタンス化され、プロセスが完了します。

Yii 1.1 の 0x2 CActiveRecord

質問者さんはmodelメソッドを使用しているのでバージョン1.1のはずです モジュールはCActiveRecordを継承しています(Yii2ではYiidbActiveRecordを継承しています)。

さて、Yii を使ってリレーショナルクエリを実装し、最初に以下を定義します:

リーリー

お問い合わせ:

リーリー

明らかにクエリ オブジェクトはモデルから来ています。親クラスがこの関数をどのように実装するかを見てみましょう:

リーリー

findAllByPk メソッドは CActiveRecord 内に直接カプセル化されます:

リーリー

そのプロセスは次のとおりです:

Laravel を使用した 0x3 依存関係の注入

通常の状況 (パラメータのないコンストラクターまたは挿入されたパラメータが設定されている場合) では、Laravel が自動的にインスタンスを作成します。 リーリー

同じオブジェクトを簡単に再利用できます:

リーリー

ウェアハウスを実装した後、手動でインスタンス化する必要がありますか:

リーリー

いいえ、これは Laravel の哲学に沿っていません。次のように簡単に実行できます:

リーリー

はい、その通りです。手動で構築したり、ユーザー インスタンスを渡したりする必要はありません。すべては単純な自動インジェクションだけです。そして質問者は、ここでは名前空間が使用されていることに気づきました。そのため、名前空間を使用する必要があるのは 1 回だけです。 (もちろん、これほど長い名前空間を書きたくない場合は、IDE に変更する時期が来ています。Alt + Enter を使用して、PhpStorm にすばやくインポートできます

0x4 ついに

静的および非静的オーバーヘッドの問題については、StackOverflow で議論されています: http://stackoverflow.com/questions/14727...

最終的には、ビジネス ニーズ 23333 に依存します

いいねを押す +0
阿神

依存関係注入を通じて
コントローラーに直接注入できます
この記事を読むことができます
http://slides.com/howtomakeaturn/model#/

いいねを押す +0
小葫芦

あなたはまだ Laravel についてあまり知らないと思います。

まず、Laravel の Model は明示的なインスタンス化を必要としないモデルです。呼び出しメソッドは次のとおりです (公式ドキュメントから抜粋)。 リーリー

第二に、あなたの説明は間違っています。探しているのはファクトリ パターンではなく、リクエストのライフ サイクル中に 1 回インスタンス化するだけで済むシングルトン パターンです。 LaravelではIOC(制御反転)コンテナまたはサービスコンテナを使用する必要があります。このように:

リーリー

上記は簡単な抜粋です。具体的な使用方法については、Laravel の公式ドキュメントを参照してください:

サービスコンテナ (IOC コンテナ/サービスコンテナ)

いいねを押す +0
洪涛

当社はBaseRepositoryで定義されたBaseRepositoryを継承しています

リーリー

クーポンリポジトリ

リーリー

Bizでも同様にBaseBizを継承して以下のようにメソッドを書きます

リーリー

コントローラー

で呼び出されました リーリー

コントローラー ---> ビジネス ---> リポジトリ

いいねを押す +0
淡淡烟草味

これが私がやったことです。基礎となるモデルにこの関数を作成します
bootstrap/app.php と AppServiceProvider.php を変更します
詳細については、サービスプロバイダーを参照してください

リーリー

コントローラーで Foo::load() を呼び出すだけです

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!