Php 获取laravel 5中所有控制器和操作的列表
我对laravel是新手,希望获取所有控制器的列表以及该控制器中的操作列表。 只是想知道是否有办法通过代码获得所有控制器及其所有方法的列表 谢谢, DJ尝试运行以下命令:Php 获取laravel 5中所有控制器和操作的列表,php,laravel,laravel-5,Php,Laravel,Laravel 5,我对laravel是新手,希望获取所有控制器的列表以及该控制器中的操作列表。 只是想知道是否有办法通过代码获得所有控制器及其所有方法的列表 谢谢, DJ尝试运行以下命令: $classes = get_declared_classes(); foreach ($classes as $class) { if (is_subclass_of($class, 'App\Http\Controllers\Controller')) { echo $class . '<b
$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 />';
}
}
$classes=get_declared_classes();
foreach($classes作为$class){
if(是($class,'App\Http\Controllers\Controller')的子类){
echo$class.“
”;
$methods=get\u class\u方法($class);
foreach($methods作为$method)
回显'--'.$method.'
';
}
}
它应该输出所有控制器(从控制器类继承的任何东西)及其方法
不过,我不知道如何判断哪些方法是实际的控制器操作。如果您使用以“get”、“post”或“any”开头的控制器路由,但如果您使用的是直接链接,则情况并非如此。通过您如何解释了解控制器操作的需要,似乎操作已经映射到路由,这意味着您可以使用路由来获取映射控制器和操作的列表。以下代码将生成已注册路由控制器操作的数组:
$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'];
}
}
这将忽略已映射闭包的路由,而您不需要映射闭包。请注意,您可能需要从第三方软件包注册的路由中筛选出任何匹配项。旧代码:
编辑:
此代码要好得多:
public static function Controllers()
{
$classes = array_filter(get_declared_classes(), function ($class) {
$isController = substr($class, -10) == 'Controller';
$isNotPlainController = $isController && substr($class, -11) != '\Controller';
return $isNotPlainController;
});
//Optional: to clear controller name from its namespace
$controllers=array_map(function ($controller){
return last(explode('\\',$controller));
},$classes);
//Optional: to reset keys of array to start from 0,1,2,...etc
$controllers = array_values($controllers);
return $controllers;
}
试试这个
$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);
这对我很管用
正在提取所有控制器(App\Http\controllers)
使用提取特定控制器中的所有方法
不过有一个问题。创建控制器后,您可能需要运行composer dump autoload。您希望实现什么,一些web服务功能?您好@KA_lin我正在构建一个访问相关系统,在该系统中,我希望允许基于角色访问操作和控制器。我将有一个屏幕,超级管理员可以在其中选择控制器和相应的操作,特定角色将被授予访问该路由的权限。嘿,我不知道是否有用于此的Laravel库,但您可以使用,检查该类是否在控制器命名空间中,foreach类get methodsCan此帮助?数组_diff(get_class_方法('MyClass')、get_class_方法('BaseController');感谢@KA_lin,workedHi@MaGnetas,这将返回与控制器绑定的所有方法的列表,例如我在控制器中只声明了3个方法,但它返回了28个操作。如果这是唯一的问题,您可能只能通过这种方式提取已定义(而不是继承)的方法:好东西。效果很好。谢谢分享。也可以通过这种方式获得$routes=Route::getRoutes();
$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);
$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);
$namespace = "App\Http\Controllers";
$controller = "TestController";
$controller_class = new ReflectionClass($namespace.'\\'.$controller);
$controller_methods = $controller_class->getMethods(ReflectionMethod::IS_PUBLIC);
dd($controller_methods);