【问题标题】:Symfony3, Missing argument 1 for Doctrine\ORM\EntityRepository::__construct(), how and whySymfony3,Doctrine\ORM\EntityRepository::__construct() 缺少参数 1,如何以及为什么
【发布时间】:2016-12-09 21:13:40
【问题描述】:

我正在 symfony 中制作我的第一个小应用程序,一个简单的博客。

现在我一直在使用 symfony 和教义的文档,并希望执行一个简单的初学者任务:显示一个 json 编码的简单表格

但不知怎的,我似乎无法与教义相处。

这是我的数据(除了显示值什么都不做的视图):

//AppBundle/Controller/DefaultController.php
<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\Post;
use Doctrine\Common\Persistence;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        $database = new Post();
        $output = $database->findAll();

        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..').DIRECTORY_SEPARATOR,
            'x' => json_encode($output)
        ]);
    }
}


<?php
//AppBundle/Entity/Post.php

namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityRepository;
/**
* @ORM\Entity
* @ORM\Table(name="sqltest")
*/
class Post extends EntityRepository
{
    //The post for now uses data from a temponary test table
    /**
    * @ORM\Column(type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

    /**
    * @ORM\Column(type="string", length=100)
    */
    private $name;

    /**
    * @ORM\Column(type="integer", scale=2)
    */
    private $number;



    /**
     * Get id
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     * @param string $name
     * @return Post
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set number
     * @param integer $number
     * @return Post
     */
    public function setNumber($number)
    {
        $this->number = $number;

        return $this;
    }

    /**
     * Get number
     * @return integer
     */
    public function getNumber()
    {
        return $this->number;
    }

}

问题是当我尝试显示网站时出现此异常

警告:缺少参数 1 Doctrine\ORM\EntityRepository::__construct(),调用 C:\Users\Alan\Desktop\symf-blog\src\AppBundle\Controller\DefaultController.php 在第 19 行并定义

有问题的线路是$database = new Post(); 的线路

我对此很陌生,并且知道响应非常简单,我只是看不到它。回答时请提供even a dead rabbit能理解的解释。

非常感谢您的耐心等待。

PS:另外解释一下我见过的$em 变量的用途以及我从哪里得到它会很好

【问题讨论】:

  • 你熟悉OOP吗?如果是这样check 这里是EntityRepository 您继承的类所需的参数。所以你需要通过它们或者根本不扩展(检查here
  • 我了解 $class 元素,但仍然找不到有关变量 $em 来源的任何信息
  • 这可以给你一个提示$em = $this-&gt;getDoctrine()-&gt;getManager(); $entities = $em-&gt;getRepository("CommonBundle:Bank")-&gt;findAll();
  • 重置一下并阅读入门章节:symfony.com/doc/current/doctrine.html Doctrine 是 ORM 而不是 Active Record 模块,因此让实体扩展存储库是零意义的。无需担心。如果你真的想要一个 Active Record 方法,有几个可供选择。
  • @ReynierPM $this 在这种情况下指的是什么?

标签: php doctrine-orm symfony


【解决方案1】:

如果您想要自定义 DB 函数的存储库类,那么这是正确的方法:

namespace AppBundle\Entity;    
use Doctrine\ORM\EntityRepository;

class PostRepository extends EntityRepository
{
    public function findAll()
    {
        return $this->findBy(array(), array('id' => 'DESC', 'createdAt' => 'DESC'));
    }  
   ....
}

然后在你的控制器中:

$em = $this->getDoctrine()->getManager(); 
$entities = $em->getRepository("AppBundle:Post")->findAll();

删除注释(它们属于实体)。还要注意@james_bond 告诉你的内容。试试看!

【讨论】:

    【解决方案2】:

    documentation 中所述,您可以通过学说实体管理器访问自定义存储库类。

    $em = $this->getDoctrine()->getManager();  
    $posts = $em->getRepository('YourBundle:Post')->findAll();
    

    此外,您将实体定义与存储库定义混合在一起,这不是一个好主意。

    正确使用请参考doctrine documentation in symfony

    【讨论】:

    • 添加了`$em = $this->getDoctrine()->getManager(); $entities = $em->getRepository("AppBundle:Post")->findAll();` 然后在$json_encode 中打印。结果是[{}{}{}](对于3行表,添加,在里面增加了{}
    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2015-03-11
    • 2023-02-22
    相关资源
    最近更新 更多