致命错误:在Zend Framework 2中调用null上的成员函数get()

时间:2017-04-02 00:40:44

标签: php zend-framework2

使用$sm=$this->getServiceLocator()作为结果$sm->get("XXXXXXXXXXX")抛出致命错误时,我变为null:在null上调用成员函数get()。 我正在做的是,当我在控制器中接收用户数据时,我在我请求的控制器中调用另一个控制器validatorController,这是signupController,在validatorController中,我使用的是$sm=$this->getServiceLocator(),这给出了上述错误

这是我的作品

当我在ValidatorController.php中使用$check=$this->_getUserTable()->isUnique($email);但在SignupController.php中没有使用时出现错误

Module.php

<?php
namespace User;

use Zend\Db\TableGateway\TableGateway;
use Zend\Db\ResultSet\ResultSet;
use User\Controller\ValidatorController;
use User\Model\User;
use User\Model\UserTable;

class Module {
    public function getConfig() {
        return include __DIR__."/config/module.config.php";
    }

    public function getAutoloaderConfig() {
        return array(
            "Zend\loader\StandardAutoloader"=>array(
               "namespaces"=>array(
                   __NAMESPACE__=>__DIR__."/src/".__NAMESPACE__
               )
            )
        );
    }

    public function getServiceConfig() {
        return array(
            "factories"=>array(
                'User\ValidatorController' => function ($sm) {
                    $validatorController = new ValidatorController();
                    return $validatorController;
                },
                "User\Model\UserTable"=>function($sm) {
                    $tableGateway=$sm->get("UserTableGateway");
                    $table=new UserTable($tableGateway);
                    return $table;
                },
                "UserTableGateway"=>function($sm) {
                    $dbAdapter=$sm->get("Zend\Db\Adapter\Adapter");
                    $resultSetPrototype=new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new User());
                    return new TableGateway("users",$dbAdapter,null,$resultSetPrototype);
                }
            )
        );
    }
}

module.config.php

<?php

return array(
    "controllers"=>array(
        "invokables"=>array(
            "User\Controller\User"=>"User\Controller\UserController",
            'User\Controller\Signup' => 'User\Controller\SignupController',
            'User\Controller\Validator' => 'User\Controller\ValidatorController'
        )
    ),
    // The following section is new and should be added to your file
    "router"=>array(
        "routes"=>array(
            "user"=>array(
                "type"=>"segment",
                "options"=>array(
                    "route" => "/user[/:action][/:id]",
                    "constraints" => array(
                        "id" => "[0-9]+",
                    ),
                    "defaults"=>array(
                        "controller"=>"User\Controller\User"
                    )
                )
            ),
            'signup' => array(
                'type' => 'segment',
                'options' => array(
                    'route' => '/signup',
                    'defaults' => array(
                        'controller' => 'User\Controller\Signup',
                    )
                )
            ),
        )
    ),
    'view_manager' => array(//Add this config
        'strategies' => array(
            'ViewJsonStrategy',
        ),
    ),
);

SignupController.php

<?php
namespace User\Controller;

use Zend\Mvc\Controller\AbstractRestfulController;
use Zend\View\Model\JsonModel;

class SignupController extends AbstractRestfulController{
    private $_userTable;

    public function create($data) {

        /*
         * The above error is not coming here
         * $check=$this->_getUserTable()->isUnique($data['email']);
         *
         * But inside the below controller
         */

        // Calling a validatorContoller
        $validator=$this->getServiceLocator()->get('User\ValidatorController');
        $response=$validator->validateEmail($data['email']);

        return new JsonModel($response);
    }

    public function _getUserTable() {
        if(!$this->_userTable) {
            $sm=$this->getServiceLocator();
            $this->_userTable=$sm->get("User\Model\UserTable");
        }
        return $this->_userTable;
    }
}

ValidatorController.php

<?php
namespace User\Controller;

use Zend\Mvc\Controller\AbstractRestfulController;
use Zend\Validator\EmailAddress;

class ValidatorController extends AbstractRestfulController {
    private $_userTable;

    public function validateEmail($email) {
        $validator = new EmailAddress();
        if($validator->isValid($email)) {

            // check if it is a unique entry in user table

            //  ***(THE SOURCE OF ERROR IS HERE)***
            $check=$this->_getUserTable()->isUnique($email);
            return $check;
        }
    }

    public function _getUserTable() {
        if(!$this->_userTable) {
            $sm=$this->getServiceLocator();
            $this->_userTable=$sm->get("User\Model\UserTable");
        }
        return $this->_userTable;
    }
}

注意

当我在ValidatorController.php中使用$check=$this->_getUserTable()->isUnique($email);但在SignupController.php中没有使用时出现错误

三江源

1 个答案:

答案 0 :(得分:0)

ZendFramework 2中不推荐使用

getServiceLocator()。您必须从_userTable ValidatorController注入Module.php,如下所示:

class Module {
...
public function getServiceConfig() {
    return array(
        "factories"=>array(
            'User\ValidatorController' => function ($sm) {
                $userTable = $sm->get("User\Model\UserTable");
                $validatorController = new ValidatorController();
                $validatorController->setUserTable($userTable);
                return $validatorController;
            },
...
}

然后在setUserTable()中添加ValidController方法并修改getUserTable()方法:

class ValidController {
    public function setUserTable($suerTable) {
        $this->_suerTable = $userTable
    }
    public function _getUserTable() {
        return $this->_userTable;
    }
}