国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Laravelでモデルを再利用する方法
伊謝爾倫
伊謝爾倫 2017-05-16 16:53:44
0
5
856

當(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

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

伊謝爾倫
伊謝爾倫

小伙看你根骨奇佳,潛力無限,來學(xué)PHP伐。

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

0x0 序文

興味深い質(zhì)問ですが、Yii は Laravel よりもパフォーマンスの高いフレームワークとして業(yè)界でも認(rèn)識(shí)されています。そこで、ActiveRecord の構(gòu)造から 2 つの主要なフレームワークの具體的な実裝を見ていきたいと思いました。

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

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

リーリー

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

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

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

リーリー

ソースをたどると、find メソッドは実際には IlluminateDatabaseEloquentBuilder から來ており、このクラスは內(nèi)部で IlluminateDatabaseQueryBuilder の実裝を使用していることがわかりました。

ちょっと待って、

IlluminateDatabaseEloquentBuilderIlluminateDatabaseQueryBuilder の違いは何ですか?

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

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

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

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

Yii 1.1 の 0x2 CActiveRecord

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

さて、Yii を使ってリレーショナルクエリを?qū)g裝し、最初に以下を定義します:

リーリー

お問い合わせ:

リーリー

明らかにクエリ オブジェクトはモデルから來ています。親クラスがこの関數(shù)をどのように実裝するかを見てみましょう:

リーリー

findAllByPk メソッドは CActiveRecord 內(nèi)に直接カプセル化されます:

リーリー

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

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

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

同じオブジェクトを簡(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 にすばやくインポートできます

0x4 ついに

靜的および非靜的オーバーヘッドの問題については、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() を呼び出すだけです

最新のダウンロード
詳細(xì)>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート