当前位置: 首页 > 知识库问答 >
问题:

我如何在我的服务(Symfony 4)中使用教义方法?

费德宇
2023-03-14

我在Symfony中创建了自己的第一个服务:

// src/Service/PagesGenerator.php 
namespace App\Service;

class PagesGenerator
{
    public function getPages()
    {

      $page = $this->getDoctrine()->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);

        $messages = [
            'You did it! You updated the system! Amazing!',
            'That was one of the coolest updates I\'ve seen all day!',
            'Great work! Keep going!',
        ];

        $index = array_rand($messages);

        return $messages[$index];
    }
}

但是我得到了错误消息

试图调用类“App\Service\PagesGenerator”中名为“getDoctrine”的未定义方法。

然后我试图在我的services.yaml中补充:

PagesGenerator:
    class: %PagesGenerator.class%
    arguments:
      - "@doctrine.orm.entity_manager"

但是我得到了错误信息:

文件“/用户/工作/项目/配置/services.yaml”在 /Users/work/project/config/services.yaml中不包含有效的YAML(它加载在资源“/用户/工作/项目/配置/services.yaml”中)。

共有3个答案

符棋
2023-03-14

有了Symfony 4和新的自动配线,你可以很容易地注入一定数量的类

要了解可用于自动布线的类/接口,请使用以下命令:

bin/console   debug:autowiring 

我们将使用这个:

教义\ORM\EntityManagerInterface(doctrine.orm.default_entity_manager)

让我们在getPages函数之前添加这个

/**
 * @var EntityManagerInterface
 */
private $em;

public function __construct(EntityManagerInterface $em)
{
    $this->em = $em;
}

然后你可以这样使用它:

  $page = $this->em->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);

希望有帮助!

高皓
2023-03-14

确保对YAML使用适当的缩进,并使用“空格”。

YAML文件使用空格作为缩进,您可以使用2或4个空格进行缩进,但是没有选项卡可以阅读更多关于这方面的内容

在交响乐3.3之前

例如,我们在AppBundle/FrontEndBundle/Services中有servicesms_manager

services:
    AppBundle.sms_manager:
        class: AppBundle\FrontEndBundle\Services\SmsManager
        arguments: [ '@service_container' ,'@doctrine.orm.entity_manager' ]

然后,您的服务可以在构造函数中接收您的参数

<?php

namespace AppBundle\FrontEndBundle\Services;

use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class SmsManager {
    private $container;
    private $DM;

    public function __construct( Container $container, \Doctrine\ORM\EntityManager $DM ) 
    {
        $this->container = $container;
        $this->DM        = $DM;
    }

    /**
    * @return \Doctrine\ORM\EntityManager
    */

    public function getDoctrine() {
      return $this->DM;
    }

}

使用Symfony 3.3或更高版本,

有没有办法将EntityManager注入到服务中

use Doctrine\ORM\EntityManagerInterface

class PagesGenerator
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    // ...
}
宦砚
2023-03-14

所以,在评论中,我说最好让Symfony做他的工作,并自动安装EntityManager。这是你应该做的。另外,你能告诉我们你使用的是什么Symfony版本,以及是否启用了自动连接(检查services.yaml)吗?

<?php

namespace App\Service;

use Doctrine\ORM\EntityManagerInterface;

class PagesGenerator
{
    public function __construct(EntityManagerInterface $em) {
        $this->em = $em;
    }

    public function getPages()
    {

      $page = $this->em->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);

        $messages = [
            'You did it! You updated the system! Amazing!',
            'That was one of the coolest updates I\'ve seen all day!',
            'Great work! Keep going!',
        ];

        $index = array_rand($messages);

        return $messages[$index];
    }
}
 类似资料:
  • 我有一个网络服务在一个域上工作,比如www.abc.com。我想配置我的服务器,这样来自另一个域的请求(除了来自www.abc.com)都不会被接受。我不应该使用用户身份验证或任何与基于令牌的身份验证相关的东西。所以,我能想到的唯一选择是CORS,但我不知道如何使用它。任何帮助都很好。 我正在使用nodejs和express

  • ` ` 在TOmCAT服务器中。我无法运行这个项目。? ` 严重:web应用程序[/SpringMvc4]中的Servlet[spring]抛出了load()异常Java。伊奥。FileNotFoundException:无法打开组织上的ServletContext资源[/WEB-INF/spring servlet.xml]。springframework。网状物上下文支持ServletCont

  • 问题内容: 在昨天发布的另一个问题中,我对如何在Windows中将Python脚本作为服务运行提供了很好的建议。我唯一想知道的是:Windows如何了解可以在本机工具(“管理工具”中的“服务”窗口)中管理的服务。即 在Windows下,等效于在Linux下将启动/停止脚本放在/etc/init.d中的Windows是什么? 问题答案: 与Windows中大多数“可感知”的东西一样,答案是“注册表”

  • 在一个flink项目中,我使用一个case类click。 这个类填充了数据集,并且在日期为Java8的情况下可以很好地工作。在Java7环境中切换到org.joda(Version2.9)之后,对数据集中的click对象的调用不像以前那样执行。对click对象的date字段的某些函数的访问引发。这些函数的例子有等。我能够确保click类的日期字段不为空。我怀疑joda时间库与kryo序列化的交互不

  • 问题内容: 我还很陌生,因此无法找到任何文档或示例。我要做的是扩展基本服务,以便可以使用其他服务在基本服务下定义的方法。例如,说我有如下基本服务。 现在,我想定义一个从上述扩展的扩展服务,以便可以使用扩展服务中BasicService下定义的方法。也许像这样: 问题答案: 您应该注入以便能够访问它。旁边是对象文字,因此您实际上不能将其称为函数()。

  • 我有一个小的外部库,它公开了许多类。 在我的symfony4项目中,我想声明我的类来自供应商,作为带有autowire和public的服务。因此,我将我的库包含在composer中,并将类似这样的psr配置添加到composer中。json: 在那之后,我试图改变我的服务。yaml进入symfony,如下所示: 如果启动测试或运行应用程序,则会返回以下错误: 如果我申报服役。yaml此界面工作正常