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方法放入服务中,并将实体管理器也注入服务中。

回答得很好。非常感谢你!