试图从命名空间 symfony 控制器调用函数
我尝试在控制器中使用函数 TechParentInsert 我收到错误:
I try to use the functions TechParentInsert in the controller I am getting an error:
尝试从命名空间TestyBundleController"调用函数TechParentInsert".
Attempted to call function "TechParentInsert" from namespace "TestyBundleController".
500 内部服务器错误 - UndefinedFunctionException
500 Internal Server Error - UndefinedFunctionException
在控制器中我有:使用 TestyBundleRepositoryTechParentRepository;"当我定义了TechParentInsert"
In controller I have: "use TestyBundleRepositoryTechParentRepository;" when i've defined "TechParentInsert"
------------------我的代码
-----------------------------My CODE
控制器TestyController:
Controller TestyController:
namespace TestyBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SensioBundleFrameworkExtraBundleConfigurationTemplate;
use SymfonyComponentHttpFoundationRequest;
use DoctrineORMQueryASTFunctionsConcatFunction;
use DoctrineORMEntityRepository;
use TestyBundleEntitySort;
use TestyBundleFormSortType;
use TestyBundleRepositorySortRepository;
use TestyBundleRepositoryTechParentRepository;
/**
* @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
Repository: TechParentRepository
<?php
namespace TestyBundleRepository;
use TestyBundleEntityTechParent;
class TechParentRepository extends DoctrineORMEntityRepository
{
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
My entity: TechParent
<?php
namespace TestyBundleEntity;
use DoctrineORMMapping as ORM;
/**
* TechParent
*
* @ORMTable(name="tech_parent")
* @ORMEntity(repositoryClass="TestyBundleRepositoryTechParentRepository")
*/
class TechParent
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var int
*
* @ORMColumn(name="idSorty", type="integer")
*/
private $idSorty;
/**
* @var int
*
* @ORMColumn(name="idParent", type="integer")
*/
private $idParent;
/**
* @var bool
*
* @ORMColumn(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 年 5 月)自动装配以来,将依赖项传递给控制器的方式更加简洁.
Since autowiring in Symfony 2.8 and moreover Symfony 3.3 (May 2017) there is much cleaner way to pass dependencies to controller.
namespace TestyBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use TestyBundleRepositorySortRepository;
use TestyBundleRepositoryTechParentRepository;
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...
}
}
2.控制器服务注册
# app/config/services.yml
services:
_defaults:
autowire: true
# PSR-4 autodiscovery
TestyBundle:
resource: '../../src/TestyBundle' # located in /src/TestyBundle
你准备好了!
您可以在以下 2 篇文章中阅读有关 Symfony 3.3 依赖注入(在这种情况下在配置中注册服务并在控制器中使用它)的新闻:
You can read about Symfony 3.3 dependency injection (in this case registering services in config and using it in controller) news in these 2 posts:
- https://www.tomasvotruba.cz/blog/2017/05/07/how-to-refactor-to-new-dependency-injection-features-in-symfony-3-3/
- https://symfony.com/blog/the-new-symfony-3-3-service-configuration-changes-explained
相关文章