我是laravel的新手,想要获取该控制器中所有控制器列表和操作列表。 只是想知道是否有办法通过代码获取所有控制器的列表以及所有的方法?
谢谢, DJ
答案 0 :(得分:16)
通过如何解释您需要了解控制器操作,似乎操作已映射到路由,这意味着您可以使用路由获取映射控制器和操作的列表。以下代码将生成已注册的路由控制器操作的数组:
$controllers = [];
foreach (Route::getRoutes()->getRoutes() as $route)
{
$action = $route->getAction();
if (array_key_exists('controller', $action))
{
// You can also use explode('@', $action['controller']); here
// to separate the class name from the method
$controllers[] = $action['controller'];
}
}
这将忽略具有Closures映射的路由,您不需要这些路由。请注意,您可能需要过滤掉第三方软件包注册的路线中的任何匹配项。
答案 1 :(得分:1)
public static function Controllers()
{
$controllers = require_once base_path('vendor/composer/autoload_classmap.php');
$controllers = array_keys($controllers);
$controllers = array_filter($controllers, function ($controller) {
return strpos($controller, 'App\Http\Controllers') !== false;
});
$controllers = array_map(function ($controller) {
return str_replace('App\Http\Controllers\\', '', $controller);
}, $controllers);
return $controllers;
}
答案 2 :(得分:0)
尝试运行:
$classes = get_declared_classes();
foreach ($classes as $class) {
if (is_subclass_of($class, 'App\Http\Controllers\Controller')) {
echo $class . '<br />';
$methods = get_class_methods($class);
foreach ($methods as $method)
echo '--- ' . $method . '<br />';
}
}
它应该输出所有控制器(从Controller类继承的任何东西)及其方法。
我不知道怎么知道哪些方法是实际的控制器动作。如果您使用控制器路线,那将是以&#34; get&#34;,&#34;&#34; post&#34;或者&#34;任何&#34;,但如果您使用的是直接链接,则情况并非如此。
答案 3 :(得分:0)
试试这个
$controllers = [];
$i=0;
foreach (Route::getRoutes()->getRoutes() as $route)
{
$action = $route->getAction();
if (array_key_exists('controller', $action))
{
$_action = explode('@',$action['controller']);
$_namespaces_chunks = explode('\\',$_action[0]);
$controllers[$i]['controller'] = end($_namespaces_chunks);
$controllers[$i]['action'] = end($_action);
$controllers[$i]['namespace'] = $action['controller'];
$controllers[$i]['route'] = $route;
}
$i++;
}
dump($controllers);
答案 4 :(得分:0)
对我有用。
提取所有控制器(App \ Http \ Controllers)
$controllers = require_once base_path('vendor/composer/autoload_classmap.php');
$controllers = array_keys($controllers);
$controllers = array_filter($controllers, function ($controller) {
return strpos($controller, 'App\Http\Controllers') !== false;
});
$controllers = array_map(function ($controller) {
return str_replace('App\Http\Controllers\\', '', $controller);
}, $controllers);
dd($controllers);
使用ReflectionClass提取特定控制器中的所有方法
$namespace = "App\Http\Controllers";
$controller = "TestController";
$controller_class = new ReflectionClass($namespace.'\\'.$controller);
$controller_methods = $controller_class->getMethods(ReflectionMethod::IS_PUBLIC);
dd($controller_methods);
尽管有一个收获。创建控制器后,您可能需要运行composer dump-autoload。