2015-10-21 2 views
0

Я пытаюсь создать контроль доступа на основе ролей в нашей PHP-среде. Структура основана на архитектуре MVC, поэтому каждый путь работает на /controller/action/param. Мы можем получить контроллер и действие при инициализации и сохранить их в переменных, $ controller, $ action. Теперь моя идея заключается в том, чтобы использовать класс, чтобы проверить разрешения этого действия, как:Получить все методы

Auth::permissions($controller, $action); 

Теперь я надеюсь, что я мог бы каким-то образом создать скрипт, который будет найти все публичные методы контроллеров внутри/модулей/папки. Таким образом, я мог бы просто запустить скрипт, и он обновит все действия контроллера в виде списка в базе данных, откуда мы получим разрешения на роль. Таким образом я мог бы избежать вставки всех действий контроллера вручную. Получение всех контроллеров очень легко, как структура папок как:

/modules 
    /controller 
     controller.php 

Так что я могу просто найти все подкаталоги модули и добавлять .php в конце концов. Мой вопрос в том, что я могу каким-то образом получить общедоступные методы файла?

class Example extends Controller { 
    public function main() { 
     return 'foo'; 
    } 
} 

Таким образом, я мог хранить это в базе данных

example | main | role_id 
+0

http://php.net/manual/en/class.reflectionclass.php Не совсем все функции из файла, но вы получите все функции из класса. с атрибутами и т. д. –

+0

Файл не имеет методов. У него нет действий или контроллеров. –

+1

@TanuelMategi http://php.net/manual/en/function.get-class-methods.php нет необходимости в классе отражения для получения имен общедоступных методов. –

ответ

1

Вот немного кода, который может помочь вам:

<?php 
class Example { 
    public function main() { 
     return 'foo'; 
    } 
    private function privatefunc(){ 
    } 
    public function anotherpublicfunc(){ 
    } 
} 


$reflector = new ReflectionClass("Example"); 

foreach($reflector->getMethods() as $method){ 
    if($method->isPublic()) { 
     echo "Method ".$method->name." is public".PHP_EOL; 
    }else{ 
     echo "Method ".$method->name." is not public".PHP_EOL; 
    } 
} 
?> 

выход:

Method main is public 
Method privatefunc is not public 
Method anotherpublicfunc is public 
+0

Да, спасибо. Это сработало. – Rcls

+0

добро пожаловать :) не стесняйтесь отмечать мой ответ, как принято. –

+0

Да, я сделаю это. Просто нужно ждать, потому что это было так быстро. Вы действительно забыли сделать $ method объектом ReflectionMethod. Без нее вы не можете получить isPublic.Проще всего сделать $ reflector-> getMethods (ReflectionMethod :: IS_PUBLIC) – Rcls

0

Если вы хотите получить общедоступные методы o метрономы класс, то вы можете использовать get_class_methods читать dochere

class Car { 

    public function permission_method_two() { 

    } 

    public function permission_method_three() { 

    } 

    private function private_function() { 

    } 

} 

echo '<pre>'.print_r(get_class_methods('Car'),1).'</pre>'; 
// prints only public methods: 

Array 
(
    [0] => permission_method_two 
    [1] => permission_method_three 
) 
0

Вы можете следовать конвенции: - каждый публичные методы начинаются без lowdash - каждый частный и защищенный метод запуска с lowdash

Пример

class Example 
{ 
    public function publicMethod() 
    { 
    } 

    private function _privateMethod() 
    { 
    } 

    protected function _protectedMethod() 
    { 
    } 

} 

, а затем использовать http://php.net/manual/ru/function.get-class-methods.php

foreach(get_class_methods('Example') as $methodName){ 
    if(strpos($methodName, '_') !== 0) $publicMethod[] = $methodName; 
} 
Смежные вопросы