0

私はMVCアーキテクチャを使用して基本的なWebアプリを開発しています。私はMVCアーチがどのように機能するかを完全に理解するために自分で構築しているので、これは学習演習としても機能します。

Aura Routerクラスを使用してURLをコントローラーとアクションにマップしているので、mysite.com / loginのようなものがLoginControllerにマップされ、フォームをmysite.com/login/loginに送信するとLoginControllerにマップされます- > doAction('login')。

コントローラの例は次のようになります。

class LoginController implements iController {

    public function doAction( PDO $dbh, $action ) {

        switch( $action ) {
            case 'login':
                //login here
                $user = new User();
                $user_id = FALSE;

                if( $user_id = $user->login( $_POST['email'], $_POST['password'] ) ) {
                    //save user id to session
                }
                else {
                    $results = array( 'errors' => array( 'invalid' ) );
                    MembershipFunc::redirect( '/login', $results );
                }

                break;
            case 'logout':
                //logout
                break;
            default:
                break;
        }

    }
}

私が直面している問題は、ユーザーがページを更新したり、データを再送信したりしないようにするために、ログインに失敗した場合にユーザーをログインページに転送することです。現在、転送しないと、mysite.com / login / loginページに表示され、特にクリーンではないと思います。エラーがmysite.com/login?error=email,password&email=user@domain.comにリダイレクトされる可能性があるため、単純なログインフォームでは問題ありませんが、巨大なフォームの場合は、非常に大きなURLクエリを取得します。 。

私は、MVCがどのように機能するかについての基本的な(まだ有用な)PHPコード例を使用して優れたリソースを探しましたが、特に有用なものを見つけるのに苦労しました。URL構造をアクションにマッピングするのを避け、代わりに「アクション」と呼ばれるPOSTフィールドを配置することを選択する必要がありますか?このデータをSESSIONデータの配列に渡すシステムをどうにかして構築する必要がありますか?

何かアドバイス?

注:正しい/間違った答えがない可能性があるため、この質問がSO文化に適合しないことを私は知っていることを明記したいと思いますが、SOは常に最良/最も知識のあるユーザーベースを持っていると思います。誰かが私がこれらの質問をどこに向けるべきかについてのヒントを持っているなら、私はそれを本当に感謝しますので、私は混乱を追加しません!

4

1 に答える 1

1

私のMVCURLは次のようになります:index.php?c = Controller&m = ControllerMethod&d = slash / sepparated / list / of / stuff

データ(d =)はスラッシュで展開され、すべてのコントローラーメソッドに配列として渡されます。自動ロード(spl_autoload_register()を介して)を使用して、クラス(c =)を呼び出し、次にそのクラスのメソッド(m =)を呼び出します。

また、フォームにACTIONを設定していないか、意図的にACTIONをGETに設定しているようです。原則として、URLを正常に保つには、ACTIONをPOSTにする必要があります。検索フォームを除く。それらはさまざまな利点を持つGETにすることができます。

更新時にフォームが再送信されないようにリダイレクトするのが最善のオプションです(おそらく唯一のオプションです)。しかし、私のMVCでは、index.php?c = user&m=loginがログインページとログインアクションの両方を処理します。

class login extends Controller {

    public function login($data) {

        if(empty($_POST)) {

            $this->view = "login.tpl";

            return TRUE;

        }


        $res = $this->model->auth();

        if($res !== TRUE) {

            $_POST = NULL;

            $this->errorState = 1;
            $this->errorMsg = "Invalid login details";

            $this->login();

            return FALSE;

        }

        Core::setMessage('success', 'user', 'login', '2', 'Logged in successfully');

        $home = new home(); //whatever the main controller is
        $home->index($data);

        //alternatively you can redirect

        header("Location: index.php?c=home&m=index);

        return TRUE;

    }

}

これは理にかなっていますか、それとも私は完全にマークを逃しましたか?

于 2013-02-14T20:38:53.400 に答える