我有两个控制器SubmitPerformanceController和PrintReportController。
在PrintReportController中,我有一个叫做getPrintReport的方法。
如何在submitperformanceccontroller中访问此方法?
我有两个控制器SubmitPerformanceController和PrintReportController。
在PrintReportController中,我有一个叫做getPrintReport的方法。
如何在submitperformanceccontroller中访问此方法?
当前回答
你可以通过实例化它并调用doAction来访问控制器:(put use Illuminate\Support\Facades\App;在控制器类声明之前)
$controller = App::make('\App\Http\Controllers\YouControllerName');
$data = $controller->callAction('controller_method', $parameters);
还要注意,这样做将不会执行该控制器上声明的任何中间件。
其他回答
你可以像这样访问你的控制器方法:
app('App\Http\Controllers\PrintReportController')->getPrintReport();
这可以工作,但在代码组织方面很糟糕(记住为PrintReportController使用正确的名称空间)
你可以扩展PrintReportController,这样SubmitPerformanceController将继承这个方法
class SubmitPerformanceController extends PrintReportController {
// ....
}
但这也会从PrintReportController继承所有其他方法。
最好的方法是创建一个trait(例如在app/Traits中),在那里实现逻辑,并告诉你的控制器使用它:
trait PrintReport {
public function getPrintReport() {
// .....
}
}
告诉你的控制器使用这个特性:
class PrintReportController extends Controller {
use PrintReport;
}
class SubmitPerformanceController extends Controller {
use PrintReport;
}
这两种解决方案都使SubmitPerformanceController具有getPrintReport方法,因此您可以使用$this->getPrintReport()调用它;从控制器内部或直接作为路由(如果你在routes.php中映射它)
你可以在这里阅读更多关于特质的内容。
在我看来最优雅的方法是:
app(YourController::class)->yourControllerMethod()
当然,你可以实例化另一个控制器并调用你想要的方法。也许这不是一个好的做法,但我不知道为什么:
$otherController = new OtherController();
$otherController->methodFromOtherController($param1, $param2 ...);
但是,这样做,你会有一个问题:另一个方法返回类似response()->json($result)的东西,这不是你想要的。 为了解决这个问题,定义另一个控制器的方法的第一个参数为:
public function methodFromOtherController(Request $request = null, ...
当你从主控制器调用methodFromOtherController时,你将把null作为第一个参数值:
$otherController = new OtherController();
$otherController->methodFromOtherController(null, $param1, $param2 ...);
最后,在methodFromOtherController方法的末尾创建一个条件:
public function methodFromOtherController(Request $request = null, ...)
{
...
if (is_null($request)) {
return $result;
} else {
return response()->json($result);
}
}
一旦Laravel在通过直接路由调用时设置$request,您就可以区分每种情况并返回相应的值。
你可以在PrintReportController中使用一个静态方法,然后像这样从SubmitPerformanceController调用它;
namespace App\Http\Controllers;
class PrintReportController extends Controller
{
public static function getPrintReport()
{
return "Printing report";
}
}
namespace App\Http\Controllers;
use App\Http\Controllers\PrintReportController;
class SubmitPerformanceController extends Controller
{
public function index()
{
echo PrintReportController::getPrintReport();
}
}
这种方法也适用于相同层次的Controller文件:
$printReport = new PrintReportController;
$prinReport->getPrintReport();