В CakePhp2 мы могли получить список методов в контроллере следующим образом:
App::import('Controller', 'TagsController');
$classMethods = get_class_methods('TagsController');
Но в CakePhp3 App :: import не работает. Тогда как получить список методов этого контроллера в CakePHP3?
Спасибо
@MushfiqurRahman, если мой ответ поможет вам, пожалуйста, примите его, я поддержал ваш вопрос.






Обратите внимание на эту ссылку. Думаю, App::import() меняет на App::classname()
https://book.cakephp.org/3.0/en/core-libraries/app.html
Вы можете использовать эту часть.
// Names with \ in them will be returned unaltered.
App::classname('App\Cache\ComboCache');
// Returns App\Cache\ComboCache
get_class_methods('App\Cache\ComboCache')
Как описано в комментарии, это ничего не даст, а просто вернет ту же самую строку. Если у кого-то есть полное имя класса контроллера, тогда это все, что необходимо для использования с get_class_methods(), однако не все методы, возвращаемые этой функцией, являются действиями контроллера ...
@ Арам Григорян Таким образом я получаю NULL. Вот мой код: $ controller = $ this-> request-> params ['controller']; Приложение :: имя класса ($ контроллер); var_dump (get_class_methods ($ controller)); выход; // дает NULL
@MushfiqurRahman не могли бы вы написать результат $controller(var_dump($controller)), пожалуйста
$controller здесь будет чем-то вроде просто «Теги». То, что вам нужно передать get_class_methods, будет больше похоже на «App \ Controller \ TagsController».
Если имя $ controller - TagsController, тогда вы должны написать App :: classname ("App \ Controller \". $ Controller), затем get_classe_methods ("App \ Controller \". $ Controller)
Напишите, пожалуйста, результат $ controller и где он находится
Также я думаю, что ваш контроллер $ не является строкой
Я получил свой ответ из комментария @GregSchmidt. Нет необходимости писать App::classname("App\Controller\".$controller);. Просто напишите следующую строку, чтобы получить список всех методов контроллера. get_class_methods('App\Controller\'.$controller); @AramGrigoryan Спасибо за ошибку. Но было бы лучше, если бы проверили ответ самостоятельно перед публикацией. Как бы то ни было, большое спасибо. Последняя строка кода: get_class_methods('App\Controller\\'.$controller.'Controller');, это для тех, кто попробует скопировать вставку.
Вы можете получить весь метод в контроллере, используя класс php ReflectionMethod
use ReflectionMethod;
public function getActions($controllerName) {
$className = 'App\\Controller\\' . $controllerName . 'Controller';
$class = new ReflectionClass($className);
$actions = $class->getMethods(ReflectionMethod::IS_PUBLIC);
$controllerName = str_replace("\\", "/", $controllerName);
$results = [$controllerName => []];
$ignoreList = ['beforeFilter', 'afterFilter', 'initialize', 'beforeRender'];
foreach ($actions as $action) {
if ($action->class == $className
&& !in_array($action->name, $ignoreList)
) {
array_push($results[$controllerName], $action->name);
}
}
return $results;
}
Если вы хотите получить список методов контроллера Users. Тогда просто позвони
$this->getActions('Users')
Надеюсь, это поможет вам.
App::classnameработает? Справка Предположим, что существует какой-то автозагрузчик ... можете ли вы просто использоватьget_class_methods, но передать полное имя класса контроллера?