我有Handler.php(app/Exceptions/Handler.php
)
我想从Handler.php
的渲染方法中调用控制器方法。
这是渲染方法和我尝试过的,
public function render($request, Exception $e)
{
$common_vars = app()->call(\App\Http\Controllers\TestController::class."@".getMenusAndConfigs('users'));
if ($this->isHttpException($e)) {
switch ($e->getStatusCode()) {
// not authorized
case '403':
return \Response::view('errors.403', array(), 403);
break;
// not found
case '404':
return \Response::view('errors.404', $common_vars, 404);
break;
// internal error
case '500':
return \Response::view('errors.500', array(), 500);
break;
default:
return $this->renderHttpException($e);
break;
}
} else {
return parent::render($request, $e);
}
// return parent::render($request, $e);
}
我可以通过调用其他控制器中的测试控制器来获取$common_vars
,但是我想在Handler.php中找到它
我们如何实现这一目标?
答案 0 :(得分:3)
你可以调用任何类似控制器的方法。这有帮助。
/** @var TestController $testController */
$testController = app(\App\Http\Controllers\TestController::class);
$commonVars = $testController->getMenusAndConfigs('users');
答案 1 :(得分:1)
也许你错了通话方法?试试这样:
$common_vars = app()->call(
[app(\App\Http\Controllers\TestController::class), 'getMenusAndConfigs'],
['YOUR_ARG_NAME' => 'users']
);
将YOUR_ARG_NAME替换为getMenusAndConfigs
参数名称。
注意:此类案例的最佳做法是使用View Composers
- https://laravel.com/docs/5.4/views#view-composers
答案 2 :(得分:1)
除了扩展父控制器方法之外,调用或使用其他控制器中的Controller方法并不是一件好事。
单个控制器的目的是用于单个功能,所有可重用逻辑应该移动到存储库。控制器应该只接受使用存储库的请求执行逻辑并回复请求。
在你的情况下
在我们正在Repositories
文件夹中添加的app
文件夹中添加app
文件夹,因为classes
文件夹中的所有app
都将自动加载{{1 }}。在Repositories文件夹中添加您的存储库类。
在bootstrapping
中添加一个构造函数,注入构造函数并为该构造函数创建一个对象
Handler
并在您的public function __construct(MenuRepository $menus) {
$this->menus = $menus;
}
方法中,您可以像
render
$commonVars = $this->menus->getMenusAndConfigs('users');
方法应该在里面getMenusAndConfigs($userType) {}
希望这有助于
查看本讨论为什么我们使用存储库模式Repository Pattern in Laravel