Slim 3 - 如何在不传递参数的情况下调用方法

时间:2017-07-11 15:48:48

标签: php dependency-injection slim

我正在使用纤细的桥梁进行DI。

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

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);
    }
}

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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