如何从处理程序调用控制器?

时间:2017-05-25 06:43:39

标签: php laravel laravel-5 routing

我有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中找到它

我们如何实现这一目标?

3 个答案:

答案 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