В настоящее время я создал модель под названием 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 ответа
Проблема в том, что вы используете 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
Основная проблема заключается в том, что ваш класс 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');
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
php app/console --env=prod doctrine:schema:update --force
для обновления схемы. Откройте файл объекта, который сопоставляет таблицу, которую вы хотите выбрать, и внутри аннотации@ORM\Entity
добавьте параметрrepositoryClass
. ЗначениеrepositoryClass
должно быть путем к вашему файлу класса (относительно пространства имен).