Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 错误:对非对象500内部服务器调用成员函数get()时出错-FatalErrorException(Symfony)_Php_Symfony - Fatal编程技术网

Php 错误:对非对象500内部服务器调用成员函数get()时出错-FatalErrorException(Symfony)

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(

我是Mac和Symfony的新手,如果我缺少任何基础知识,我很抱歉

基本上尝试使用php类创建表单,如下所示

<?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']]