2015-02-24 61 views
1

IM相当新的Mac和Symfony的,一般如果我在想念任何基本知识错误:调用一个成员函数的get()一个非对象500内部服务器错误 - FatalErrorException(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 

namespace TeamRock\ApplicationBundle\form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class personType extends AbstractType{ 
    public function buildForm(FormBuilderInterface $builder, array  $options){ 
    $builder->add ('email','email')->add ('name','text')->add('submit','submit'); 
} 

public function getName(){ 
    return 'person'; 
} 
} 

?> 

,然后主控制器上

<?php 

namespace TeamRock\ApplicationBundle\Controllers\Calvin; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use TeamRock\ApplicationBundle\entity\Person; 
use TeamRock\ApplicationBundle\form\PersonType; 

class Homepage 
{ 
    public function __invoke(Request $request) 
{ 
    $person = new person(); 
    $form = $this->createForm(new PersonType(), $person); 
    return new Response("Hello, world!", Response::HTTP_OK, array('form'=>$form->createView())); 
} 


} 
?> 

,我不断收到错误是

Attempted to call method "createForm" on class "TeamRock\ApplicationBundle\Controllers\Calvin\Homepage". 
500 Internal Server Error - UndefinedMethodException 

任何帮助表示赞赏球员,正如我所说的即时通讯相当新的PHP和Symfony和它的一个大的学习曲线,所以任何帮助或指针赞赏

我一直都再次

感谢看着这家伙的影片仅作参考Andrew Perkins Symfony Tutorials

任何帮助提前!

+2

您的控制器没有从symfony扩展任何控制器,那么在类定义里面没有'createFrom' – 2015-02-24 11:20:30

+0

也可能的类型personType类名应该是PersonType – Rooneyl 2015-02-24 11:21:09

+0

@Rooneyl PHP类名不区分大小写,不是吗? – chapay 2015-02-24 11:27:30

回答

1

如何使用控制器作为服务?文档始终是一个良好的开端:http://symfony.com/doc/current/cookbook/controller/service.html

在这个问题上的情况下,控制器使用的发生在被定义的的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; 
} 

所以沿线的地方,我们需要调用$控制器 - > 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注入而不是构建注入这些标准服务。我为我自己的定制服务保存构造。但是,如果你愿意,你当然可以使用参数:['@ form.factory']。

最后,如果你只是学习框架以及PHP OOP,那么只需按照文档中的例子。如果不去掉这些兔子洞,还有很多东西需要学习。

+0

非常感谢,我很欣赏这个很多人!很好的帮助! – 2015-02-24 17:01:56

相关问题