php - link - Laravel-Calling Redirect:: to() desde la vista
redirect()- back() laravel (3)
Cuando llama a una función en la vista, debe devolver HTML que luego se muestra. Por ejemplo, cuando llamas a {{ Url::to(''foo'') }}
genera http: //yoursite.tld/foo .
Cuando llame a {{Contact::form(...)}}
, debería generar HTML. Cuando devuelve View::make(...)
, está devolviendo HTML. Cuando devuelve Redirect::to(...)
, está devolviendo un objeto Laravel que el enrutador Laravel analiza en un encabezado de redirección.
Los redireccionamientos deben ser llamados por objetos Route o por controladores. Si un controlador controla el envío de su formulario, coloque su redireccionamiento allí.
Actualmente estoy trabajando en un cms que se basa en el marco de Laravel 4. Estoy intentando construir un sistema de complementos, similar a Pyro CMS, donde se pueden incluir vistas de módulos en una vista de página utilizando el sistema de plantillas Blade.
Estoy creando un complemento de formulario de contacto que, si se envía correctamente, redirigirá al usuario a una URL determinada, o simplemente lo redireccionará a la página existente.
El código para mi clase de formulario de contacto es:
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'');
}
}
Hay un controlador de página que mostrará la vista de página adecuada según la ruta utilizada y la idea es que un usuario puede colocar un formulario de contacto en cualquier plantilla de página y personalizarlo fácilmente llamando a la función de formulario desde la vista de plantilla como se muestra a continuación
<html>
<head>
</head>
<body>
{{ Contact::form(array(
''to'' => ''[email protected]'',
''view'' => ''contact_form_1'',
)) }}
</body>
</html>
Todo esto funciona bien aparte de la redirección. Cuando el formulario se envía correctamente y el mensaje se envía, la página se actualiza y muestra el siguiente mensaje en lugar del formulario de contacto.
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.
Aproximadamente 2 segundos después, se produce el redireccionamiento y el navegador se redirige a la ruta que el usuario proporcione en la matriz $ params, o a la página actual si no se proporciona una redirección, como en el ejemplo anterior.
Cualquier sugerencia sobre por qué está haciendo esto, así como cualquier solución, sería genial.
¡Gracias!
EDITAR:
Aquí hay una breve descripción general de por qué he adoptado el enfoque anterior, que podría ayudar a comprender el problema:
Un requisito del proyecto es que los desarrolladores que eventualmente usarán el cms puedan crear una cantidad indefinida de páginas a través del panel de control de cms haciendo clic en el botón "Agregar página". La idea es que no estamos escribiendo nuevos controladores de página para cada página nueva que queremos crear. Con eso me importa que tenga la siguiente ruta:
Route::any(''{page_slug}/page'', array(''as'' => ''frontend.page'', ''uses'' => ''FrontendPagesController@display_page''))->where(''page_slug'', ''[-A-Za-z0-9_-]+'');
La función display_page
adelgazada en gran medida es:
public function display_page($slug)
{
$page = PagesModel::getPageBySlug($slug);
return View::make($page[''view_name'']);
}
Con esto los usuarios pueden crear una página haciendo clic en un botón, darle un nombre y una babosa, y la aplicación puede mostrar esa página y la vista correspondiente, definida al crear la página, sin tener que agregar ninguna ruta nueva. , controladores, etc.
El problema surge en una situación en la que un usuario desea incluir un formulario de contacto con una página. ¿Cómo sabemos si agregarán un formulario o no, qué campos usarán y qué validación requerirá? Necesito una forma de poder agregar un formulario de contacto completamente personalizado en cualquier página sin que el desarrollador tenga que tocar el código cms. Mi solución a esto fue el enfoque anterior: el desarrollador coloca la etiqueta en la vista y le pasa algunos params a la función, que personaliza la funcionalidad de los formularios.
La función Contact::form()
es como un controlador para el formulario. Obtiene y devuelve la vista que contiene el html de, procesa el envío y devuelve mensajes de éxito / error según el resultado.
Ahora no necesariamente necesito usar el enfoque anterior, pero necesito separar el controlador de formulario de contacto del controlador de página y que los desarrolladores puedan agregar un formulario a cualquier página sin tocar el código backend de cms.
Cualquier idea sobre esto sería genial.
Debería llamar a la redirect
desde un controlador en lugar de hacerlo desde la vista. Esto está sucediendo porque, ya estás en la vista y es visible, por lo que si de alguna manera puedes ocultarlo (el cuerpo), entonces no estará visible antes de que se produzca el redireccionamiento.
Pero, lo estás haciendo mal y anti-pattern
, IMO. Use el controlador para tomar decisiones, la vista debe usarse solo para la presentación. Esta es la regla básica en un marco MVC
.
Acabo de recibir este mismo problema, degradado a "4.0. *" Y solucionado.
Parece que este es un problema 4.1.x.
Pasos para degradar
Cambiar composer.json a:
"require": {
...
"laravel/framework": "4.0.x",
...
}
editar app.php - alias ''Controlador''
''Controller'' => ''Illuminate/Routing/Controller'',
Debe convertirse
''Controller'' => ''Illuminate/Routing/Controllers/Controller'',
Y tuve que eliminar esos proveedores de servicios
''Illuminate/Remote/RemoteServiceProvider'',
''Illuminate/Exception/LiveServiceProvider'',
EDITAR:
He abierto un problema sobre esto en Github y antes lo arregló Taylor. Haz una actualización del compositor y deberías estar bien.