“在null上调用成员函数updateJob()”

时间:2019-01-18 12:44:50

标签: php

现在,我知道这个问题已经被问了很多,但是我进行了搜索,但是我还是想不通,已经被困了几个小时了。非常抱歉,事实证明这是一个愚蠢的错误(很可能会这样)。

因此,我有我的 Controller (控制器),当按下网站上的按钮时,该控制器会使editAction()功能无效。它检查请求是否为_POST请求,传递数据并检查给定的输入是否有效,所有这些工作正常。

然后,我尝试访问我的 Manager 类中的功能。那是发生错误的地方,我的网站吐出来了:

  

“对成员函数updateJob()的调用为null”。

现在,PhpStorm并不是说有错误或警告,它可以识别jobManager类,并且我已经检查了名称空间和类名,但是所有这些都是正确的。据我所知,变量也已正确定义。如果有人能告诉我我做错了,我将非常感谢。代码如下。

在将$ jobManager添加到__construct后,

当前状态:

class IndexController extends AbstractActionController
{
    /**
     * Entity manager.
     * @var EntityManager
     */
    private $entityManager;

    /**
     * Post manager.
     * @var JobManager
     */
    private $jobManager;

    public function __construct($entityManager, $jobManager)
    {
        $this->entityManager = $entityManager;

        /***
         * Edit from comment advice:
         * I have added this line to my __construct
         * But this does not solve the issue.
         ***/
        $this->jobManager = $jobManager;
    }

    public function indexAction()
    {
        // Get recent jobs
        $jobs = $this->entityManager->getRepository(Jobs::class)
            ->findBy(['status'=>Jobs::STATUS_READY]
            );

        // Render the view template
        return new ViewModel([
            'jobs' => $jobs
        ]);
    }

    public function editAction()
    {
        // Create the form.
        $form = new JobForm();

        // Get post ID.
        $jobId = $this->params()->fromRoute('id', -1);

        // Find existing job in the database.
        $jobs = $this->entityManager->getRepository(Jobs::class)
            ->findOneById($jobId);
        if ($jobs == null) {
            $this->getResponse()->setStatusCode(404);
            return;
        }

        // Check whether this job is a POST request.
        if ($this->getRequest()->isPost()) {

            // Get POST data.
            $data = $this->params()->fromPost();

            // Fill form with data.
            $form->setData($data);
            if ($form->isValid()) {

                // Get validated form data.
                $data = $form->getData();

                // Use job manager service to add new post to database.
                $this->jobManager->updateJob( $jobs, $data);

                // Redirect the user to "backups" page.
                return $this->redirect()->toRoute('backups');
            }
        } else {
            $data = [
                'id' => $jobs->getId(),
                'jobName' => $jobs->getJobName(),
                'status' => $jobs->getStatus(),
                'vmId' => $jobs->getVmId(),
                'targetfolderPrefix' => $jobs->getTargetFolderPrefix(),
                'numberOfBackups' => $jobs->getNumberOfBackups(),
                'lastBackupUsed' => $jobs->getLastBackupUsed(),
                'repeat' => $jobs->getRepeat(),
                'scheduleRunAtMinute' => $jobs->getScheduleRunAtMinute(),
                'scheduleRunAtHour' => $jobs->getScheduleRunAtHour(),
                'scheduleRunAtDOW' => $jobs->getScheduleRunAtDOW(),
                'hostId' => $jobs->getHostId()
            ];

            $form->setData($data);
        }

        // Render the view template.
        return new ViewModel([
            'form' => $form,
            'jobs' => $jobs
        ]);
    }
}

1 个答案:

答案 0 :(得分:2)

怎么了

 $this->jobManager->updateJob( $jobs, $data);

您正在告诉PHP:

  

“在 $this 类中,查看jobManager 对象并运行 method {{1} }和这些变量。...“

但是在 updateJob 类中,您已经编写了:

$this

但是您将 无处 设置为/** * Post manager. * @var JobManager */ private $jobManager; 。您在该类中没有setter函数,也没有其他函数设置jobManager变量的实际含义……因此jobManager 永远不可能是任何东西

所以您实际上是在对PHP说

  

“在$ this类中,在jobManager中查找空的空空间,并使用这些变量运行方法updateJob ...”

这显然不会顺利结束。

如何修复

您必须先设置jobManager,然后才能使用Xatenev所引用的内容。通常在构造类或使用Setter方法(如果需要)时使用。

一个

jobManager

或者-如果在创建对象public function __construct(EntityManager $entityManager, JobManager $jobManagerVar) { $this->entityManager = $entityManager; $this->jobManager = $jobManagerVar; } 之后 需要定义->jobManager方法,则为IndexController;那么您需要使用Setter类(因为jobManager变量是*private*

因此两次

class IndexController extends AbstractActionController
{

...
    public function setJobManager($jobManagerVar){
        $this->jobManager = $jobManagerVar
    }

...
}

然后实例化IndexController时,您可以执行以下操作:

// ONE from above:
$theClass = new IndexController($entity,$jobManager);

// TWO from above
$theClass = new IndexController($entity);

...

$theClass->setJobManager($jobManger);

关于在类中设置值的方法还有其他细微差别,我不会一一列举,这将取决于您更广泛的项目中正在发生的事情。