Iam面临使用Zend框架提交表单的典型问题。基本上我已经写了一个简单的代码来登录用户,但这很明显。
显示表单的代码非常标准
$ loginform = new Application_Form_Login(); $ loginform->使用setMethod( '后'); $ loginform-> setAction命令( '登录'); $ this-> view-> form = $ loginform;
当我使用我的主页网址为 - 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',
)
但是,如果我将基本网址用作http://localhost.ruin.com/public/index/,则相同的代码可以正常运行。
我也知道这是因为在第一个url中,zend路由器正在通过登录搞乱索引控制器,因为它无法将登录操作附加到默认索引控制器。
你们认为这是Zend Framework的设计吗?我必须强行将我的用户发送到这个网址 http://localhost.ruin.com/public/index/只要他们点击主页,或者我有办法让我的代码可以使用 http://localhost.ruin.com/public/
有什么建议吗?
答案 0 :(得分:2)
简短回答:
$form->setAction('/public/index/login');
可笑的回答如下:; - )
混淆的一点是使用“行动”一词。
关于表单,“action”指的是action属性:
<form action="/url/at/which/the/form/will/be/processed" method="post">
这是您调用$form->setAction()
方法时要参考的操作。关键点在于它必须是 URL ,并且应用程序必须具有将此URL映射到(控制器,操作)对的路由。
这引出了使用术语“action”的另一种方式:作为控制器上方法的简写名称。例如,名为“smile”的操作映射到控制器上的方法smileAction()
。
因此,在您的情况下,问题在于让您的表单的setAction()
调用与应用程序的路由同步。
通过将URL“login”指定为表单的操作,您将提供 relative URL,因此浏览器会将其解释为相对于浏览器位置栏中显示的URL。当您浏览到该页面但没有关闭URL的“索引”部分时,框架中的默认路由会将“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知道如何处理帖子。
希望这有帮助!
答案 1 :(得分:2)
您需要像下面这样设置动作的网址:
如果你在观看
$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');
请参阅此相关问题:
答案 2 :(得分:-1)
首先应该意识到的是,示例中的“public”文件夹应该是Web根目录(或DocumentRoot)。正确设置后,您会看到可以使用http://localhost.ruin.com访问您的网站,而且我非常确定您的登录表单可以正常运行。
有关详细信息,请参阅http://framework.zend.com/manual/en/project-structure.project.html。