【问题标题】:symfony 4 autowire concern in __contruct__contruct 中的 symfony 4 自动装配问题
【发布时间】:2019-07-01 20:47:39
【问题描述】:

这是我在 Symfony 4 中非常简单的课程:

namespace App\Controller;

class T_contact
{
    public $email;
    public $name;
    /**
     * Constructor.
     *
     * @param string $email
     * @param string $name

     */
    public function __construct( $email, $name) {
        $this->email = $email;
        $this->name = $name;
    }

但我总是得到: 无法自动装配服务“App\Controller\T_contact”:方​​法“__construct()”的参数“$email”没有类型提示,您应该明确配置其值。

我试过了: “...__construct(字符串 $email,字符串 $name)” 但我收到几乎相同的消息,除了: "... 是类型提示的"字符串",你应该配置...

我不明白。 欢迎任何线索...

【问题讨论】:

  • 问题是 autowire 试图自动将 T_conact 设置为服务。当然不是。将 T_contact 移动到 Entity 等目录中,然后在 services.yaml 文件中排除实体目录。
  • 你的config.yml/services.yaml看起来怎么样?
  • 是来自骨架项目的那个,但是不知道怎么贴到这里(太长了)... :(
  • 之所以有效,是因为实体目录已被排除在开箱即用的 services.yaml 文件中。您可以调整您的服务文件以明确排除 T_contact,无论它在哪里。这实际上是一个非常重要的概念。你会一遍又一遍地遇到同样的问题,直到你明白为什么。虽然 T_contact 不是 Doctrine 实体,但它确实像一个一般实体。

标签: symfony


【解决方案1】:

你不能自动装配字符串,因为 Symfony 不知道要注入哪一个。服务通过它们作为标识符的类或接口自动装配,但使用参数(int、字符串和数组),Symfony 无法猜测您要注入哪些。这就是为什么您会收到错误消息...you should configure its value explicitly.

因此您需要在 services.yml 中手动指定它们

示例:

  App/Controller/T_contact:
      arguments:
          $email: 'your_email'
          $name: 'your_name'  

补充说明:最佳实践是将您的类名以驼峰命名,如果它是控制器,则使用术语Controller 后缀(即TContactController)

【讨论】:

  • 感谢您的建议。关于案例:我更喜欢我的实体坚持表名。 T_contact 是它的 MSSQL 名称。下一个开发者不会问我问题。我明白你的意思,但我的课程不是服务。为什么要在 services.yml 中添加任何内容?我是一名确认的 Drupal 7/8 开发人员,但我在 5 前开始使用纯 Symfony。我们不能使用像这样的简单类吗?现在,我将它移到 src/Entity 中,并更改了它的命名空间。到目前为止一切正常,但我不明白为什么在 src/Entity 中允许某些东西,而在 src/Controller 中却没有??
  • 最终我将使用真实实体连接到我的数据库,但我只是在 S4 中测试东西,用于创建 REST API...
  • 等等,所以你的 T_contact 类在实体而不是控制器中。 symfony 中的实体不是服务,而是代表数据库数据模型的模型对象。所以你需要用new T_contact($email, $name); 来实例化实体。另一方面,控制器是 MVC 模式的一部分:它们控制视图和模型(以及您可能使用的其他服务)之间的链接。
猜你喜欢
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2019-01-21
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多