В настоящее время я создал модель под названием getData.php, которая использует необработанный запрос для извлечения информации из базы данных и передачи ее обратно основному контроллеру.

getData.php

namespace Destination\AppBundle\Models;
use Doctrine\ORM\EntityRepository;

class getData extends EntityRepository
{

    public function getInfo(){

            $stmt = $this->getEntityManager()
            ->getConnection()
            ->prepare('select * cms_clients');
            $stmt->execute();
            $result = $stmt->fetchAll();

            return $result;
    }

}

Maincontroller.php

namespace Destination\AppBundle\Controller;
use Doctrine\ORM\EntityRepository; 
use Destination\InterfaceBundle\Controller\AbstractController;
use Destination\AppBundle\Models\getData;
class DefaultController extends  AbstractController


    public function indexAction(Request $request)
    {
    $fetchData = new getData;   

        $fetchData->getInfo();


        return $this->render('DestinationAppBundle:Default:app.html.twig');   

    }

]

Но я продолжаю получать ту же ошибку, говоря

ContextErrorException: Предупреждение: отсутствует аргумент 1 для Doctrine \ ORM \ EntityRepository :: __ construct (), вызываемого в C: \ Users \ brent.french \ Documents \ www \ clients \ app \ src \ Destination \ AppBundle \ Controller \ DefaultController.php на строка 33 и определена в C: \ Users \ brent.french \ Documents \ www \ clients \ app \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ EntityRepository.php строка 67

Любые идеи?

2
Brent 11 Мар 2014 в 18:49

2 ответа

Лучший ответ

Проблема в том, что вы используете EntityRepository, но вы не должны напрямую обращаться к методам, которые вы определяете в EntityRepository, как вы делаете это здесь:

$fetchData = new getData;   
$fetchData->getInfo();

Вы должны получить доступ к этому методу через любую сущность, которая является «родительской» для «getData».

Например, если у вас есть сущность с именем Data:

/**
* @ORM\Entity(repositoryClass="namespace\yourbundle\Entity\getData")
*/
class Data {
/** your setters and getters **/
}

Затем вы можете получить доступ к своим методам getData в своих контроллерах следующим образом:

$em = $this->getDoctrine()->getEntityManager();
$getData =  $em->getRepository('YourBundle:Data')->getData();

Не забудьте указать путь к вашему репозиторию сущностей в верхней части контроллера:

use Namespace\YourBundle\Entity\GetData;

В противном случае вы можете получить ошибку (в зависимости от вашей версии Symfony).

В вашем примере кажется, что ваше пространство имен называется Destination, а ваш пакет называется AppBundle,

Тогда аннотация @ORM\Entity должна выглядеть так:

/**
 * @ORM\Entity(repositoryClass="Destination\AppBundle\Model\getData")
 */

Прочтите этот раздел документации symfony2, они более подробно описывают эту тему:

http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

0
ILikeTacos 11 Мар 2014 в 23:32
Но если база данных уже создана, как я могу настроить свои сеттеры и геттеры?
 – 
Brent
11 Мар 2014 в 21:00
Все руководства, которые я нахожу, предназначены для настройки новой базы данных, но проблема в том, что мне нужно использовать уже существующую базу данных.
 – 
Brent
11 Мар 2014 в 21:01
Настройка сеттеров и геттеров возможна независимо от того, создана база данных или нет. В худшем случае вам может потребоваться запустить php app/console --env=prod doctrine:schema:update --force для обновления схемы. Откройте файл объекта, который сопоставляет таблицу, которую вы хотите выбрать, и внутри аннотации @ORM\Entity добавьте параметр repositoryClass. Значение repositoryClass должно быть путем к вашему файлу класса (относительно пространства имен).
 – 
ILikeTacos
11 Мар 2014 в 23:29

Основная проблема заключается в том, что ваш класс getData расширяет EntityRepository, который (как указывают сообщения об ошибках) ожидает некоторых аргументов в своем конструкторе.

Если вы настроены использовать необработанные запросы, вставьте соединение в свой класс getData.

class GetData
{
    public function __construct($conn)
    {
        $this->conn = $conn;

// In your controller
$getData = new GetData($this->getEntityManager()->getConnection());

Вы можете пойти еще дальше и определить GetData как службу:

cerad_app_cerad.persons.export_xml:
    class: Cerad\Bundle\AppCeradBundle\Services\Persons\Persons01ExportXML
    arguments:
        - '@doctrine.dbal.default_connection'

// In your controller
$getData = $this->get('cerad_app_cerad.persons.export_xml');

Кстати, у объекта подключения DBAL есть несколько приятных удобных методов:

    $rows = $this->conn->fetchAll('SELECT * FROM cms');
0
Cerad 11 Мар 2014 в 19:09
Первый ответ, который вы предоставили, не работает, есть ли какой-нибудь простой способ извлечь данные из базы данных без использования доктрины?
 – 
Brent
11 Мар 2014 в 20:11
Вы можете использовать PDO напрямую, но если вы не потратите время на то, чтобы понять, как работает php, я боюсь, что у вас могут возникнуть проблемы. Много проблем с вашим вопросом.
 – 
Cerad
11 Мар 2014 в 20:53