Laravel - Appel Redirect::to() dans la vue
Je suis actuellement en train de travailler sur un cms qui est construit sur le Laravel 4 cadre. Je suis en train de construire un système de plugin, semblable à une Pyro CMS, où le module de vues peuvent être inclus dans une page vue à l'aide de la Lame d'un système de template.
Je suis en train de construire un formulaire de contact plugin que si elles ont été soumises avec succès redirige l'utilisateur vers une url donnée, ou tout simplement de redirection de la page existante.
Le code de mon formulaire de contact classe est:
class Contact {
public static function form($params)
{
//get params and execute relevant logic here
$redirect = isset($params['redirect']) ? $params['redirect'] : Request::url();
$data = Input::all();
if($data)
{
//Run validation and send message here
return Redirect::to($redirect)
}
return View::make('contact_form_view');
}
}
Il y a un contrôleur de la page qui va afficher la page appropriée de la vue en fonction de l'itinéraire utilisé et l'idée est que l'utilisateur peut déposer un formulaire de contact dans un modèle de page, et personnalisez-le en appelant le formulaire de fonction dans le modèle de vue, comme indiqué ci-dessous
<html>
<head>
</head>
<body>
{{ Contact::form(array(
'to' => '[email protected]',
'view' => 'contact_form_1',
)) }}
</body>
</html>
Tout cela fonctionne très bien en dehors de la redirection. Lorsque le formulaire est soumis avec succès et le message envoyé à l'actualisation de la page et affiche le message suivant à la place du formulaire de contact
HTTP/1.0 302 Found Cache-Control: no-cache Date: Tue, 17 Sep 2013 09:14:16 GMT Location: http://localhost:8888/my_initial_route Redirecting to http://localhost:8888/my_new_route.
Environ 2 secondes plus tard, la redirection se met alors en place et le navigateur est redirigé vers quel que soit le parcours de l'utilisateur dans le tableau $params, ou à la page en cours, si aucune redirection n'est fournie, comme dans l'exemple ci-dessus.
Des suggestions quant à pourquoi il agit de cette façon, ainsi que des solutions, serait formidable.
Merci!
EDIT:
Ici est un aperçu des raisons pour lesquelles j'ai pris l'approche ci-dessus, ce qui pourrait aider à la compréhension du problème:
Une exigence de la projet est que les développeurs qui vont finalement utiliser le cms peut créer une quantité indéfinie de pages via le cms panneau de configuration en cliquant sur "Ajouter une page" bouton. L'idée est que nous n'avons pas écrit une nouvelle page de contrôleurs pour chaque nouvelle page que nous voulons créer. Avec ce que j'ai l'esprit j'ai le parcours suivant:
Route::any('{page_slug}/page', array('as' => 'frontend.page', 'uses' => 'FrontendPagesController@display_page'))->where('page_slug', '[-A-Za-z0-9_-]+');
La display_page
fonction allégée fortement, c'est:
public function display_page($slug)
{
$page = PagesModel::getPageBySlug($slug);
return View::make($page['view_name']);
}
Avec ce que les utilisateurs peuvent créer une page avec le clic d'un bouton, lui donner un nom et une limace, et l'application peut ensuite afficher cette page et la vue correspondante, définies lors de la création de la page, sans avoir à ajouter de tout nouveaux itinéraires, contrôleurs, etc.
Le problème arrises dans une situation où un utilisateur souhaite inclure un formulaire de contact avec une page. Comment pouvons-nous savoir si ils vont ajouter un formulaire ou pas, quels sont les domaines qu'ils vont utiliser et de validation il faudra? J'ai besoin d'un moyen de pouvoir ajouter une formulaire de contact personnalisé dans n'importe quelle page sans que le développeur n'ait à toucher toucher le cms code. Ma solution à ce problème est l'approche présentée ci-dessus: le développeur gouttes de la balise dans la vue et passe de la fonction de certains paramètres, permettant de "personnaliser" les formes de la fonctionnalité.
La Contact::form()
fonction est comme une sorte de contrôleur pour la forme. Il récupère et retourne la vue qui contient le html, le processus de soumission et renvoie succès/les messages d'erreurs en fonction du résultat.
Maintenant, je n'ai pas forcément besoin d'utiliser l'approche ci-dessus, mais j'ai besoin d'une manière de séparer le formulaire de contact du contrôleur le contrôleur de la page et pour les développeurs, pour être en mesure d'ajouter un formulaire à une page sans toucher à la cms backend code.
Toutes les idées sur ce serait génial.
vous devez rediriger sur le contrôleur et non sur la vue depuis View::make() affichera quelque chose avant de rediriger.. et en-têtes ont déjà été envoyés.
OriginalL'auteur ArranJacques | 2013-09-17
Vous devez vous connecter pour publier un commentaire.
Vous devriez appeler le
redirect
à partir d'un contrôleur au lieu de le faire à partir de la vue. Ce qui se passe parce que vous êtes déjà dans le point de vue et il est visible, donc si vous en quelque sorte pourrait faire ça (le corps), caché, alors il ne sera pas visible avant la redirection se passe.Mais, vous le faites mal et
anti-pattern
, de l'OMI. Utiliser le contrôleur pour prendre une décision, de vue doit être utilisée que pour la présentation. C'est la règle de base dans unMVC
cadre.pas de prob. je suis juste inquiet de l'OP peut prendre ce chemin qui devrait avoir sauvé beaucoup de maux de tête si il n'essayez pas de le faire. 😉
Merci pour la réponse. J'apprécie le fait que l'approche que j'ai pris n'est pas des meilleures pratiques par tous les moyens; il était cependant une solution à un problème plus général, j'ai été confronté, qui était de séparer le contact du contrôleur le contrôleur de la page. J'ai élargi mon premier post un peu pour donner un peu plus de perspicacité si vous avez des idées?
OriginalL'auteur The Alpha
Lorsque vous appelez une fonction dans la vue, il doit renvoyer le code HTML qui s'affiche ensuite. Par exemple, lorsque vous appelez
{{ Url::to('foo') }}
il génère http://yoursite.tld/foo.Lorsque vous appelez
{{Contact::form(...)}}
, il devrait de sortie HTML. Lorsque vous revenezView::make(...)
, vous êtes de retour HTML. Lorsque vous revenezRedirect::to(...)
, vous êtes de retour d'une Laravel objet dont le Laravel routeur analyse en une redirection en-tête.Redirige assez bien pu être appelé soit par les objets Route ou par les contrôleurs. Si vous avez votre formulaire de soumission géré par un contrôleur, mettez votre redirection.
OriginalL'auteur J.T. Grimes
Viens de recevoir ce même problème, rétrogradé à "4.0.*" et c'est corrigé.
Il semble que ce soit un 4.1.x problème.
Étapes de déclasser
Changement de compositeur.json:
modifier app.php - "Contrôleur" alias
Devrait devenir
Et j'ai dû enlever les fournisseurs de services
EDIT:
J'ai ouvert un problème à ce sujet sur Github et plus tôt Taylor fixe. Faire un compositeur de mise à jour et vous devriez être bien.
OriginalL'auteur Antonio Carlos Ribeiro
La manière la plus simple:
OriginalL'auteur Kiko Seijo