【问题标题】:Call controller with parameter带参数调用控制器
【发布时间】:2017-07-13 07:40:43
【问题描述】:

我尝试使用参数调用另一个控制器中的控制器。没有任何参数我没有问题。

return app()->call('App\Http\Controllers\AppointmentController@create');

AppointmentController.php

class AppointmentController extends Controller
{

    public function create(CalendarInterface $calendar, Request $request) {
        ...
    }
}

但是当我尝试通过一个时出现错误。

return app()->call('App\Http\Controllers\AppointmentController@create', $response);

AppointmentController.php

class AppointmentController extends Controller
{

    public function create($response, CalendarInterface $calendar, Request $request) {
        ...
    }
}

类型错误:传递给 Illuminate\Container\Container::call() 的参数 2 必须是数组类型,给定对象

如果我这样做了

return app()->call('App\Http\Controllers\AppointmentController@create', [$response]);

类型错误:传递给 App\Http\Controllers\AppointmentController::create() 的参数 2 必须实现接口 App\CalendarInterface,在 [...]/app/Http/Controllers/ 中给出的 Illuminate\Http\Request 实例AppointmentController.php:18

【问题讨论】:

  • 错误很明显。你需要做app()->call('App\Http\Controllers\AppointmentController@create', [ $response ]);
  • 我已经试过了。 Type error: Argument 2 passed to App\Http\Controllers\AppointmentController::create() must implement interface App\CalendarInterface, instance of Illuminate\Http\Request given in [...]/app/Http/Controllers/AppointmentController.php:18
  • 为什么要首先调用控制器?不建议这样做。你应该重构你的代码
  • 我正在构建一个机器人,当机器人收到消息时,它会调用控制器。机器人可以做很多事情,所以我每件事都有一个控制器。
  • 例如使用事件和监听器!!

标签: php laravel laravel-5


【解决方案1】:

使用命名参数:

app()->call('App\Http\Controllers\AppointmentController@create',  [
    "response" => $response
]);

【讨论】:

    【解决方案2】:

    Laravel 的自动 DI 可能不支持这个用例,只传递部分参数并要求他猜测还有什么需要解决的。

    尝试传递所有参数:

    app()->call(
        'App\Http\Controllers\AppointmentController@create',
        [$response, app(CalendarInterface::class), app(Request::class)]
    );
    


    作为旁注,调用这样的“子控制器”可能是一种不好的做法。将业务逻辑转移到普通类怎么样?

    【讨论】:

      猜你喜欢
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多