2

PHPを使用して最初の実際のMVCアプリケーションを作成しています。私のアプリケーションは非常に小さいので、すべてを最初から作成する方が速いと思ったので、フレームワークを使用していません。

私のアプリでは、ユーザーは登録、ログイン、そしてコンテンツの書き込み/編集/削除を行うことができます。各コンテンツは、データベースのuserid-columnによってその所有者を参照します。

これから、ユーザーアクセス制限を実装しようとしています(ユーザーは自分のコンテンツ/アイテム/モデルのみを表示/編集/削除できるという意味で)。「有効なアクセス」のチェックはどこで行われるべきで、ユーザーオブジェクトはどこでインスタンス化されるのでしょうか。

つまり、コントローラー、モデル、ビューの現在のユーザーに関する情報が絶対に必要です。したがって、アプリケーションの各部分から快適にアクセスできるように、すべてのユーザー情報を格納するグローバルユーザーオブジェクト(index.phpで定義)を使用できるかどうかを考えています。

現時点では、このスニペットはコントローラーにユーザー情報へのアクセスを許可し、ビューに渡されるデータ配列にも保存します。

class Controller {
    protected $data, $id, $user;
    public function __construct($action = null, $data = null) {
        if (User::isLoggedIn()) {
            $this->user = new User($_SESSION['user']);
            $this->data['user'] = $this->user;
        }
    }
}

このパターンに従って、作成する各モデルにユーザー情報を渡すか、代わりに独自のユーザーオブジェクトをインスタンス化する必要があります。

ここに行く方法は何ですか?グローバルユーザーオブジェクト、各モデルでのインスタンス化、またはユーザーオブジェクトをパラメーターとしてモデルとビューに渡す?

ご協力ありがとうございました!

4

1 に答える 1

5

ここで注意すべきことがいくつかあります。まず、「次に、ビューに渡されるデータ配列にも格納します。」

MVCでは、ビューはモデルに直接アクセスできます。その概要については、こちらの回答を参照してください。MVCはCodeIgniterでどのように機能するのでしょうか。

第二に、あなたの質問は本当に依存関係の管理についてです。グローバル(および拡張により静的)には問題があります(すべての変数をグローバルにする、PHPグローバル変数は悪いですか?静的メソッドかどうか?)。推奨される方法は、完全に構築された$userオブジェクトをそれを必要とするクラスに渡すことです。

class Controller {
    protected $data, $id, $user;
    public function __construct(User $user) {
        if ($user->isLoggedIn()) {
    //...
       }
    }
}

ただし、この場合、オブジェクトを作成する前にユーザーがログインしているかどうかを知る必要があるため、完全に作成されたユーザーオブジェクトを作成することはできません。そのため、マッパー、ファクトリ、またはDAOオブジェクトをコンストラクターに渡し、必要に応じてユーザーを作成します。 。

class Controller {
    protected $data, $id, $user;
    public function __construct(DataMapper $userMapper) {
        if (isset($_SESSION['user'])) {
    $user = $userMapper->find($_SESSION['user']);
       }
    }
}

ただし、最後に、ビューがモデルに直接アクセスでき、コントローラーから渡されたデータを取得しないという私の最初のポイントをとると、コントローラーはユーザーがログインしているかどうかを知る必要さえないかもしれません。これは結局のところ、ドメインロジックはモデルに属します。

于 2012-12-12T13:21:07.130 に答える