首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony __construct用法

Symfony __construct用法
EN

Stack Overflow用户
提问于 2018-06-04 19:04:58
回答 1查看 718关注 0票数 0

我对Symfony (version 4)还比较陌生,并试图实现用于依赖注入的__construct方法。

目前,我正在通过自己的实现(在我知道__construct方法之前)“注入”依赖关系,如下所示:

routes.yaml

代码语言:javascript
复制
fetch:
    path: /fetch/{req}
    controller: App\Controller\Fetch::init
    requirements:
    req: ".+"

/fetch路由调用作为构造函数的init()方法。

控制器类

代码语言:javascript
复制
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;

use App\Services\Utilities; // a bunch of useful functions

class Fetch extends BaseController {

    private $u;

    public function init(Utilities $u) {

        $this->u = $u; // set the $u member with an instance of $u
    }

    private function do_fetch(){

        $this->u->prettyprint('hello service'); // use one of $u's methods
    }
}

如果你能容忍我的话,我在阅读医生们之前就想出了一个特别的方案,它几乎就是这样的细节(我得到了一个cookie)。

一个不同之处是,文档使用__construct()代替了我的init()方法。下面是上面链接的文档页面中的一个示例:

代码语言:javascript
复制
// src/Service/MessageGenerator.php

use Psr\Log\LoggerInterface;

class MessageGenerator
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function getHappyMessage()
    {
        $this->logger->info('About to find a happy message!');
        // ...
    }
}

但是,当我将init()替换为__construct()并更新routes.yaml时,我会得到一个错误。

代码语言:javascript
复制
// .....

class Fetch extends BaseController {

    private $u;

    public function __construct(Utilities $u) {

        $this->u = $u; // set the $u member with an instance of $u
    }
    // ....

fetch:
    path: /fetch/{req}
    controller: App\Controller\Fetch::__construct
    requirements:
    req: ".+"

它要求我向__construct提供一个参数,因为该方法需要一个参数($u),但是当init()充当构造函数时,情况并非如此。

而且,我觉得由于__construct()方法是一个内置的钩子,Symfony应该知道如何使用它,而不必在routes.yaml中显式地告诉它。但是,排除它也会引发错误。

routes.yaml (__construct未明确表示)

代码语言:javascript
复制
fetch:
    path: /fetch/{req}
    controller: App\Controller\Fetch
    requirements:
    req: ".+"

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-06-04 22:06:29

__construct是PHP中一种神奇的方法。init方法的问题在于它没有强制要求对象必须有要构建的对象的实例。有时不需要对象属性。在本例中,我建议创建一个塞特,作为一种可选设置property.Try的方法,使类属性成为私有属性,并且只允许通过setter对其进行变异或检索,getters...this将为您的遵从set提供标准的API,并避免随机状态操作。

您可以在Symfony的路由器中使用迪奇来构造控制器,而不是通过将控制器注册为服务扩展基本控制器类。这极大地解耦了您的代码,并允许各种额外的灵活性。你应该总是喜欢组合而不是继承。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50687197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档