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



根据 ZF2 的回复:将事件附加到另一个控制器的操作并获取服务定位器,我像这样将事件附加到控制器的操作中

$loader = $sl->get('ControllerLoader');
$loginController = $loader->get('BControllerLoginController');
$sharedEventManager->attach('AControllerLoginController',
                            'checkme.post',
                            array($loginController, 'loginAction'),
                            100); 

当事件触发时,它会进入登录"B"控制器的操作。内部登录操作当我尝试调用 B\LoginController 的其他方法时,我得到一个错误

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

控制器代码:

<?php
namespace BController;
use ZendMvcControllerAbstractActionController;
use ZendSoapClient;
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 ZendSoapClient($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,因为该函数没有在类的实例上被调用。

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

最新更新