Symfony2.8 错误使用 $this 时不在对象上下文中使用学说
Symfony2.8 Error Using $this when not in object context using doctrine
我正在尝试从我的控制器调用一个函数,并且 return 向我的控制器调用 $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')
进入控制器
我正在尝试从我的控制器调用一个函数,并且 return 向我的控制器调用 $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')