【问题标题】:Get list of all controllers and action in laravel 5获取 laravel 5 中所有控制器和动作的列表
【发布时间】:2015-08-16 06:56:55
【问题描述】:

我是 laravel 的新手,想获取所有控制器的列表和该控制器中的操作列表。 只是想知道是否有办法通过代码获取所有控制器及其所有方法的列表?

谢谢, DJ

【问题讨论】:

  • 你想实现什么,一些网络服务的东西?
  • 嗨@KA_lin 我正在构建一个与访问相关的系统,我希望在该系统中允许基于角色访问操作和控制器。我将有一个屏幕,超级管理员可以在其中选择控制器和相应的操作,并且特定角色将被授予访问该路由的权限。
  • 嘿,我不知道是否有一个 Laravel 库,但你可以使用 php.net/manual/en/function.get-declared-classes.phpphp.net/manual/en/function.get-class-methods.php 来做到这一点,检查类是否在 Controllers 命名空间和 foreach 类获取方法
  • 这有帮助吗? array_diff(get_class_methods('MyClass'), get_class_methods('BaseController'));
  • 感谢@KA_lin,成功了

标签: php laravel laravel-5


【解决方案1】:

通过您解释需要了解控制器动作的方式,这些动作似乎已经映射到路由,这意味着您可以使用路由来获取映射的控制器和动作的列表。以下代码将生成一个已注册路由控制器操作的数组:

$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'];
    }
}

这将忽略映射了闭包的路由,您不需要这些路由。请注意,您可能需要从第三方包注册的路由中过滤掉任何匹配项。

【讨论】:

  • 好东西。效果很好。感谢分享。
  • 这种方式也可以。 $routes = Route::getRoutes();
【解决方案2】:
旧代码:

罢工>

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;
}

已编辑:

此代码要好得多:

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;
}

【讨论】:

    【解决方案3】:

    这对我有用。

    提取所有控制器(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。

    【讨论】:

      【解决方案4】:

      尝试运行这个:

      $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 类继承的任何东西)及其方法。

      我不确定如何判断哪些方法是实际的控制器操作。如果您使用以“get”、“post”或“any”开头的控制器路由,但如果您使用的是直接链接,则情况并非如此。

      【讨论】:

      • 嗨@MaGnetas,这将返回与控制器绑定的所有方法的列表,例如,我在控制器中仅声明了 3 个方法,但它返回了 28 个操作。
      • 如果这是唯一的问题,您可能只能通过这种方式提取已定义(而非继承)的方法:stackoverflow.com/questions/3712671/…
      【解决方案5】:

      试试这个

              $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);
      

      【讨论】:

        猜你喜欢
        • 2016-04-20
        • 1970-01-01
        • 2013-12-15
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 2013-08-17
        相关资源
        最近更新 更多