Типичная проблема при входе в систему с использованием Zend_Form - PullRequest
8 голосов
/ 14 декабря 2010

Я столкнулся с типичной проблемой при отправке формы с использованием Zend Framework. В основном я написал простой код для входа в систему пользователя, но это прозвучало неожиданно.

Код для отображения формы довольно стандартный

$ loginform = new Application_Form_Login (); $ Loginform-> setMethod ( 'сообщение'); $ Loginform-> SetAction ( 'войти в'); $ this-> view-> form = $ loginform;

Когда я использую URL своей домашней страницы как - http://localhost.ruin.com/public/

Я получаю исключение

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',
)  

Однако, если я использую базовый URL как http://localhost.ruin.com/public/index/, тот же код работает отлично.

Я также знаю, что это связано с тем, что в первом URL-адресе Zend-маршрутизатор путает контроллер индекса с логином, поскольку он не может добавить действие входа в контроллер индекса по умолчанию.

Ребята, вы думаете, что это сделано из Zend Framework, и мне придется принудительно отправлять своих пользователей на этот URL? http://localhost.ruin.com/public/index/ всякий раз, когда они попадают на домашнюю страницу или есть способ заставить мой код работать с http://localhost.ruin.com/public/

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 14 декабря 2010

Вам нужно установить URL вашего действия следующим образом:

Если вы на виду

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

Если вы находитесь на контроллере

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

или

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

Смотрите этот связанный вопрос:

Zend Form SetAction с использованием именованных маршрутов

2 голосов
/ 14 декабря 2010

Краткий ответ:

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

Смешно многословный ответ следует:; -)

Одной из путаниц является использование термина "действие".

СЧто касается формы , «действие» относится к атрибуту действия:

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

Это действие будет упоминаться при вызове метода $form->setAction().Ключевым моментом является то, что это должен быть URL , и приложение должно иметь на месте маршрутизацию, которая отображает этот URL на пару (контроллер, действие).

, которая вызывает другойспособ, которым используется термин «действие»: в качестве сокращенного имени для метода на контроллере.Например, действие с именем «smile» отображается на метод smileAction() на контроллере.

Таким образом, в вашем случае проблема заключается в том, чтобы синхронизировать вызов setAction() вашей формы с маршрутизациейэто на месте для приложения.

Указывая URL-адрес «логин» в качестве действия формы, вы предоставляете относительный URL-адрес, поэтому браузер будет интерпретировать его как URL-адрес, отображаемый в строке адреса браузера.Когда вы переходите на страницу, но пропускаете часть URL-адреса «index», тогда маршрутизация по умолчанию в платформе рассматривает «login» как контроллер.Поскольку у вас нет LoginController, запрос прекращается.

Так что ваш IndexController может выглядеть следующим образом:

<?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;
    }
}

В результате вызову setAction () требуется URL-адрес, которыймаршрутизатор может подключиться к контроллеру / пара действий знает, как обрабатывать сообщение.

Надеюсь, это поможет!

0 голосов
/ 14 декабря 2010

Первое, что вы должны осознать, это то, что папка public в вашем примере должна быть корнем сети (или DocumentRoot).После правильной настройки вы увидите, что можете получить доступ к своему сайту с помощью http://localhost.ruin.com,, и я совершенно уверен, что ваша форма входа будет работать без проблем.

См. http://framework.zend.com/manual/en/project-structure.project.html для получения дополнительной информации.

...