2013-04-29 3 views
2

J'aime MVC (beaucoup), et j'essaie de m'enseigner un framework d'architecture MVC dans toutes les principales langues web d'aujourd'hui.Fonctions GET et POST dans PHP/CodeIgniter

Je suis actuellement sur CodeIgniter et PHP. J'ai cherché en ligne pour un moyen de rendre la même fonction se comporter différemment pour un POST et GET, mais n'a rien trouvé. Est-ce que CodeIgniter a cette fonctionnalité?

Si vous avez utilisé Ruby On Rails ou ASP.NET MVC, vous saurez de quoi je parle, dans les frameworks nous pouvons le faire:

[GET] 
public ActionResult Edit(int Id) 
{ 
    // logic here for GET 
} 

[POST] 
public ActionResult Edit(EntityX EX) 
{ 
    // logic here for POST 
} 

Je suis tellement habitué à cela, que je trouve difficile d'enrouler ma tête autour de la façon d'obtenir la même fonctionnalité lisse sans cette capacité utile.

Ai-je raté quelque chose? Comment puis-je obtenir la même chose dans CodeIgniter?

Merci

+0

signifie que vous voulez vérifier publierez à l'aide codeignitor? –

+0

Non, je sais qu'il peut vérifier le GET et POST comme un programme PHP régulier peut. Mais je demandais spécifiquement d'avoir deux fonctions avec le même nom dans le même contrôleur. L'un s'exécute lorsque la requête est de type GET, et l'autre lorsque la requête est de type POST. – Ciwan

+2

Vous ne pouvez pas. C'est une limitation dans la convention de dénomination pour les actions de "contrôleur" CI. –

Répondre

4

Ai-je raté quelque chose? Comment puis-je obtenir la même chose dans CodeIgniter?

si vous voulez apprendre comment aborder vraiment MVC en PHP, vous pouvez apprendre de Tom Butler articles

CodeIgniter implémente modèle Model-View-présentateur, pas MVC (même si c'est le cas). Si vous voulez implémenter une application de type MVC, vous êtes sur la mauvaise voie.

En MVP:

  • View peut être une classe ou un modèle html. La vue ne devrait jamais être au courant d'un modèle.
  • La vue ne doit jamais contenir de logique métier
  • Un présentateur est juste une colle entre une vue et le modèle. C'est aussi responsable de la production de sortie.

Note: Un modèle ne doit jamais être classe singulière. C'est un certain nombre de classes. Je l'appellerai "Modèle" juste pour la démonstration.

Il ressemble comme:

class Presenter 
{ 
    public function __construct(Model $model, View $view) 
    { 
     $this->model = $model; 
     $this->view = $view; 
    } 

    public function indexAction() 
    { 
     $data = $this->model->fetchSomeData(); 

     $this->view->setSomeData($data); 

     echo $this->view->render(); 
    } 
} 

Dans MVC:

  • vues ne sont pas des modèles HTML, mais les classes qui sont responsables de la logique de présentation
  • Une vue a accès direct à un modèle
  • Un contrôleur ne doit pas générer de ponse, mais le changement des variables modèle (par exemple affecter vars de $_GET ou $_POST
  • Un contrôleur ne doit pas être au courant d'une vue

Par exemple,

class View 
{ 
    public function __construct(Model $model) 
    { 
     $this->model = $model; 
    } 

    public function render() 
    { 
     ob_start(); 

     $vars = $this->model->fetchSomeStuff(); 

     extract($vars); 

     require('/template.phtml'); 

     return ob_get_clean(); 
    } 
} 

class Controller 
{ 
    public function __construct(Model $model) 
    { 
     $this->model = $model; 
    } 

    public function indexAction() 
    { 
     $this->model->setVars($_POST); // or something like that 
    } 
} 

$model = new Model(); 
$view = new View($model); 

$controller = new Controller($model); 

$controller->indexAction(); 

echo $view->render(); 
+0

Je ne sais pas qui Tom Butler, bien que j'ai trouvé son blog et je me suis retrouvé ici, est mais il dit le contraire n'est-ce pas? J'aimerais qu'il/puisse "débattre" à ce sujet. Où il ferait ça, je ne sais pas. – johnny

+1

johnny: Envoyez-moi un e-mail. bad_boy a raison, son exemple a l'état de l'application (par exemple, "quel est l'ID de l'enregistrement en cours de modification, ou quel est le terme recherché pour les résultats affichés) stocké dans le modèle et obtient la vue modèle plutôt que d'être alimenté par le contrôleur.Le flux de données dans l'exemple ci-dessus est correct. –

2

Les paramètres ne vous permettent de récupérer les variables GET. Si vous souhaitez obtenir les POST variables, vous devez utiliser la bibliothèque d'entrée qui est automatiquement chargée par CodeIgniter:

$this->input->post('data'); 

Ainsi, dans votre cas, il serait:

public function edit($id = -1) 
{ 
    if($id >= 0 && is_numeric($id)) 
    { 
     // logic here for GET using $id 
    } 
    else if($id === -1 && $this->input->post('id') !== false) 
    { 
     // logic here for POST using $this->input->post('id') 
    } 
} 

Notez que vous peut également utiliser cette bibliothèque pour obtenir GET, COOKIE et SERVER variables:

$this->input->get('data'); 
$this->input->server('data'); 
$this->input->cookie('data');