web-dev-qa-db-ja.com

MVCを正しい方法で実行する方法

PHP=でCodeIgniterフレームワークを使用して、数か月間MVCを行ってきましたが、実際に正しく機能しているかどうかはまだわかりません。

私が現在していることは:

Model-データベースクエリ(選択、挿入、更新、削除)を配置する場所です。ここに私が持っているモデルの1つからのサンプルがあります:

function register_user($user_login, $user_profile, $department, $role) {

    $department_id = $this->get_department_id($department);
    $role_id = $this->get_role_id($role);

    array_Push($user_login, $department_id, $role_id);

    $this->db->query("INSERT INTO tbl_users SET username=?, hashed_password=?, salt=?, department_id=?, role_id=?", $user_login);
    $user_id = $this->db->insert_id();

        array_Push($user_profile, $user_id);

    $this->db->query("
            INSERT INTO tbl_userprofile SET firstname=?, 
            midname=?, lastname=?, user_id=?
        ", $user_profile);
}

Controller-モデルと通信し、データベースをクエリするモデルのメソッドを呼び出し、ビューが表示するデータ(成功アラート、エラーアラート、データベースからのデータ)を提供し、親コントローラーを継承しますこれは、ユーザーがログインしているかどうかを確認します。サンプルは次のとおりです。

function create_user(){
    $this->load->helper('encryption/Bcrypt');
    $bcrypt = new Bcrypt(15);

     $user_data = array(
        'username' => 'Username', 'firstname' => 'Firstname',
        'middlename' => 'Middlename', 'lastname' => 'Lastname',
            'password' => 'Password', 'department' => 'Department', 
            'role' => 'Role'
    );

    foreach ($user_data as $key => $value) {
        $this->form_validation->set_rules($key, $value, 'required|trim');
    }

    if ($this->form_validation->run() == FALSE) {
        $departments = $this->user_model->list_departments();
        $it_roles = $this->user_model->list_roles(1);
        $tc_roles = $this->user_model->list_roles(2);
        $assessor_roles = $this->user_model->list_roles(3);

        $data['data'] = array('departments' => $departments, 'it_roles' => $it_roles, 'tc_roles' => $tc_roles, 'assessor_roles' => $assessor_roles);

        $data['content'] = 'admin/create_user';

            parent::error_alert();
            $this->load->view($this->_at, $data);

        } else {
        $username = $this->input->post('username');
        $salt = $bcrypt->getSalt();
        $hashed_password = $bcrypt->hash($this->input->post('password'), $salt);
        $fname = $this->input->post('firstname');
        $mname = $this->input->post('middlename');
        $lname = $this->input->post('lastname');
        $department = $this->input->post('department');
        $role = $this->input->post('role');

            $user_login     = array($username, $hashed_password, $salt);
            $user_profile   = array($fname, $mname, $lname);
        $this->user_model->register_user($user_login, $user_profile, $department, $role);

        $data['content'] = 'admin/view_user';

            parent::success_alert(4, 'User Sucessfully Registered!', 'You may now login using your account');


        $data['data'] = array('username' => $username, 'fname' => $fname, 'mname' => $mname, 'lname' => $lname, 'department' => $department, 'role' => $role);
        $this->load->view($this->_at, $data);
    }

}

Views-ここにhtml、css、JavaScriptコード(現在のフォームのフォーム検証コード、コントローラーから提供されたデータをループする、ifステートメントでいくつかのifステートメントを非表示にして表示する場所)コントローラが提供するデータ)。

<!--User registration form-->
<form class="well min-form" method="post">
    <div class="form-heading">
        <h3>User Registration</h3>
    </div>

    <label for="username">Username</label>
    <input type="text" id="username" name="username" class="span3" autofocus>

    <label for="password">Password</label>
    <input type="password" id="password" name="password" class="span3">

    <label for="firstname">First name</label>
    <input type="text" id="firstname" name="firstname" class="span3">

    <label for="middlename">Middle name</label>
    <input type="text" id="middlename" name="middlename" class="span3">

    <label for="lastname">Last name</label>
    <input type="text" id="lastname" name="lastname" class="span3">

    <label for="department">Department</label>
    <input type="text" id="department" name="department" class="span3" list="list_departments">

    <datalist id="list_departments">
        <?php foreach ($data['departments'] as $row) { ?>
            <option data-id="<?php echo $row['department_id']; ?>" value="<?php echo $row['department']; ?>"><?php echo $row['department']; ?></option>
        <?php } ?>
    </datalist>

    <label for="role">Role</label>
    <input type="text" id="role" name="role" class="span3" list="">

    <datalist id="list_it">
        <?php foreach ($data['it_roles'] as $row) { ?>
            <option data-id="<?php echo $row['role_id']; ?>" value="<?php echo $row['role']; ?>"><?php echo $row['role']; ?></option>
        <?php } ?>
    </datalist>

    <datalist id="list_collection">
        <?php foreach ($data['tc_roles'] as $row) { ?>
            <option data-id="<?php echo $row['role_id']; ?>" value="<?php echo $row['role']; ?>"><?php echo $row['role']; ?></option>
        <?php } ?>  
    </datalist>

    <datalist id="list_assessor">
        <?php foreach ($data['assessor_roles'] as $row) { ?>
            <option data-id="<?php echo $row['role_id']; ?>" value="<?php echo $row['role']; ?>"><?php echo $row['role']; ?></option>
        <?php } ?>  
    </datalist>

    <p>
        <button type="submit" class="btn btn-success">Create User</button>
    </p>
</form>

<script>
    var departments = [];
    var roles = [];

    $('#list_departments option').each(function(i){
        departments[i] = $(this).val();
    });

    $('#list_it option').each(function(i){
        roles[roles.length + 1] = $(this).val();
    });

    $('#list_collection option').each(function(i){
        roles[roles.length + 1] = $(this).val();
    });

    $('#list_assessor option').each(function(i){
        roles[roles.length + 1] = $(this).val();
    });

    $('#department').blur(function(){

        var department = $.trim($(this).val()); 
        $('#role').attr('list', 'list_' + department);
    });

    var password = new LiveValidation('password');
    password.add(Validate.Presence);
    password.add(Validate.Length, {minimum: 10});
    $('input[type=text]').each(function(i){
        var field_id = $(this).attr('id');
        var field = new LiveValidation(field_id);
        field.add(Validate.Presence);
        if(field_id == 'department'){
            field.add(Validate.Inclusion, {within : departments});
        }
        else if(field_id == 'role'){
            field.add(Validate.Inclusion, {within : roles})
        }
    });
</script>

上記のコードは、実際に私が現在取り組んでいるアプリケーションからのコードです。私はそれだけで作業しているので、自分のコードをレビューして間違った点を指摘する人が本当にいないので、誰かが私が間違った点を指摘できるようにここに投稿しますここで行われます。また、ビュー、モデル、コントローラーに含める必要がある、または含めるべきではないものなど、MVCコードを記述する際のガイドラインも探しています。現在私が持っている現在のコードを他にどのように改善できますか?以前に本当にひどいコードをいくつか書いたことがあります(ロジックの重複など)。そのため、将来的に簡単に維持できるようにコードを改善したいと考えています。ありがとう!

5
Wern Ancheta
6
Yusubov

私は少し純粋だと思います。私にとって、モデルにはデータモデルとのやり取りに必要なすべてのロジックが含まれている必要があります。一方、コントローラーにはビジネスロジックが含まれ、データを操作して、データをビューに渡す必要があります。ビューには実際のロジックを含めないでください-表示ロジック(たとえば、このユーザーはラベルAまたはラベルBの付いたこのボタンを見る必要がありますか)は問題ないと思います。

これまでのところ、私が見つけた最良の例はYii Frameworkです。JoomlaはMVCを使用するつもりですが、一般に非常に薄いコントローラーとファットモデルを持っています-実際の処理が多すぎますコントローラ内にあるはずのモデル内。

結局のところ、ロジックは最適な場所に移動する必要があります。厳密にはデータのやり取りではないロジックをモデルに組み込んでいる場合がありますが、通常これは他のいくつかのコントローラーから呼び出す必要がある静的関数です。この場合、私はDRY原則が純粋なMVC構造よりも優れていると感じています。時々、このバランス調整があり、最終的にはどこに行くかについてのプログラマーの呼び出しです。

3
mwotton