[英]Symfony2.8 Error Using $this when not in object context using doctrine
我正在嘗試從控制器調用函數,並將$ todolist返回到控制器。 但是我收到此錯誤,當我將此功能留在控制器中時,它可以正常工作,但我不希望它出現在控制器中。
這是我的控制器
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use AppBundle\Entity\Todo;
use AppBundle\Model\TodoModel;
class TodoController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function ShowList()
{
$todolist = TodoModel::getTodolist();
$html = $this->container->get('templating')->render(
'todolist/todolist.html.twig',
array('todolist' => $todolist)
);
return new response($html);
}
}
這是我的模特
namespace AppBundle\Model;
use AppBundle\Entity\Todo;
class TodoModel
{
public function getTodolist()
{
$repository = $this->getDoctrine()
->getRepository('AppBundle:Todo');
$todolist = $repository->findAll();
return $todolist;
}
}
正確的方法是:
public function ShowList()
{
$entityManager = $this->get('doctrine.orm.entity_manager');
$repository = $entityManager->getRepository(Todo::class);
$todolist = $repository->findAll();
$html = $this->container->get('templating')->render(
'todolist/todolist.html.twig',
array('todolist' => $todolist)
);
return new Response($html);
}
如果要使用“ TODO provider”進行某種抽象,則更好的命名方法是TodoProvider
而不是TodoModel
。
它應該看起來像:
namespace AppBundle\Todo;
use Doctrine\ORM\EntityManager;
use AppBundle\Entity\Todo;
class TodoProvider
{
/**
* @var EntityManager
*/
private $entityManager;
/**
* TodoProvider constructor.
* @param EntityManager $entityManager
*/
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* @return Todo[]
*/
public function getAllTodos()
{
return $this->entityManager->getRepository(Todo::class)->findAll();
}
}
然后將TodoProvider
注冊為服務( http://symfony.com/doc/current/service_container.html )並使用$this->get('my_todo_provider')
進入控制器。
您需要將學說注入模型,並將模型定義為服務。 最好使用存儲庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.