2017-06-12 93 views
1

是否可以從__construct()函數中獲取類中調用方法的名稱?在類構造函數中找出調用的方法名稱?

我有一個MVC應用程序,用戶有權限,並且用戶訪問控制器(類)中的特定路由(方法),他們必須具有某些權限,我想在控制器的構造方法中定義,因爲我不爲了檢查用戶是否在每種方法中都具有某種權限,我不希望用重複代碼來混亂我的控制器。

+0

您可能想要閱讀以下內容:https:// stackoverflow。 com/a/9685039/727208 –

回答

0

是否有可能從 __construct()函數中獲取被調用方法的名稱?

不。調用方法時不會調用構造函數,而是在您創建對象的實例時調用構造函數。所以,當你調用方法的時候,構造函數已經完成了。

我想在控制器的構造方法來定義,因爲我 不想弄亂我的重複代碼控制器只是爲了 檢查,如果用戶在每一個方法有一定的權限。

在這種情況下,你可以做一個protected函數,它的權限檢查,然後調用從每個大衆路線的方法:

class Controller 
{ 

    protected function checkPermissions($route) 
    { 
     // ... 
    } 

    public function someRoute() 
    { 
     $this->checkPermissions(__METHOD__); 
     // ... 
    } 

    public function someOtherRoute() 
    { 
     $this->checkPermissions(__METHOD__); 
     // ... 
    } 

} 

或者更好的,你可能有一些其他的代碼它會自動實例化Controller對象,然後查找要觸發的正確方法。如果是這樣,您可以添加呼叫以檢查該代碼塊的權限,然後根本不必觸摸路由方法:

$controllerName = // determined by analyzing URL; 
$routeName = // determined by analyzing URL; 
if (!class_exists($controllerName)) { 
    throw new Exception('no such controller'); 
} 
$controller = new $controllerName(); 
if (!method_exists($controller, $routeName)) { 
    throw new Exception('no such route in controller'); 
} 
$controller->checkPermissions($routeName); 
$controller->$routeName(); 
+0

謝謝,第一個問題的答案讓我感到很蠢(我在一段時間內沒有做任何編碼)。我已經應用了您提供的方法,但我只是對Laravel的授權方式感到好奇,但似乎更加先進。 –

相關問題