2008-09-05 16 views
18

認証が必要なCodeIgniterを使用してWebアプリケーションを作成しています。すべての認証を処理するモデルを作成しました。しかし、私は他のモデルの中からこの認証モデルにアクセスする方法を見つけることができません。別のモードの中からモデルにアクセスする方法、またはCodeIgniterで認証を処理するためのよりよい方法はありますか?CodeIgniterの別のモデルの中からモデルにアクセスできますか?

答えて

14

一般に、オブジェクト内にオブジェクトを作成する必要はありません。それは悪い習慣ではなく、明確なAPIを書いてモデルにモデルを挿入することです。

<?php 
// in your controller 
$model1 = new Model1(); 
$model2 = new Model2(); 
$model2->setWhatever($model1); 
?> 
+0

これは良い方法ですか? Model2のユーザーは、Model1に依存していることを知っておく必要があるためです。 良い習慣は何ですか? – Sabya

+2

はい、Model1の内部でModel2を初期化するのではなく、依存性を「注入する」方が良い方法です。 – Till

+0

それはDRYの観点からは良いとは言えません。あるモデルの側面を変更し、別のモデルのアクションをトリガする機能を持っていたらどうなりますか? – wag2639

1

モデルで認証を処理しないでください。モデルを使用してデータベース、またはLDAPなどとのインタフェースをとるだけです。

私は認証と承認を管理するためのAuthライブラリを作成しました。このようなライブラリーは、コントローラーからアクセスできます。

+0

私はいつもモデル内にoauthの実装を入れていますが、私は認証コード –

+0

で私のコントローラーを掘り起こすのが好きではありません。私はMY_controllerを作成し、そこにすべてoauthします。 – tomexsans

18

モデルの中にモデルを読み込むことはできますが、おそらくこれは別の方法で解決する必要があります。詳細は、CodeIgniter forumsを参照してください。

class SomeModel extends Model 
{ 
    function doSomething($foo) 
    { 
    $CI =& get_instance(); 
    $CI->load->model('SomeOtherModel','NiceName',true); 

    // use $CI instead of $this to query the other models 
    $CI->NiceName->doSomethingElse(); 
    } 
} 

また、オブジェクト内にオブジェクトを作成しないでください。もちろん、あなたはすべきです!引数としてオブジェクトを送信することは私にははるかに明確ではありません。

+3

苦情は、そのようにすれば、2つのモデルの間に不必要に強い依存関係が生じることです。 たとえば、SomeModelにSomeOtherModelの模擬バージョンを与えることができればうれしいですね。前者が後者を直接ロードしている場合は、これを行うことはできません。 プラグインシステムを使用するように既存のコードをリファクタリングする場合など、後でコードを変更して、同じインタフェースを持つ別のモデルを使用します。 –

+1

Googleにはオープンソース依存性注入フレームワークがあります。それはJava用ですが、依存関係注入の賛否両論のいくつかを説明しています。 http://code.google.com/p/google-guice/ –

+1

@Rob Howard依存関係の注入があまりにも遠すぎるようなことがあります。使用するすべてのオブジェクトを単独でテストする必要はないため、使用するすべてのオブジェクトを注入する必要はありません。むしろ、全体として一緒に働くシステムとモジュールをテストし、お互いに分離して注入する必要があります。 –

1

モデル内にモデルをロードすることが、新しいCodeIgniterで可能になりました。

関連する問題