Events ZF2:在访问控制器内的其他方法时,如果不在对象上下文中,则使用$this

Events ZF2:在访问控制器内的其他方法时,如果不在对象上下文中,则使用$this,events,controller,zend-framework2,Events,Controller,Zend Framework2,根据来自的回复,我将向控制器的操作附加一个事件,如下所示 $loader = $sl->get('ControllerLoader'); $loginController = $loader->get('B\Controller\LoginController'); $sharedEventManager->attach('A\Controller\LoginController', 'checkme.post',

根据来自的回复,我将向控制器的操作附加一个事件,如下所示

$loader = $sl->get('ControllerLoader');
$loginController = $loader->get('B\Controller\LoginController');

$sharedEventManager->attach('A\Controller\LoginController',
                            'checkme.post',
                            array($loginController, 'loginAction'),
                            100); 
当事件触发时,它进入“B”控制器的登录。当我尝试调用B\LoginController的其他方法时,我得到一个错误

致命错误:在中不在对象上下文中时使用$this C:\wampp\www\Zend2\module\B\src\B\Controller\LoginController.php 块引用 在线60

控制器代码:

<?php

namespace B\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Soap\Client;

class LoginController extends AbstractActionController {

    public function loginAction($e) {
       $user_id = $e->getParam('user_id');
       $config = $e->getParam('config');

       if($user_id){
            $client = $this->getSoapClient($config);
            $params = $this->enrolmentRequestParams($user_id);
            $response = $client->getEnrolment($params);
            $course_enrolment = $response->enrolment_list->value->course_enrolment_list->course_enrolment;
            $this->processEnrolmentData($course_enrolment);
       }
    }


    public function getSoapClient($config){
        $options = array(
                    'soap_version'=> $config['webservice_config']['soap_version'],
                    'location' => $config['webservice_config']['location']
                   );

        $wsdl = $config['webservice_config']['wsdl'];

        $client = new \Zend\Soap\Client($wsdl, $options);
        return $client;
    }

    public function processEnrolmentData($course_enrolment){

        foreach($course_enrolment as $ce){
                // some code here

            }

    }

    public function enrolmentLookUp($e){

      //some code here

    }

    public function enrolmentRequestParams($sid){
        //some code here
    }

    public function  emptyObject($theObject){
        $tmp = (array) $theObject;

        if(empty($tmp)) {
            return true;
        }else{
            return false;
        }
    }

    public function validVal($uos){

        if(!empty($uos) && !is_null($uos) && isset($uos)){
            return true;
        }else{
            return false;
        }
    }

   public function getSemesterNo($value){
        return preg_replace("/[^0-9]/","",$value);
    }

}

?>


请在这方面提供帮助

如果将数组作为回调传递,则静态调用类方法(即,相当于执行
LoginController::loginAction(e)
)。没有
$this
,因为没有在类的实例上调用该函数


看起来控制器类中的大多数逻辑根本不应该在控制器中。我建议将其移动到一个单独的类中,然后您可以调整该类以更好地处理静态方法调用。

您也可以发布loginConroller代码吗?可能这只是一个输入错误。在ZF2约定中,方法名称具有小写首字母。您在附件中写入了大写的
LoginAction
。已使用控制器代码进行更新,并将“LoginAction”更改为“LoginAction”。仍然得到相同的错误。也许我这里错了,但这是模块中路径的良好命名吗?C:\wampp\www\Zend2\module\B\src\USydWebService\Controller\LoginController.php应为C:\wampp\www\Zend2\module\B\src\B\Controller\LoginController.php发布问题时重命名模块名称时的类型。问题依然存在。