2015-02-24 59 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

相關問題