2017-05-12 19 views
3

私は小さなPHP MVCフレームワークを構築しましたが、あるモデルから別のモデルにデータを取得する最良の方法を明確にしたいだけです。たとえば:PHP MVC - モデルが別のモデルのデータにアクセスする必要があります

私はGET_USERS()と呼ばれるメソッドが含まれていUsers_modelを持っています。

は、私はまた、特定の、またはすべてのユーザーのデータを取得する必要がCommunications_modelを持っており、Users_modelから、このようなニーズがGET_USERSにアクセスすると()メソッドCommunications_model

a)のコントローラでUsers_modelをインスタンス化し、GET_USERSからデータを渡す()メソッド:それはへのベストプラクティス

ですか?

B)Communications_model内部Users_modelをインスタンス化し、そこからGET_USERS()を実行し、それが直接アクセスすることができますか?

c)別の方法ですか?

ご協力いただきありがとうございます。

+0

これは、MVCの構造に基づいています。 ORM(Laravelのような)かCIのような構造かどうか? –

+0

これらのタイプの問題を解決するには雄弁なORMを使用してください – Jabaa

+0

ありがとうございます。誰かが私のフレームワークに実装するのに役立つORMの良い記事を教えてもらえますか? – markwilliamsweb

答えて

0

これはあなたの動機に左右されます。

  1. 結果に影響を与えたい場合は、Doctrineなどのよく知られているライブラリを使用してください。
  2. デザインパターンを学習するには、ActiveRecordパターンまたはDataMapper +リポジトリパターンをお読みください。次に両方を実装してチェックアウトします。
  3. ORMはデータの関係を表現する必要がありますので、コードのほうが重要なのはなぜですか?あなたが通信(バス、電車)をしている場合、ユーザーはそこに割り当てられ、通信からユーザーを取得することはOKです。ユーザーが(車のような)コミュニケーションを持っている場合、関係は逆になります。

すべては、この背後にある動機ですか? Doctrineのようなライブラリを使用すると、アプリケーションの実行を手助けできますか?あなたがデザインパターンを学びたいなら、両方のオプションをチェックしていくつかの経験を得る。

-2

単純な原理は、__construct()(コンストラクタ)を使用して、データベースから関連するプロパティを持つオブジェクトを構築することです。ユーザモデルは、モデルデータをインスタンスを返すnew self()に渡すだけで、インスタンス化されたオブジェクトの配列を作成する静的関数(したがって、任意のスコープからアクセス可能)を持ちます。

概念は、プロパティへのデータベース列のビルドであるUser_Modelインスタンスの配列で終わります。残っているのは、データベースモデルと、列とデータを取得する関数を作成することだけです。

class Communications_Model { 
    private $_all_users; 
    public function getUsers() { 
     $this->_all_users = Users_Model::loadAllUsers(); 
    } 
} 

class Users_Model { 
    private $_example_property; 
    public function __construct($user_id) { 
     $data = SomeDatabaseModel::getConnection()->loadUserFromDatabase((int)$user_id); 
     $this->_example_property = $data['example_column']; 
    } 
    public static function loadAllUsers() { 
     $users = array(); 
     foreach(SomeDataModel::getConnection()->loadAllUsers() as $data) { 
      $users[] = new self($data['user_id']); 
     } 
     return $users; 
    } 
} 

はもちろん、今、あなたはデータを含むインスタンス化ユーザモデルのアレイを有する$_all_users;性質を持っています。

-1

すべてが可能ですが、私が通常行っていることは、多くのオブジェクトによって何度も再利用されると思われる機能がある場合は、staticと宣言します。

これは、オブジェクトの宣言で遊んでの労力を節約できますし、再びClassName::function();

で簡単にアクセスできるようになり、それは通常のオブジェクトは、コントローラで右が宣言され、必要性につきとしてではなく、単にするために使用され、設計上の選択ですオブジェクトの宣言を何度も保存して、私は関数staticを宣言するアプローチに従います。

+1

設計上、静的関数を使用している理由は間違っています。クラスがステートフルかステートレスで、何か理由がある場合は、静的な、またはそうでない関数をコンテキストで作成する必要があります。 99,9%のケースでは、モデルクラスはステートフルであり、インスタンスが存在する必要があります。 –

+0

これは良いことですが、私の要求と設計に基づいて設計されています。通常、ユーティリティは抽象クラスで宣言され、特定のユーティリティによって提供される機能については確かなので、関数は静的に保たれます –

0

「ユーザーモデル」とは、repositoryです。あなたが「通信モデル」と呼ぶものは、serviceのように見えます。

あなたの通信サービスは、コンポーザーで依存関係としてユーザーリポジトリを渡す必要があります。

私は正直なところ、あなたの混乱の大きな部分は、あなたがそれらのすべてのものを「モデル」と呼ぶことです。これらのクラスはではなく、同じレイヤーの一部であるです。あなたが移動するとthis answerが有用であることがわかります。

関連する問題