Я пытаюсь использовать функции TechParentInsert в контроллере. Я получаю сообщение об ошибке:
Попытка вызвать функцию «TechParentInsert» из пространства имен «TestyBundle \ Controller».
- Неустранимая ошибка: Class 'Symfony \ Component \ Console \ Input \ ArgvInput' не найден в приложении / консоли в строке 16
- Symfony2: расширение не загружается Buzz
- Файл не может быть найден при использовании LifecycleCallbacks
- Как остановить Doctrine 2 от кеширования результата в Symfony 2?
- путь изображения symfony работает только без порта
500 Внутренняя ошибка сервера – UndefinedFunctionException
В контроллере у меня есть: «использовать TestyBundle \ Repository \ TechParentRepository;» когда я определил "TechParentInsert"
—————————– Мой КОД
Контроллер TestyController:
namespace TestyBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Symfony\Component\HttpFoundation\Request; use Doctrine\ORM\Query\AST\Functions\ConcatFunction; use Doctrine\ORM\EntityRepository; use TestyBundle\Entity\Sort; use TestyBundle\Form\SortType; use TestyBundle\Repository\SortRepository; use TestyBundle\Repository\TechParentRepository; /** * @Route("/testy") * */ class TestyController extends Controller { /** * (other actions ) * */ /** * @Route( * "/parent/{parent}", name="TEST_sort_new" * ) * * @Template */ public function TechParentNewAction( Request $request, int $parent = 0 ) { $repo2 = $this->getDoctrine()->getRepository( 'TestyBundle:Sort' ); $sortNew = $repo2->findOneBy( ['zz' => 0]); $sortNew->setParentString( $sortNew->getParentString( ) . (string) $sortNew->getId() ); $sortNew->setZz( 1 ); $newRecordID = $sortNew->getId(); $op1 = TechParentInsert( $newRecordID ); $em->persist( $sortNew ); $em->flush(); return $this->redirect( $this->generateUrl( 'TEST_sort' ) ); } return [ 'data1' => $sortNew ]; } }
Репозиторий: TechParentRepository
<?php namespace TestyBundle\Repository; use TestyBundle\Entity\TechParent; class TechParentRepository extends \Doctrine\ORM\EntityRepository { public function TechParentInsert( $idsort) { $parent = new TechParent(); $parent->setIdSorty( $idsort); $parent->setIdParent( $idsort); $parent->setIsOwn( TRUE); $em = $this->getDoctrine()->getManager(); $em->persist($parent); $em->flush(); return 1; } }
Моя сущность: TechParent
<?php namespace TestyBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * TechParent * * @ORM\Table(name="tech_parent") * @ORM\Entity(repositoryClass="TestyBundle\Repository\TechParentRepository") */ class TechParent { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var int * * @ORM\Column(name="idSorty", type="integer") */ private $idSorty; /** * @var int * * @ORM\Column(name="idParent", type="integer") */ private $idParent; /** * @var bool * * @ORM\Column(name="isOwn", type="boolean") */ private $isOwn; /** * Get id * * @return int */ public function getId() { return $this->id; } /** * Set idSorty * * @param integer $idSorty * * @return TechParent */ public function setIdSorty($idSorty) { $this->idSorty = $idSorty; return $this; } /** * Get idSorty * * @return int */ public function getIdSorty() { return $this->idSorty; } /** * Set idParent * * @param integer $idParent * * @return TechParent */ public function setIdParent($idParent) { $this->idParent = $idParent; return $this; } /** * Get idParent * * @return int */ public function getIdParent() { return $this->idParent; } /** * Set isOwn * * @param boolean $isOwn * * @return TechParent */ public function setIsOwn($isOwn) { $this->isOwn = $isOwn; return $this; } /** * Get isOwn * * @return bool */ public function getIsOwn() { return $this->isOwn; } }
Начиная с автоподготовки в Symfony 2.8 и, кроме того, Symfony 3.3 (май 2017 года) существует гораздо более чистый способ передачи зависимостей контроллеру.
namespace TestyBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use TestyBundle\Repository\SortRepository; use TestyBundle\Repository\TechParentRepository; final class TestyController extends Controller { /** * @var SortRepository */ private $sortRepository; /** * @var TechParentRepository */ private $techParentRepository; public function __constructor( SortRepository $sortRepository, TechParentRepository $techParentRepository, ) { $this->sortRepository = $sortRepository; $this->techParentRepository = $techParentRepository; } public function TechParentNewAction(int $parent = 0) { $sortNew = $this->sortRepository->findOneBy([ 'zz' => 0 ]); $sortNew->setParentString($sortNew->getParentString() . (string) $sortNew->getId()); $sortNew->setZz(1); $newRecordID = $sortNew->getId(); $this->techParentRepository->TechParentInsert($newRecordID); // redirect etc... } }
# app/config/services.yml services: _defaults: autowire: true # PSR-4 autodiscovery TestyBundle\: resource: '../../src/TestyBundle' # located in /src/TestyBundle
И вы готовы идти!
Вы можете прочитать информацию об инъекции зависимостей Symfony 3.3 (в этом случае регистрировать службы в конфигурации и использовать ее в контроллере) новости в этих двух сообщениях:
Когда вы обращаетесь к методу из другого класса, вы должны использовать ClassName::method()
, но в этом случае TechParentRepository
имеет определенные гарантии. Из-за инъекции зависимостей в Symfony лучше всего определить репозиторий как услугу, а затем использовать его следующим образом:
$techParentRepository = $this->get('tech_parent_repository '); $techParentRepository->TechParentInsert();
Маленький совет – хорошая практика также состоит в том, чтобы называть классы в верхнем регистре, но методы строчные, поэтому public function techParentInsert($idsort)
будет лучше.