【问题标题】:Slim 3 - How to call methods without passing argumentsSlim 3 - 如何在不传递参数的情况下调用方法
【发布时间】:2017-07-11 15:48:47
【问题描述】:

我正在为 DI 使用纤细的桥接器。

说,我想从 AController 调用 BController 中的函数'second'。

namespace App\Controllers;

use Psr\Http\Message\RequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Noodlehaus\Config as Config;

class BController extends Controllers {

public function second(Request $request, Response $response, Config $config, $optional = []){
    // do stuff
}

我如何调用第二个函数,只传递我想要发送的参数(在这种情况下为 $optional)而不是所有其他依赖项,如请求或响应。​​

class AController extends Controllers{
    public function second(Request $request, Response $response, BController $bController){
        $bController->second(['custom parameter']);

        // or

        $this->container->get('App/Controllers/BCOntroller')->second();

        // i do not want this

        $bController->second($request, $response, $cache, etc etc);
    }
}

我试图遵循路由逻辑。'first'函数在不发送参数的情况下执行

$app->get('/', ['\App\Controllers\AController', 'first']);

【问题讨论】:

  • 第二个控制器需要什么功能?
  • 显然是第二个功能?
  • 显然。祝你好运。
  • 问题本身与第二个函数的功能没有远程关系。还是谢谢

标签: php dependency-injection slim


【解决方案1】:

您的问题间接暗示App/Controllers/BController::second() 包含一段应用程序逻辑(否则您为什么要在不传递请求/响应对的情况下调用它?)。如果是这种情况,那么您将面临打破单一责任原则的问题 - 每个组件应该只做一件事。任何控制器的任务都是处理请求并返回响应。这就是为什么@Rob 问你一个关于App/Controllers/BController::second() 做什么的问题。

由于您希望在调用 AController::second() 方法时执行相同的逻辑,因此最好的解决方案是将应用程序逻辑从 App\Controllers\BController::second() 提取到单独的服务并在您想要的任何地方调用它。

然后在必要时从控制器内部注入服务。

至于您问题的确切答案 - 不,您不能调用该方法,因为方法签名需要 $request$response 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多