Php 致命错误:当使用zend framework 2创建表单时,调用null上的成员函数setAttribute()

Php 致命错误:当使用zend framework 2创建表单时,调用null上的成员函数setAttribute(),php,zend-framework,zend-framework2,Php,Zend Framework,Zend Framework2,致命错误:尝试使用Zend Framework创建表单时,在\module\Admin\view\Admin\index\login.phtml中调用null上的成员函数setAttribute() 谁能帮帮我,我哪里做错了。我粘贴了所有的代码 \module\Admin\src\Admin\Controller\LoginController.php class LoginController extends AbstractActionController { protected $us

致命错误:尝试使用Zend Framework创建表单时,在\module\Admin\view\Admin\index\login.phtml中调用null上的成员函数setAttribute()

谁能帮帮我,我哪里做错了。我粘贴了所有的代码

\module\Admin\src\Admin\Controller\LoginController.php

class LoginController extends AbstractActionController
{
protected  $usersTable = null;

public function indexAction()
{
    return new ViewModel();
}

public function loginAction(){
    $form = new LoginForm();
    $form->get('submit')->setValue('Login');

    $request = $this->getRequest();
    if($request->isPost()){
        $login = new Login();
        $form->setInputFilter($login->getInputFilter());
        $form->setData($request->getPost());

        if($form->isValid()){
            $login->exchangeArray($form->getData());
            $this->getLoginDetails()->saveLoginForm($login);

            // Redirect to list of albums
            return $this->redirect()->toRoute('index');
        }

    }

    return array('form' => $form);
}
}

 \module\Admin\src\Admin\Form

 namespace Admin\Form;

 use Zend\Form\Form;

 class LoginForm extends Form
 {
 public function _construct()
 {

     parent::_construct('admin');

     $this->add(array(
         'name' => 'username',
         'type' => 'Text',
         'options' => array(
             'label' => 'Username',
             'id' => 'txtUsername',
         ),
     ));

     $this->add(array(
         'name' => 'password',
         'type' => 'password',
         'options' => array(
             'label' => 'Password',
             'id' => 'txtPassword',
         ),
     ));
     $this->add(array(
         'name' => 'submit',
         'type' => 'Submit',
         'attributes' => array(
             'value' => 'Login',
             'id' => 'btnSubmit',
         ),
     ));
 }
 }

\module\Admin\src\Admin\Model

namespace Admin\Model;

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class Login implements InputFilterAwareInterface{

public $username;
public $password;
protected $inputFilter;

public function exchangeArray($data)
{
    $this->artist = (isset($data['username'])) ? $data['username'] : null;
    $this->title  = (isset($data['password']))  ? $data['password']  : null;
}

public function setInputFilter(InputFilterInterface $inputFilter){
    throw new \Exception("not used");
}

public function getInputFilter(){
    if(!$this->inputFilter){
        $inputFilter = new InputFilter();

        $inputFilter->add(array(
            'name'     => 'username',
            'required' => true,
            'filters'  => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'    => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min'      => 1,
                        'max'      => 50,
                    ),
                ),
            ),
        ));

        $inputFilter->add(array(
            'name'     => 'password',
            'required' => true,
            'filters'  => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'    => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min'      => 1,
                        'max'      => 50,
                    ),
                ),
            ),
        ));

        $this->inputFilter = $inputFilter;
    }

    return $this->inputFilter;
}

\module\Admin\view\admin\index
<?php


$form = $this->form;

$form->setAttribute('action', $this->url('admin', array('action' => 'login')));
$form->prepare();

echo $this->form()->openTag($form);
echo $this->formRow($form->get('username'));
echo $this->formRow($form->get('password'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();

echo $this->$form;
\module\Admin\src\Admin\Controller\LoginController.php
类LoginController扩展AbstractActionController
{
受保护的$usersTable=null;
公共函数索引()
{
返回新的ViewModel();
}
公共函数登录(){
$form=new LoginForm();
$form->get('submit')->setValue('Login');
$request=$this->getRequest();
如果($request->isPost()){
$login=新登录名();
$form->setInputFilter($login->getInputFilter());
$form->setData($request->getPost());
如果($form->isValid()){
$login->exchangearlay($form->getData());
$this->getLoginDetails()->saveLoginForm($login);
//重定向到相册列表
返回$this->redirect()->toRoute('index');
}
}
返回数组('form'=>$form);
}
}
\模块\Admin\src\Admin\Form
名称空间管理\表单;
使用Zend\Form\Form;
类LoginForm扩展了表单
{
公共功能(构造)
{
父项::_构造('admin');
$this->add(数组)(
“名称”=>“用户名”,
'类型'=>'文本',
“选项”=>数组(
“标签”=>“用户名”,
'id'=>'txtUsername',
),
));
$this->add(数组)(
“名称”=>“密码”,
'键入'=>'密码',
“选项”=>数组(
“标签”=>“密码”,
'id'=>'txtPassword',
),
));
$this->add(数组)(
'名称'=>'提交',
'类型'=>'提交',
'属性'=>数组(
'值'=>'登录',
'id'=>'btnSubmit',
),
));
}
}
\模块\Admin\src\Admin\Model
名称空间管理\模型;
使用Zend\InputFilter\InputFilter;
使用Zend\InputFilter\InputFilterAwareInterface;
使用Zend\InputFilter\InputFilterInterface;
类登录实现InputFilterAwareInterface{
公共$username;
公共密码;
受保护的$inputFilter;
公共函数exchangeArray($data)
{
$this->artist=(isset($data['username'])?$data['username']:null;
$this->title=(isset($data['password'])?$data['password']:null;
}
公共函数setInputFilter(InputFilterInterface$inputFilter){
抛出新\异常(“未使用”);
}
公共函数getInputFilter(){
如果(!$this->inputFilter){
$inputFilter=新的inputFilter();
$inputFilter->添加(数组)(
“名称”=>“用户名”,
“必需”=>true,
'过滤器'=>阵列(
数组('name'=>'StripTags'),
数组('name'=>'StringTrim'),
),
“验证程序”=>数组(
排列(
'名称'=>'字符串长度',
“选项”=>数组(
'编码'=>'UTF-8',
“min”=>1,
“最大值”=>50,
),
),
),
));
$inputFilter->添加(数组)(
“名称”=>“密码”,
“必需”=>true,
'过滤器'=>阵列(
数组('name'=>'StripTags'),
数组('name'=>'StringTrim'),
),
“验证程序”=>数组(
排列(
'名称'=>'字符串长度',
“选项”=>数组(
'编码'=>'UTF-8',
“min”=>1,
“最大值”=>50,
),
),
),
));
$this->inputFilter=$inputFilter;
}
返回$this->inputFilter;
}
\模块\Admin\view\Admin\index

什么是$form=$this->form? 是否在控制器中使用?您在哪里传递$this->form上的任何内容。它为null,就像您看到的错误一样。您可以使用var_dump($form)来检查它。您需要首先使用以下命令创建表单:

$form = new \My\Form();

如果login.phtml中的$form为null,这意味着您没有将$form变量传递给phtml脚本(我们在代码中没有看到它)

当您要更改元素属性时,您必须使用getElement函数获取该元素,然后使用zend form函数。请尝试下面的代码,它将适用于您

$form = new LoginForm();

$form->getElement('submit')->setValue('get');