Search code examples
phpsymfonyswaggerswagger-editornelmioapidocbundle

Is there any way to use multiple yml file with nelmio_api_doc in symfony 3 with NelmioApiDocBundle?


NelmioApiDocBundle is allowing only single configuration file as .yml as.

nelmio_api_doc:
  routes:
    path_patterns: # an array of regexps
      - ^/api
  documentation:
    paths:
      /api/login_check:
      ...
      /api/refresh_token:
      ...

But I have more then 200 URL to use and all for different Bundles. it would working properly but hard to handle all in same file.

So if anyone has solution to divide "paths" as different separate files.


Solution

  • Problem solved! :-)

    One of Mine friend has a great idea to resolve this problem. actually, this is not the proper solution, but I this is the only way to solve this problem.

    We create "api_index.yaml"

    export_path: '/config/packages/api_doc.yaml'
    
    import_paths:
      - "@DomCoreBundle/Resources/config/api_doc/api_base_doc.yaml"
      - "@DomCmsBundle/Resources/config/api_doc/static_page_path_doc.yaml"
      - "@DomEntityBundle/Resources/config/api_doc/category_path_doc.yaml"
      - "@DomCmsBundle/Resources/config/api_doc/carousel_path_doc.yaml"
      - "@DomQuickLinkBundle/Resources/config/api_doc/quick_link_path_doc.yaml"
      - "@DomUserBundle/Resources/config/api_doc/user_path_doc.yaml"
      - "@DomUserBundle/Resources/config/api_doc/dealer_path_doc.yaml"
      ...
    

    Then we create a Symfony command(script) which read each "import_paths" file and append content in "export_path" file.

    $this->io = new SymfonyStyle($input, $output);
    $path = $this->kernel->locateResource('@FaCoreBundle/Resources/config/api_index.yaml');
    $paths = Yaml::parse(file_get_contents($path));
    
    if (array_key_exists('import_paths', $paths)) {
        $contentLength = $this->loadFilesByPath($input, $output, $paths);
        if ($input->getOption('watch')) {
            $contentLengthNew = [];
            while (true) {
                foreach ($paths['import_paths'] as $path) {
                    $ymlPath = $this->kernel->locateResource($path);
                    $contentLengthNew[$ymlPath] = md5((file_get_contents($ymlPath)));
                }
    
                if (!empty(array_diff($contentLength, $contentLengthNew)) || count($contentLength) != count($contentLengthNew)) {
                    $diff = array_diff($contentLengthNew, $contentLength);
                    if (!empty($diff)) {
                        $this->io->writeln(sprintf('<comment>%s</comment> <info>[file+]</info> %s', date('H:i:s'), current(array_keys($diff))));
                    }
    
                    $contentLength = $this->loadFilesByPath($input, $output, $paths);
                }
    
                sleep($input->getOption('period'));
            }
        }
    }