2017-05-25 26 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當然,謝謝 –

相關問題