2017-05-25 86 views
0

我有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

如何才能实现这个 ?

回答

2

你可以调用控制器类似的任何方法。这有助于吗?

/** @var TestController $testController */ 
    $testController = app(\App\Http\Controllers\TestController::class); 
    $commonVars = $testController->getMenusAndConfigs('users'); 
+1

工作正常!谢了哥们 !!!!! – rahulsm

0

也许你错了调用方法?尝试像这样:

$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

+0

伴侣的坏运气:|不起作用 – rahulsm

+0

您不显示getMenusAndConfigs的实现。如果getMenusAndConfigs不是静态的,则不起作用。如果它不是静态的,则必须将对象传递给'app-> call'。 – maximkou

+0

这是几乎所有其他控制器都使用的工作方法。我打电话给我的方式和你的方式,但它不工作。方法不是静态的。它在@ Shailesh的方式工作 – rahulsm

0

这是不是在所有好主意,打电话或使用另一个控制器的控制方法除了延长父控制器方法,

单个控制器的目的是为单个功能,所有可重复使用的逻辑都应该被移入存储库。控制器只应使用存储库接受请求执行逻辑并回应请求。

在你的情况

添加Repositories文件夹,我们app文件夹中添加,因为所有classesapp文件夹将被自动加载,而bootstrappingapp文件夹内。在Repositories文件夹中添加您的存储库类。

Handler

添加一个构造函数,注入构造函数和创建一个对象为构造

public function __construct(MenuRepository $menus) { 
    $this->menus = $menus; 
} 

和你render方法里面,你可以编写

$commonVars = $this->menus->getMenusAndConfigs('users'); 

getMenusAndConfigs($userType) {}方法应该是里面的 MenuRepository

希望这有助于

看一看这个讨论为什么我们使用存储库模式Repository Pattern in Laravel

+0

@Rahul_m,对Reusable组件使用Repository模式,在另一个控制器或作业中访问控制器方法并不是一个好主意。 –

+0

我会在下一个项目中记住这一点。现在我不能:) – rahulsm

+0

@rahul_m当然,谢谢 –

相关问题