Php 不能在另一类中使用教义
我在控制器类中使用以下代码:Php 不能在另一类中使用教义,php,symfony,doctrine,Php,Symfony,Doctrine,我在控制器类中使用以下代码: $entityManager = $this->getDoctrine()->getManager(); $user = new Users(); $user->setEmail($data['email']); $user->setActive(false); $user->setPassword($data['password']); $user->setRegisterDate(date('Y-m-d H:i:s'));
$entityManager = $this->getDoctrine()->getManager();
$user = new Users();
$user->setEmail($data['email']);
$user->setActive(false);
$user->setPassword($data['password']);
$user->setRegisterDate(date('Y-m-d H:i:s'));
$entityManager->persist($user);
$entityManager->flush();
太棒了
与我在另一个文件中尝试使用的代码相同。因此,在我的例子中,控制器类接收数据并将其发送给服务类。服务类将验证数据并将其发送给DAO类。看起来是这样的:
AuthorizationController.php
<?php
namespace App\Controller;
use App\Service\AuthorizationService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class AuthorizationController extends AbstractController {
/**
* @Route("/register/save", methods={"POST", "HEAD"})
* @param Request $request
* @return Response
*/
public function save(Request $request) {
if ($request->getMethod() === 'POST') {
$data = json_decode($request->getContent(), true);
$service = new AuthorizationService();
$service->register($data);
}
return new Response('test');
}
}
<?php
namespace App\Service;
use App\Dao\AuthorizationDao;
class AuthorizationService {
function register($data) {
$email = $data['email'] ?? 'e';
$password = $data['password'] ?? 'p';
$val_email = false;
$val_password = false;
// Email validation
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$val_email = true;
}
// Password validation
if (strlen($password) > 5) {
$val_password = true;
}
// Send the response
if ($val_email && $val_password) {
$dao = new AuthorizationDao();
$dao->register($data);
}
}
}
<?php
namespace App\Dao;
use App\Entity\Users;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class AuthorizationDao extends AbstractController {
function register($data) {
$entityManager = $this->getDoctrine()->getManager();
$user = new Users();
$user->setEmail($data['email']);
$user->setActive(false);
$user->setPassword($data['password']);
$user->setRegisterDate(date('Y-m-d H:i:s'));
$entityManager->persist($user);
$entityManager->flush();
}
}
如何正确解决您的实际问题:将EntityManagerInterface注入到您的授权服务中,然后在那里使用它。调用控制器的服务是一种代码气味!(如果您不知道依赖注入是什么:请在symfony的上下文中仔细阅读它!)
错误解释:
AbstractController
(您扩展了它)是一个ContainerWareInterface
,它将被初始化,然后调用AbstractController::setContainer($container)
,如果并且几乎仅当它是通过symfony的依赖项注入注入的(如果需要,还需要额外的自动连接)
AbstractController::getDoctrine()
使用容器获取条令服务
但是,由于在调用时不使用依赖项注入
$dao = new AuthorizationDao();
AuthorizationDao
没有容器,无法获取条令。要避免这种情况,请将AutorationDAO作为参数添加到AuthorizationService的构造函数中:
public function __construct(AuthorizationDao $authDao) {
$this->authDao = $authDao;
}
然后使用$this->authDao
而不是新的…
东西
另一种方法是,自己设置容器,这意味着,您必须将容器注入到您的服务中,而只需在dao上设置容器,这不如像上面所示那样正确地注入dao
一般来说:如果您在使用依赖项注入的东西上使用new
,而您不在工厂(您必须知道并保存所有需要的依赖项),那么您可能做得不对。更具体:不要使用new
创建控制器或服务,而是注入它们
(通常只有实体是通过new
创建的,其他一切都是可疑的)
但是,如上所述,您可能应该将register方法放入服务中,并将实体管理器也注入服务中。回答得很好。非常感谢你!