现在,我知道这个问题已经被问了很多,但是我进行了搜索,但是我还是想不通,已经被困了几个小时了。非常抱歉,事实证明这是一个愚蠢的错误(很可能会这样)。
因此,我有我的 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
]);
}
}
答案 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);
关于在类中设置值的方法还有其他细微差别,我不会一一列举,这将取决于您更广泛的项目中正在发生的事情。