4

PHP のコーディング中に、スパゲッティ コードから移行して MVC の実装を試みることにしました。MVC フレームワークを実装するために、私はこの記事に出くわしました 記事 は良いスタートを切り、サイトを作成し、フロントエンドを開発することができました。現在、セッションやその他のメンバーエリア機能を使用してバックエンドを実装しようとしています。私の脳は新しい情報で沸騰しており、答えよりも多くの質問があります.

クラスなどの追加のクラスを実装する方法がわかりませんuser。たとえば、MVC がなくuser.phpても、インクルード ディレクトリに新しいクラス ファイルを作成し、それをインクルードしてインスタンス化し、オブジェクトに適切な値を割り当てて、オブジェクトをセッションに配置できます。

専門的なアドバイスをお願いしたいです。

私は多くのことについて混乱しています:

  • ユーザー クラスを追加する場所
  • MVC にユーザー クラスを追加して含める方法
  • アプリケーションでユーザー クラスを実行するにはどうすればよいですか (セッションについては理解していますが、セッションにはユーザー オブジェクトへのエースが必要です)
  • ログイン/ログアウト ロジックを実行し、バックグラウンドで行われている必要なアクションを実行する方法

これは、以前に行われたことがあると複雑ではない、おそらく一般的な問題です。また、お手数をおかけいたしますがnot very good defined question、よろしくお願いいたします。

4

3 に答える 3

15

User、MVC のコンテキストは、ドメイン オブジェクトです。ただし、セッションはストレージ メディアの形式です (キャッシュ、データベース、ファイル システムと同様)。そこにインスタンスからデータを保存する必要がUserある場合は、ある種のデータマッパーを使用してそれを行います。

$user = $this->domainObjectFactory->build('user');
$user->setName('Korben')
     ->setSurname('Dallas');

if ( some_condition )
{
    $mapper = $this->dataMapperFactory->create('session');
    $mapper->store($user);
}

このコードは、セッションとユーザー間のやり取りの非常に単純化された例を提供する必要があります。

ユーザー クラスはどこに追加しますか?

ドメイン オブジェクトとして、Userインスタンスはサービス内で使用し、ファクトリを使用して初期化する必要があります。MVC のコンテキストでは、サービスはモデル層の構造であり、アプリケーション ロジックを扱います。これらは、ドメイン オブジェクトとストレージの抽象化の相互作用を操作および促進します。

MVC にユーザー クラスを追加して含めるにはどうすればよいですか?

すべてのクラスは、オートローダーを使用して追加する必要があります。の使用についてspl_autoload_register()、できれば名前空間の使用について読む必要があります。

インスタンス自体の初期化はファクトリで行う必要があります。これにより、コードをそのインスタンスのクラス名から切り離すことができます。

アプリケーションでユーザー クラスを実行するにはどうすればよいですか?

あなたはそうしない。

PHP アプリケーションは持続しません。HTTP リクエストがあり、必要なことをすべて実行すると、レスポンスが送信され、アプリケーションが破棄されます。クラスのインスタンスUserはすべて短命です。

リクエスト間で現在のユーザーを回復するには、識別子をセッションに保存します。セッション内のオブジェクト全体をダンプしないでください。代わりに、セッションからユーザーの識別子をフェッチした後、残りのユーザー アカウントの詳細を他の形式のストレージから復元できます (必要な場合)。

このプロセス全体は、モデル層からのある種の「認識サービス」または「認証サービス」によって実行および管理する必要があります。

ログイン/ログアウト ロジックを実行し、必要なアクションを実行するにはどうすればよいですか?

ログイン要求は、最初にコントローラーによって処理されます。

public function postLogin( $request )
{
    $service = $this->serviceFactory->create('recognition');
    $service->authenticate( $request->getParameter('username'),
                            $request->getParameter('password') );
}

サービスはユーザーの認証情報を検証しようとします。これにより、モデル レイヤーの状態が変更されます。次に、ビュー インスタンスはその状態を検索し、認証されたユーザーとしてランディング ページにリダイレクトするか、エラー メッセージを表示してログイン ページにリダイレクトします。

サービス自体は、ファクトリを介してモデル コントローラーとビューの間で共有されます。つまり、各サービスを一度だけ初期化してから再利用するだけです。次のようなもの:

class ServiceFactory
{
    private $cache = array();

    public function create( $name )
    {
        if ( array_key_exists($name, $this->cache) === false )
        {
            $this->cache[$name] = new $name;
        }
        return $this->cache[$name];
    }
}

彼の例は非常に単純化されていることに注意してください。

さらに読むには、このリンク集を参照することをお勧めします。また、 thisthisthisの 3 つの投稿が役立つ場合もあります。

于 2013-06-08T07:30:19.387 に答える
5

ここには多くの質問があります。簡単に確認しましょう。

  • ユーザー クラスを追加する場所
  • MVC にユーザー クラスを追加して含める方法
  • アプリケーションでユーザー クラスを実行するにはどうすればよいですか (セッションでは理解していますが、セッションにはユーザー オブジェクトへのエースが必要です)
  • ログイン/ログアウト ロジックを実行し、バックグラウンドで実行されている必要なアクションを実行する方法

ご想像のとおり、Stackoverflow ではこれらの質問に技術的に答えることができません。あなたの質問の将来のユーザーにはあまり役に立ちません。また、単純な回答をしたくありません。

しかし、質問のリストに目を通してみると、次のような重要な点がいくつかあります。

  • オブジェクトはどこで作成されますか?
  • オブジェクトはどのようにアプリケーションを通過しますか?

また、すでに回答があります:「モデル内」(私がリストしたこれらの2つの点ではなく、いくつかの質問に対するものです)。

まず第一に、モデルは MVC のレイヤーです。レイヤーは、アプリケーションの特定の領域であり、そのフローで (通常はより高レベルの) ジョブを処理します。あなたの例では、UserModelの一部です。ソフトウェア プログラムでコードを整理する方法については、ソフトウェアのパスタ理論を参照してください。これにより、特に MVC とは別に、レイヤーを使用する理由が明確になります。しかし、MVC では、答えは明らかです。それはモデルです。

この答えは明らかなので、あなたが従ったチュートリアルがそれを見逃した可能性があることを少し不思議に思います. そして、次のようなソフトウェア設計の基本的な質問を放っておきましたか?

  • オブジェクトはどこで作成されますか?
  • オブジェクトはどのようにアプリケーションを通過しますか?

これらの 2 つの質問は、特にオブジェクト指向のソフトウェアでさえも、オブジェクトを使用するすべてのソフトウェアにとって非常に重要です。

MVCの場合、アプリケーションを構築するフレームワークを形成する高レベルのルーチンを自分で作成する場合があります。基本的に、これはライブラリを作成していることを意味します。ライブラリが誰かによって使用されています。オブジェクトが作成される場所を誰かが決定する必要があること。フレームワーク/ライブラリ、オブジェクトを作成する場所ユーザーのオブジェクトを作成する必要があります。したがって、この質問には、フレームワークの作成者ではなく、フレームワークの消費者が答える必要があります。したがって、これを適切に処理するには、自分自身を 2 つに分割し、一方でライブラリのコーダーの役割を担い、他方でライブラリを使用してアプリケーションを作成するコーダーの役割を担う必要があります。

この非常に単純だが基本的な点を強調することしかできません。ライブラリ ソフトウェア/フレームワークを作成するときは、オブジェクトを作成する場所を指定しないでください。ライブラリがアプリケーションなしで機能することを証明するテストを提供するだけで、アプリケーションを作成するときにライブラリをインクルードして使用するだけです。

2 番目の質問は、オブジェクトがアプリケーションをどのように通過するかということです。. リンクしたチュートリアルをざっと見てみると、上記の私の一般的なアドバイスが守られていないことがわかります (これは、開発を迅速に行うために重要なことです。そのため、チュートリアルのタイトルに惑わされないでください。このような複雑なコードでは、最初の 1 時間だけがあっという間に過ぎて、複雑な開発への道が開かれただけです) だけでなく、チュートリアルのコード例は、アプリケーション内でオブジェクトを渡す方法に関する質問への回答を示すのに役立つ例ではありません. それを行うための非常に単純だが効果的な方法であるDependency Injectionを説明していません。

したがって、1 つのチュートリアルを当然のことと考えないでください。選択したものは、次のことを示しているだけです。

  • 著者は、URL 解析を再発明する価値があると考えています。PHP にはこの機能が組み込まれているため、これは単純なコード マスターベーションです。
  • 著者は、入力値を検証しないことに価値があると考えており、コード インジェクションを防止することの重要性について考えることさえ近視眼的です。これは本当に悲しいことです。

最後のポイントは完全にダメなので、これらの例からこれまでに取ったものはすべて捨てて、次の例を試すことを強くお勧めします. ライブラリのユーザーは、いつどこでオブジェクトを作成するかを決定する必要があること (つまり、使用するライブラリが常にこれを許可する必要があることを意味します) と、依存性注入を使用して、オブジェクト グラフを介してオブジェクトを渡すことを覚えておいてください。応用。

于 2013-06-08T07:05:38.140 に答える