Je l'ai fait MVC pendant quelques mois en utilisant maintenant le cadre CodeIgniter dans PHP mais je ne sais pas encore si je fais vraiment les choses.
Ce que je fais actuellement est:
Modèle - C'est là que je place des requêtes de base de données (sélectionnez, insérer, mettre à jour, suppression). Voici un échantillon de l'un des modèles que j'ai:
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 - Parlez au modèle, appelle les méthodes du modèle qui interroge la base de données, fournit les données que les vues afficheront (des alertes de succès, des alertes d'erreur, des données de la base de données), hérite d'un contrôleur parent. Quelles vérifies si l'utilisateur est connecté. Voici un échantillon:
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);
}
}
Vues - C'est là que j'ai mis le code HTML, CSS et JavaScript (code de validation de formulaire pour le formulaire actuel, en boucle via les données fournies par contrôleur, quelques déclarations pour masquer et afficher des choses en fonction de la données fournies par le contrôleur).
<!--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>
Les codes ci-dessus sont en fait le code de l'application que je travaille actuellement. Je travaille seul sur celui-ci, alors je n'ai pas vraiment quelqu'un à revoir mon code pour moi et signalez les mauvaises choses de cela, donc je l'affiche ici dans l'espoir que quelqu'un pouvait signaler les mauvaises choses que j'ai fait ici. Je cherche également des lignes directrices dans l'écriture de code MVC comme quelles sont les choses qui devraient être et ne devraient pas être incluses dans des vues, des modèles et des contrôleurs. Sinon, comment puis-je améliorer le code actuel que j'ai actuellement? J'ai déjà écrit un code vraiment terrible avant (duplication de la logique, etc.) C'est pourquoi je veux améliorer mon code afin que je puisse facilement le maintenir à l'avenir. Merci!
Il existe certaines séries de questions et réponses sur la manière d'utiliser le motif MVC dans PHP. Voici une belle réponse sur les détails MVC pour PHP application - Comment un modèle doit-il être structuré en MVC?
Une autre liste de postes qui pourraient aussi être utiles:
Je suis un peu puriste, je pense. Pour moi, les modèles doivent contenir toute la logique requise pour interagir avec le modèle de données, tandis que le contrôleur doit contenir la logique commerciale, manipuler les données, puis transmettre les données aux vues. Les vues ne doivent contenir aucune logique réelle - bien que je pense que la logique d'affichage (E.G. Si cet utilisateur doit voir ce bouton avec une étiquette A ou une étiquette B?) Est ok.
Jusqu'à présent, le meilleur exemple que j'ai trouvé à cet égard est dans le Yii Cadre. Joomla, tandis que la prétexte à utiliser MVC, a généralement des contrôleurs très minces et des modèles de graisse - une trop grande partie du traitement réel arrive dans le modèle quand il devrait être dans le contrôleur.
En fin de compte, la logique doit aller où elle convient le mieux. Je trouve parfois parfois la mise en place de la logique qui n'est pas une interaction strictement des données dans le modèle, mais il s'agit généralement d'une fonction statique que je dois appeler de plusieurs autres contrôleurs. Dans ce cas, je me sens le DRY Principe survient la structure PURE MVC. Parfois, il y a cette loi d'équilibrage et, en définitive, c'est l'appel du programmeur sur ce qui se passe.