Symfony和Api平台:在控制器外部使用条令和其他服务

Symfony和Api平台:在控制器外部使用条令和其他服务,symfony,Symfony,你好,Stackoverflow Symfony和API-PLATFORM存在问题。我们尝试了很多方法,但没有找到任何解决方案。我们很难使用stackoverflow上已经给出的答案以及与此问题相关的git问题。这就是为什么这不是任何形式的复制品,因为不幸的是这些都没有帮助我们 问题如下。我们在api平台的src文件夹中有标准结构 - src -- Annotation -- Controller -- Doctrine -- Emails -- Entity -- EventListener

你好,Stackoverflow

Symfony和API-PLATFORM存在问题。我们尝试了很多方法,但没有找到任何解决方案。我们很难使用stackoverflow上已经给出的答案以及与此问题相关的git问题。这就是为什么这不是任何形式的复制品,因为不幸的是这些都没有帮助我们

问题如下。我们在api平台的
src
文件夹中有标准结构

- src
-- Annotation
-- Controller
-- Doctrine
-- Emails
-- Entity
-- EventListener
-- EventSubscriber
-- Filters
-- Repository
-- Security
-- Utils
这就是我们的问题开始了。我们有几个类,它们只是一些易于使用的实用程序。这些都在
utils
文件夹中。这个问题是关于Utils文件夹中名为
Phone
的类的。(名称空间
App\Utils\Phone
)。这里的问题是,我们需要在这个Utils类中使用
EntityManager
,因为我们需要(暂时)存储一些数据。我们将使用以下代码(在控制器中工作)

现在错误来了:这里根本不存在条令。找不到它。这里的问题是:我们如何在控制器之外使用条令实体管理器?我们尝试使用默认的AbstractController进行扩展,但这是不正确的,并且不起作用

当我们希望使用安全类获取当前用户时,也会发生同样的情况。(
$this->security->getUser()
)。即使我们像使用一样导入它<代码>使用Symfony\Component\Security\Core\Security

我们希望我们清楚地知道这个问题。我们有点绝望,因为几天后我们仍在寻找解决方案。我们使用PHP版本
7.1.3
和API-PLATFORM版本
1.1
(composer.json)

编辑1:不存在是关于未定义的方法(getDoctrine)。我们尝试了一些方法来实现这一点。例如,使用AbstractController扩展类。另一个有效的解决方案是将函数传递给DoctrineManager。然而,这不是一个好的做法

根据请求编辑2:AuthController代码段。它显示了我们如何使用手机UTIL。我是否需要在这个函数中围绕以下代码实现EntityInterface

    $phone = new Phone();
    $phone->overwriteUser($this->getUser());

    $phone->newRecipient("4917640733908");
    $phone->setBody("Hello, this is a test.");

可以使用依赖项注入(DI)模式处理实体管理器。这就是Symfony的有趣和神奇之处

实现接口的所有类都可以使用依赖注入。使用Symfony4+,将激活自动配置。这看起来很复杂,但对于最终的开发人员来说,这很容易。这里有一个简单的例子,可以用Phone类来实现它,它似乎是一个实现了业务逻辑的模型

class Phone
{
    private $entityManager;

    //The entity manager will be provided to your constructor with the dependency injection.
    public function __construct(EntityManagerInterface $entityManager)
    {
       $this->entityManager = $entityManager;
    }

    public function save($smsStore)
    {
       //you own logic go here

       //here is the magic part, the entityManager is available, connected, ready to use. 
       $this->entityManager->persist($smsStore);
       $em->flush();
    }
}
当您调用Utils classes方法时,DI将自动构造它,并且您将能够使用它的属性,即本例中的实体管理器

如果要在控制器中使用类,可以通过在其构造函数中添加phone类来实现:

类AuthController扩展AbstractController
{
公共函数构造(Phone$phoneUtils)
{      
$this->phoneUtils=$phoneUtils;
}
公共职能行动()
{
//你自己的逻辑在这里
//这是神奇的一部分,手机Utils已经准备好了,它导入了entitymanager
//当您想保存您的smsStore时,只需调用它即可
$this->phoneUtils->save($smsStore);
}
}
您使用的是Api平台,没问题!您可以在其他类(如DataPersisters)或EventListeners中重现此设计模式。如果您看到这一点,您可以看到作者是如何在其事件侦听器中获得Swiftmailer管理器的。只需用EntityManagerInterface或Phone utils类替换swiftmailer即可

(在控制器中,它是检索phone utils类的最简单方法)

类AuthController扩展AbstractController
{
//这样做:在方法中添加Phone$phoneUtils作为参数
公共函数someAction(Phone$phoneUtils)
{
//你自己的逻辑在这里
//不要这样做:$phoneUtils=newphone();
//神奇!当你想保存你的smsStore时,只需调用它
$phoneUtils->save($smsStore);
}
}
如果你想得到一个自动连接的类(比如安全层),你可以这样做。要找到可以自动连接的类,有一些提示:

symfony console debug:autowiring
symfony console debug:autowiring Security
symfony console debug:autowiring AuthorizationChecker
它将返回与您的搜索对应的所有类


(如果您不使用symfony可执行文件,可以用php bin/console debug:autowiring替换它)

请原谅,我不确定是否理解您的问题。你想在你的UTIL类中使用/调用entityManager吗?@AlexandreTranchant!但我不知道怎么说,“不存在”听起来很奇怪。为什么不使用标准方法“使其存在”?到目前为止,您在这方面做了哪些尝试,您的处境如何?@NicoHaase问题是,它找不到任何接口。正如我在回答中所说,我试着用标准的方法让它存在。对不起,如果不清楚的话。你说的“找不到”是什么意思?你能分享你的尝试吗?此外,请删除不必要的标签,因为自动布线问题没有连接到条令或API平台。嘿,你的答案很好。我们知道如何使用这个类,问题是我们不能使用EntityManager。然而,我们已经尝试过类似于您的答案的东西。我像你的回答一样构建了它,而回答是错误的。它希望我在使用时通过EntityManagerInterface<代码>函数App\Utils\Phone\Phone的参数太少::_construct(),第49行传入了/srv/api/src/Controller/AuthController.php中的0,预期正好是1个(AuthController是我使用代码的地方)。我已经更新了我的问题,为您提供了代码片段。好的,当我按您的方式操作时,它允许我使用
EntityManagerInterface
。这帮了大忙。然而,它仍然如此
symfony console debug:autowiring
symfony console debug:autowiring Security
symfony console debug:autowiring AuthorizationChecker