2010-12-14 8 views
8

Iam frente a un problema típico con un formulario enviado utilizando Zend framework. Básicamente, he escrito un código simple para iniciar sesión en un usuario, pero esto salió de la nada.Un problema típico con el inicio de sesión usando Zend_Form

El código para mostrar la forma es bastante estándar

$ LoginForm = new Application_Form_Login(); $ loginform-> setMethod ('post'); $ loginform-> setAction ('login'); $ this-> view-> form = $ loginform;

Cuando uso mi página de inicio URL como - http://localhost.ruin.com/public/

consigo una excepción

Page not found 
Exception information: 

Message: Invalid controller specified (login) 
Stack trace: 

#0 C:\domains\ruin\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#1 C:\domains\ruin\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#2 C:\domains\ruin\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#3 C:\domains\ruin\public\index.php(27): Zend_Application->run() 
#4 {main} 

Request Parameters: 

array (
    'controller' => 'login', 
    'action' => 'index', 
    'module' => 'default', 
    'username' => 'fsdf', 
    'password' => 'fdsf', 
    'submit' => 'submit', 
) 

Sin embargo si uso la url base como http://localhost.ruin.com/public/index/, el mismo código funciona perfectamente.

También sé que es debido al hecho de que en la primera url el enrutador zend está estropeando el controlador de índice con inicio de sesión ya que no puede agregar la acción de inicio de sesión al controlador de índice predeterminado.

lo que ustedes piensan que esto es por diseño de Zend Framework y que se tienen que enviar con fuerza mis usuarios a esta url http://localhost.ruin.com/public/index/ cada vez que lleguen a la página principal o hay una manera de hacer mi trabajo código con http://localhost.ruin.com/public/

¿Alguna sugerencia?

+0

publicar el contenido del archivo .htaccess de su ruta y – Ish

+0

Lo que ocurre si se intenta el acceso/public/login/índice? –

+0

@ishkumar - No hay rutas personalizadas, .htaccess es el valor predeterminado que genera la herramienta zend. No se hicieron cambios a ninguno de ellos. –

Respuesta

2

Respuesta corta:

$form->setAction('/public/index/login'); 

respuesta ridículamente detallado a continuación: ;-)

Un punto de confusión es el uso del término "acción".

Con respecto a una forma, "acción" se refiere a la cualidad de la acción:

<form action="/url/at/which/the/form/will/be/processed" method="post"> 

Esto se hará referencia a la acción cuando se llama $form->setAction() método. El punto clave es que debe ser URL, y la aplicación debe tener un enrutamiento en el lugar que asigna este URL a un par (controlador, acción).

Lo que aparece en la otra forma en que se usa el término "acción": como un nombre abreviado para un método en un controlador. Por ejemplo, la acción llamada "sonrisa" se asigna al método smileAction() en el controlador.

Por lo tanto, en su caso, el problema es que la llamada de setAction() de su formulario esté sincronizada con la ruta de la aplicación.

Al especificar el URL de "inicio de sesión" como acción del formulario, proporciona una URL relativa, por lo que el navegador interpretará esto como relativo a la URL que aparece en la barra de ubicación del navegador. Cuando navega hacia la página, pero deja de lado la parte de "índice" de la URL, el enrutamiento predeterminado en el marco de trabajo visualiza "iniciar sesión" como el controlador. Como no tiene LoginController, la solicitud genera un error.

Así que su IndexController podría parecer:

<?php 

class IndexController extends Zend_Controller_Action 
{ 
    public function indexAction() 
    { 
     $this->view->form = $this->_getForm(); 
    } 

    public function loginAction() 
    { 
     $form = $this->_getForm(); 
     if ($this->getRequest()->isPost()){ 
      if ($form->isValid($this->getRequest()->getPost())){ 
       // All cool. Process your form, 
       // probably with a redirect afterwords to 
       // clear the POST. 
      } 
     } 

     // Still alive? 
     // Then it was either not a post request or the form was invalid. 
     // In either case, set the form in the view 
     $this->view->form = $form; 
    } 

    /** 
    * A helper method to keep the form creation DRY 
    */ 
    protected function _getForm() 
    { 
     $loginform = new Application_Form_Login(); 
     $loginform->setMethod('post'); 

     // Points the form to the IndexController::loginAction(); 
     $loginform->setAction('/public/index/login'); 
     return $loginform; 
    } 
} 

El resultado es que la setAction() llamada necesita una dirección URL que el router puede asignar a un controlador/acción par sabe cómo procesar el mensaje.

Espero que esto ayude!

-1

Lo primero que debe darse cuenta es que la carpeta "público" en su ejemplo debe ser la raíz del servidor web (o DocumentRoot). Una vez que lo haya configurado correctamente, verá que puede acceder a su sitio usando http://localhost.ruin.com, y estoy seguro de que su formulario de inicio de sesión funcionará sin ningún problema.

Consulte http://framework.zend.com/manual/en/project-structure.project.html para más información.

+0

No tiene nada que ver con la estructura del directorio. –

2

Es necesario configurar la URL de su acción como esta:

Si estás en la vista

$this->form->setAction($this->url(array('params here or'), 'the route name')); 

Si se encuentra en el controlador

$form->setAction($this->_helper->url(array('params or...'), 'the route name')); 

o

$form->setAction($this->getRequest()->getBaseUrl() . '/index/login'); 

Ver esta re RELAClONADAS pregunta:

Zend Form SetAction Using Named Routes

+1

Esta respuesta es mejor que la aceptada, pero en el controlador se debe usar el ayudante de acción en lugar de ver ayuda. – takeshin

+0

Gracias @takeshin Agregué su recomendación. –

Cuestiones relacionadas