我正在使用纤细的桥梁进行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']);
答案 0 :(得分:0)
您的问题间接暗示App/Controllers/BController::second()
包含一段应用程序逻辑(否则您为什么要在不传递请求/响应对的情况下调用它?)。如果是这种情况,那么您将面临违反单一责任原则的问题 - 每个组件应该只做一件事。任何控制器的任务是处理请求和返回响应。这就是@Rob问你关于App/Controllers/BController::second()
做什么的问题。
由于您希望在调用AController::second()
方法时执行相同的逻辑,因此最好的解决方案是将应用程序逻辑从App\Controllers\BController::second()
提取到单独的服务,并在任何位置调用它。
然后在必要时从控制器内部注入服务。
至于你问题的确切答案 - 不,你不能调用那个方法,因为方法签名需要$request
和$response
个参数。