我想为我的项目添加用户身份验证。我使用了这本书" Webentwicklung mit Zend Framework 2"由Michael Romer撰写。但第240行的第一步将无效。这是我的文件:
AuthController.php:
<?php
namespace Application\Controller;
use Application\Form\LoginForm;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class AuthController extends AbstractActionController
{
private $loginForm;
public function loginAction()
{
if(!$this->loginForm)
{
throw new \BadMethodCallException('Login Form not yet set!');
}
//var_dump($this);
if($this->getRequest()->isPost())
{
$this->loginForm->setData($this->getRequest()->getPost());
if($this->loginForm->isValid())
{
var_dump($this->loginForm->getData());
exit;
}
else
{
return new ViewModel(
array(
'form' => $this->loginForm
)
);
}
}
else
{
return new ViewModel(
array(
'form' => $this->loginForm
)
);
}
}
public function setLoginForm($loginForm)
{
$this->loginForm = $loginForm;
}
public function getLoginForm()
{
return $this->loginForm;
}
}
LoginForm.php:
<?php
namespace Application\Form;
use Zend\Form\Form;
class LoginForm extends Form
{
public function __construct()
{
parent::__construct('loginForm');
$this->setAttribute('action', '/login');
$this->setAttribute('method', 'post');
$this->setInputFilter(new \Application\Form\LoginFilter());
$this->add(array(
'name' => 'username',
'attributes' => array(
'type' => 'text',
),
'options' => array(
'label' => 'Benutzername:',
)
));
$this->add(array(
'name' => 'password',
'attributes' => array(
'type' => 'password',
),
'options' => array(
'label' => 'Password:',
)
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Einloggen'
),
));
}
}
LoginFilter.php:
<?php
namespace Application\Form;
use Zend\Form\Form;
use Zend\InputFilter\InputFilter;
class LoginFilter extends InputFilter
{
public function __construct()
{
$this->add(array(
'name' => 'username',
'required' => true,
));
$this->add(array(
'name' => 'password',
'required' => true,
));
}
}
login.phtml:
<?php
$this->form->prepare();
echo $this->form()->openTag($this->form);
echo $this->formRow($this->form->get('username'));
echo $this->formRow($this->form->get('password'));
echo $this->formSubmit($this->form->get('submit'));
echo $this->form()->closeTag();
AuthControllerFactory.php:
<?php
namespace Application\Controller;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class AuthControllerFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$ctr = new AuthController();
print_r("hier");
die();
$ctr->setLoginForm(new \Application\Form\LoginForm());
return $ctr;
}
}
我的module.config.php部分:
...
return array(
'router' => array(
'routes' => array(
'login' => array(
'type' => 'Literal',
'options' => array(
'route' => '/login',
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Auth',
'action' => 'login',
),
),
),
...
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
'Application\Controller\Auth' => 'Application\Controller\AuthController'
),
...
当我请求URL /登录时,浏览器显示消息:
Login Form not yet set!
我认为,AuthController.php和AuthControllerFactory.php之间有任何错误,但我现在还没有改变什么。
有人可以帮助我吗?
谢谢!
答案 0 :(得分:2)
您的控制器已更改为工厂,因此它不能再保留在invokables
阵列中。它应该是这样的:
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
),
'factories' => array(
'Application\Controller\Auth' => 'Application\Controller\AuthControllerFactory'
)
)
当然,这也是在书中完成的。
此外,我建议不要重新发明轮子,因为我们有几个好的模块。 ZfcUser
就是你要找的东西。