Как получить список всех методов в контроллере в cakephp3

В CakePhp2 мы могли получить список методов в контроллере следующим образом:

App::import('Controller', 'TagsController');
$classMethods = get_class_methods('TagsController');

Но в CakePhp3 App :: import не работает. Тогда как получить список методов этого контроллера в CakePHP3?

Спасибо

App::classname работает? Справка Предположим, что существует какой-то автозагрузчик ... можете ли вы просто использовать get_class_methods, но передать полное имя класса контроллера?

ficuscr 27.06.2018 20:27

@MushfiqurRahman, если мой ответ поможет вам, пожалуйста, примите его, я поддержал ваш вопрос.

Aram Grigoryan 27.06.2018 20:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
344
2

Ответы 2

Обратите внимание на эту ссылку. Думаю, 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(), однако не все методы, возвращаемые этой функцией, являются действиями контроллера ...

ndm 27.06.2018 20:32

@ Арам Григорян Таким образом я получаю NULL. Вот мой код: $ controller = $ this-> request-> params ['controller']; Приложение :: имя класса ($ контроллер); var_dump (get_class_methods ($ controller)); выход; // дает NULL

Mushfiqur Rahman 27.06.2018 20:53

@MushfiqurRahman не могли бы вы написать результат $controller(var_dump($controller)), пожалуйста

Aram Grigoryan 27.06.2018 20:57
$controller здесь будет чем-то вроде просто «Теги». То, что вам нужно передать get_class_methods, будет больше похоже на «App \ Controller \ TagsController».
Greg Schmidt 27.06.2018 22:25

Если имя $ controller - TagsController, тогда вы должны написать App :: classname ("App \ Controller \". $ Controller), затем get_classe_methods ("App \ Controller \". $ Controller)

Aram Grigoryan 27.06.2018 22:43

Напишите, пожалуйста, результат $ controller и где он находится

Aram Grigoryan 27.06.2018 22:44

Также я думаю, что ваш контроллер $ не является строкой

Aram Grigoryan 27.06.2018 22:47

Я получил свой ответ из комментария @GregSchmidt. Нет необходимости писать App::classname("App\Controller\".$controller);. Просто напишите следующую строку, чтобы получить список всех методов контроллера. get_class_methods('App\Controller\'.$controller); @AramGrigoryan Спасибо за ошибку. Но было бы лучше, если бы проверили ответ самостоятельно перед публикацией. Как бы то ни было, большое спасибо. Последняя строка кода: get_class_methods('App\Controller\\'.$controller.'Controller‌​');, это для тех, кто попробует скопировать вставку.

Mushfiqur Rahman 28.06.2018 06:24

Вы можете получить весь метод в контроллере, используя класс 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')

Надеюсь, это поможет вам.

Другие вопросы по теме