Php 错误:对非对象500内部服务器调用成员函数get()时出错-FatalErrorException(Symfony)
我是Mac和Symfony的新手,如果我缺少任何基础知识,我很抱歉 基本上尝试使用php类创建表单,如下所示Php 错误:对非对象500内部服务器调用成员函数get()时出错-FatalErrorException(Symfony),php,symfony,Php,Symfony,我是Mac和Symfony的新手,如果我缺少任何基础知识,我很抱歉 基本上尝试使用php类创建表单,如下所示 <?php namespace TeamRock\ApplicationBundle\entity; class Person{ protected $email; protected $fullname; public function getEmail(){ return $this->$email; } public function setEmail(
<?php
namespace TeamRock\ApplicationBundle\entity;
class Person{
protected $email;
protected $fullname;
public function getEmail(){
return $this->$email;
}
public function setEmail($email){
return $this->$email;
}
public function getFullname(){
return $this ->$fullname;
}
public function setFullname($fullname){
return $this -> $fullname;
}
}
?>
我说过,我对php和symfony还很陌生,这是一个很大的学习过程,所以任何帮助或指点都是非常感谢的
我一直在看这个家伙的视频只是为了参考
再次感谢您提前提供的帮助 如何将控制器用作服务?文档始终是一个良好的起点: 在这个问题中,控制器使用createForm方法,该方法恰好在以下内容中定义:
namespace Symfony\Bundle\FrameworkBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;
class Controller extends ContainerAware
{
public function createForm($type, $data = null, array $options = array())
{
return $this->container->get('form.factory')->create($type, $data, $options);
}
如您所见,createForm方法依赖容器对象来访问form.factory对象。容器是如何注射的
namespace Symfony\Component\DependencyInjection;
abstract class ContainerAware implements ContainerAwareInterface
{
protected $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
因此,我们需要调用$controller->setContainer。如果我们以正常方式使用控制器(即,不作为服务),则会在Symfony\Component\HttpKernel\HttpKernel::handleRaw()方法中调用setContainer。但是,由于我们将控制器定义为服务,那么就由我们来注入容器:
# services.yml
homepage__controller:
class: Whatever\Homepage
calls:
- [setContainer, ['@service_container']]
因此,将setContainer调用添加到服务定义中应该可以得到工作代码。尽管将createView直接添加到响应中可能无法获得所需的结果。它当然不会给你html。但这是另一个问题
当然,真正的问题是为什么要费心将控制器定义为服务。在几乎所有情况下,答案都是你不应该这样做。它曾经被推荐用于第三方捆绑包,但现在不推荐了。如果您查看FOSUserBundle控制器,您会看到相当多的重复代码,这仅仅是因为它们盲目地将控制器作为服务规则
有时候这是有道理的。我试图让控制器尽可能薄,只注入实际需要的服务。在这个问题中,控制器需要的唯一服务是表单工厂,因此它应该是唯一注入的服务。您不应该再扩展基本控制器类
class HomepageController
{
private $formFactory;
public function setFormFactory($formFactory)
{
$this->formFactory = $formFactory;
}
public function __invoke(Request $request)
{
$person = new Person();
$form = $this->formFactory->create(new PersonType(), $person);
return new Response("Hello, world!", Response::HTTP_OK, array('form'=>$form->createView()));
}
}
services.yml
my__controller:
class: Whatever\HomepageController
calls:
- [setFormFactory, ['@form.factory']]
对于这类标准服务,我喜欢使用setter注入而不是construct注入。我将构造保存为自己的自定义服务。但如果需要,您当然可以使用参数:['@form.factory']
最后,如果您只是在学习该框架以及PHP OOP,那么只需遵循文档中的示例即可。不必钻这些兔子洞,还有很多东西需要学习。你的控制器没有从symfony扩展任何控制器,那么在类定义中就没有
createFrom
也可能是type personType类名PersonType@RooneylPHP类名不区分大小写,不是吗?是的,我也这么认为?我取得了一些进展,我将控制器扩展到了symfony默认控制器,但现在我遇到了一个错误:在非对象500内部服务器上调用成员函数get()。错误-FatalErrorException
namespace Symfony\Component\DependencyInjection;
abstract class ContainerAware implements ContainerAwareInterface
{
protected $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
# services.yml
homepage__controller:
class: Whatever\Homepage
calls:
- [setContainer, ['@service_container']]
class HomepageController
{
private $formFactory;
public function setFormFactory($formFactory)
{
$this->formFactory = $formFactory;
}
public function __invoke(Request $request)
{
$person = new Person();
$form = $this->formFactory->create(new PersonType(), $person);
return new Response("Hello, world!", Response::HTTP_OK, array('form'=>$form->createView()));
}
}
services.yml
my__controller:
class: Whatever\HomepageController
calls:
- [setFormFactory, ['@form.factory']]