3

プロジェクトで適切なフォルダ構造を取得するのに問題があります。ファイルを構造化するために他にどのような方法を使用できるか知りたいです。

私は現在、MVC構造化フォルダーで作業しています。

www/
  Controllers/
  Models/
  Views/

これまでのところ特別なことは何もありません。しかし、私はORMシステムも使用しています。これを使用すると、次のようにデータベースから「オブジェクト」を簡単に取得できます。

ORM::load('table');

さて、この種のコードはモデルに存在する必要がありますか?だから私はこのようなものを手に入れるでしょう:

<?php
class userModel
{
    public function getAllUsers ( )
    {
        return ORM::load('table');
    }

    public function getUserById ( $id )
    {
        return ORM::load('table', 'userid=?', array($id));
    }
}
?>

私の意見ではこれまでのところ良さそうです...しかし、もう1つあります。ORMシステムを使用するときに「モデル」を指定することもできます。このモデルを使用すると、基本的に検証ルールを設定できます。そのようです:

ORM::withModel('authModel');

これにより、ORMは、DBに新しい行を追加する(または既存の行を更新する)前に、最初に次のモデルで検証ルールを確認する必要があることを認識します。

<?php
class authModel //Or maybe authValidation??
{
    // Method gets automatically triggered when an update is done with the ORM
    public function onUpdate ( $obj )
    {
        if ( $obj->username == '' )
            throw new \Exception('No username');
    }

    public function onInsert ( $obj )
    {
        // Validations here too.
    }
}
?>

問題は、2種類のモデルがあることです。基本的にゲッター/セッターを使用してデータを取得し、データベースに(コントローラーからモデルに)保存するもの。

そして、検証ルールが設定されている別のモデルがあります...同じフォルダーに両方を混在させたくありません。だから私はこれのために別の構造を考え出さなければなりません。何かのようなもの:

www/
  Controllers/
  Models/
    Repositories/
    Entities/
  Views/

モデルが実際の「リポジトリ」ではないというだけです。これは、repoクラスにオブジェクトが格納されておらず、commit()メソッドなどがないためです。

また、2番目のモデル(検証用)はエンティティではないため、エンティティフォルダーに保存できません...

これをどのように構成する必要があるかについてのアイデア..??

4

1 に答える 1

10

最初に理解する必要があるのは、MVCのモデルはクラス/オブジェクトではないということです。これは、多数のオブジェクトから作成されたレイヤーです。私は怠惰すぎて同じ曲をもう一度踊ることができないので、このコメントを読んでください(「サイドノート」セクションにスキップしてください)。

混乱の根源は、「モデル」と呼ばれるクラスのグループで2つの異なる責任を認識しているという事実にあります。実際には、ビジネスロジックを担当するクラスインスタンス(クラスなどUserModel)と、コンテンツを読み込んで保存する「ORM」と呼ばれる別のものがあります。そして、あなたは認証を持っていますが、それはどちらのグループにも当てはまりません。

私はこのような構造で行きます:

/application
    /modules
        /public
            /controllers
            /templates
         /admin
            /controllers
            /templates
         ....
    /views
    /model
        /logic
        /persistence
        /services
/framework

/viewsに個別のフォルダが/applicationあり、各モジュールに個別のが含まれていることに気付くかもしれません/templates。これは、適切なMVCでは、ビューはクラスのインスタンスであり、プレゼンテーションロジックを担当し、通常は複数のテンプレートを調整するためです。うまく書かれていれば、それらも再利用可能な構造です。

そして最後の注意:ORMを使用しようとしないでください。それを必要とするドメインオブジェクトごとにデータマッパーを作成します。ORMをアンチパターンと見なす人もいます。また、静的呼び出しは避けてください..それはOOコードではありません。依存性注入について学ぶことで多くの利益を得ることができます

..私の2セント

于 2012-04-17T05:37:38.827 に答える