2010-12-01 22 views
2

Symfony Lorsque je produis module symfony 1.4, il crée (par exemple) « Nouveau » et « Créer » méthodes comme celle-ci:génération

public function executeNew(sfWebRequest $request) 
{ 
    $this->form = new SomeForm(); 
} 

public function executeCreate(sfWebRequest $request) 
{ 
    $this->forward404Unless($request->isMethod(sfRequest::POST)); 

    $this->form = new SomeForm(); 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 
    if ($form->isValid()) 
    { 
    $res_object = $form->save(); 
    $this->redirect('results_show', $res_object); 
    } 

    $this->setTemplate('new'); 
} 

Avec --non-verbose-templates il génère quelque chose comme le code ci-dessous (je l'ai modifié pour afficher uniquement la partie création):

public function executeNew(sfWebRequest $request) 
{ 
    $this->forward404Unless($request->isMethod(sfRequest::POST)); 

    $this->form = new SomeForm(); 
    if ($request->isMethod(sfRequest::POST)) { 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 
    if ($form->isValid()) 
    { 
     $res_object = $form->save(); 
     $this->redirect('results_show', $res_object); 
    } 
    } 
} 

Quelle est la raison d'une telle génération par défaut? Je pense que la méthode ci-dessous est plus compacte, ajoute des routes et des actions moindres et ne change pas l'URL pour le premier et le prochain affichage (s'il y avait des erreurs). Mais la méthode de génération par défaut devrait être la meilleure ou la plus souvent utilisable. Alors, que savent les gars de Sensio Labs, mais pas moi?

Répondre

2

Le premier modèle est mieux adapté à la création d'une application RESTful avec Symfony.

Si vous souhaitez utiliser la classe intelligente sfObjectRouteCollection pour créer une collection d'itinéraires, les méthodes executeNew et executeCreate sont attendues.

sfObjectRouteCollection par défaut crée des itinéraires pour les actions suivantes:

liste

, nouveau, créer, modifier, mettre à jour, supprimer et spectacle.

Vous avez raison que votre modèle préféré n'a qu'une seule URL, mais vraiment ce n'est pas un problème si vous utilisez des formulaires Doctrine/Propel et l'aide form_tag_for(). Cette aide prend la forme et le nom de la collection de route en tant qu'arguments puis détermine pour elle-même quelle est la bonne route/URL à utiliser dans la collection.

+0

Mais il peut y avoir une telle situation. L'utilisateur a rempli le formulaire (some_form/new), mais a fait quelques erreurs (redirigé vers un_form/create). Il n'avait plus le temps de terminer cette tâche, mais il voulait finir de la remplir à l'avenir (ou simplement remplir le formulaire). Que fait l'utilisateur dans cette situation? Oui - marque les signets de la page. Mais que va-t-il voir, quand il reviendra ?! 404! Parce qu'il retournera à l'action qui fonctionne uniquement avec la méthode POST (some_form/create). Je ne pense pas que ce soit bon. – kpower

+0

nouveau et créer peut partager la même URL et les routes peuvent être différenciées par type de demande –

+0

Bien sûr, mais vous devez ajouter des règles personnalisées pour faire la configuration correcte et cela ne fonctionnera pas "de la boîte". Ai-je raison? – kpower