使用zend框架进行用户身份验证2

时间:2014-03-06 10:52:57

标签: php zend-framework2

我想为我的项目添加用户身份验证。我使用了这本书" 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之间有任何错误,但我现在还没有改变什么。

有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您的控制器已更改为工厂,因此它不能再保留在invokables阵列中。它应该是这样的:

'controllers' => array(
    'invokables' => array(
        'Application\Controller\Index' => 'Application\Controller\IndexController',            
    ),
    'factories' => array(
        'Application\Controller\Auth' => 'Application\Controller\AuthControllerFactory'
    )
)

当然,这也是在书中完成的。

此外,我建议不要重新发明轮子,因为我们有几个好的模块。 ZfcUser就是你要找的东西。