L5-Swagger icon indicating copy to clipboard operation
L5-Swagger copied to clipboard

generator not working

Open parvizansarian opened this issue 1 year ago • 1 comments

when I run php artisan l5-swagger:generate I got Regenerating docs default without any error. but my new annotations not showed up in the documentation page. also if I change any of previous annotations it doesnt change seems like its freeze and not generating anymore. I tried: delete vendor and composer install again or composer update enviroment: windowa xampp php v8.2 I have deleted the storage/api-docs folder with api-docs.json in it. when I run php artisan l5-swagger:generate it will show Regenerating docs default and storage/api-docs folder is created without any file in it. and even when I put my previous api-docs.json back in the folder it will show : Failed to fetch https://example.local/docs/api-docs.json

l5-swagger.php `<?php

return [ 'default' => 'default', 'documentations' => [ 'default' => [ 'api' => [ 'title' => 'Thames Dev API Document', ],

        'routes' => [
            /*
             * Route for accessing api documentation interface
             */
            'api' => 'api/documentation',
        ],
        'paths' => [
            /*
             * Edit to include full URL in ui for assets
             */
            'use_absolute_path' => env('L5_SWAGGER_USE_ABSOLUTE_PATH', true),

            /*
             * File name of the generated json documentation file
             */
            'docs_json' => 'api-docs.json',

            /*
             * File name of the generated YAML documentation file
             */
            'docs_yaml' => 'api-docs.yaml',

            /*
             * Set this to `json` or `yaml` to determine which documentation file to use in UI
             */
            'format_to_use_for_docs' => env('L5_FORMAT_TO_USE_FOR_DOCS', 'json'),

            /*
             * Absolute paths to directory containing the swagger annotations are stored.
             */
            'annotations' => [
                base_path('app\Annotations'),
                base_path('Modules\*\app\Annotations'),
            ],
        ],
    ],
],
'defaults' => [
    'routes' => [
        /*
         * Route for accessing parsed swagger annotations.
         */
        'docs' => 'docs',

        /*
         * Route for Oauth2 authentication callback.
         */
        'oauth2_callback' => 'api/oauth2-callback',

        /*
         * Middleware allows to prevent unexpected access to API documentation
         */
        'middleware' => [
            'api' => [],
            'asset' => [],
            'docs' => ['auth:sanctum'],
            'oauth2_callback' => [],
        ],

        /*
         * Route Group options
         */
        'group_options' => [],
    ],

    'paths' => [
        /*
         * Absolute path to location where parsed annotations will be stored
         */
        'docs' => storage_path('api-docs'),

        /*
         * Absolute path to directory where to export views
         */
        'views' => base_path('resources/views/vendor/l5-swagger'),

        /*
         * Edit to set the api's base path
         */
        'base' => env('L5_SWAGGER_BASE_PATH', null),

        /*
         * Edit to set path where swagger ui assets should be stored
         */
        'swagger_ui_assets_path' => env('L5_SWAGGER_UI_ASSETS_PATH', 'vendor/swagger-api/swagger-ui/dist/'),

        /*
         * Absolute path to directories that should be excluded from scanning
         * @deprecated Please use `scanOptions.exclude`
         * `scanOptions.exclude` overwrites this
         */
        'excludes' => [],
    ],

    'scanOptions' => [
        /**
         * Configuration for default processors. Allows to pass processors configuration to swagger-php.
         *
         * @link https://zircote.github.io/swagger-php/reference/processors.html
         */
        'default_processors_configuration' => [
        /** Example */
        /**
         * 'operationId.hash' => true,
         * 'pathFilter' => [
         * 'tags' => [
         * '/pets/',
         * '/store/',
         * ],
         * ],.
         */
        ],

        /**
         * analyser: defaults to \OpenApi\StaticAnalyser .
         *
         * @see \OpenApi\scan
         */
        'analyser' => null,

        /**
         * analysis: defaults to a new \OpenApi\Analysis .
         *
         * @see \OpenApi\scan
         */
        'analysis' => null,

        /**
         * Custom query path processors classes.
         *
         * @link https://github.com/zircote/swagger-php/tree/master/Examples/processors/schema-query-parameter
         * @see \OpenApi\scan
         */
        'processors' => [
            // new \App\SwaggerProcessors\SchemaQueryParameter(),
        ],

        /**
         * pattern: string       $pattern File pattern(s) to scan (default: *.php) .
         *
         * @see \OpenApi\scan
         */
        'pattern' => null,

        /*
         * Absolute path to directories that should be excluded from scanning
         * @note This option overwrites `paths.excludes`
         * @see \OpenApi\scan
         */
        'exclude' => [],

        /*
         * Allows to generate specs either for OpenAPI 3.0.0 or OpenAPI 3.1.0.
         * By default the spec will be in version 3.0.0
         */
        'open_api_spec_version' => env('L5_SWAGGER_OPEN_API_SPEC_VERSION', \L5Swagger\Generator::OPEN_API_DEFAULT_SPEC_VERSION),
    ],

    /*
     * API security definitions. Will be generated into documentation file.
    */
    'securityDefinitions' => [
        'securitySchemes' => [
            /*
             * Examples of Security schemes
             */
            /*
            'api_key_security_example' => [ // Unique name of security
                'type' => 'apiKey', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
                'description' => 'A short description for security scheme',
                'name' => 'api_key', // The name of the header or query parameter to be used.
                'in' => 'header', // The location of the API key. Valid values are "query" or "header".
            ],
            'oauth2_security_example' => [ // Unique name of security
                'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
                'description' => 'A short description for oauth2 security scheme.',
                'flow' => 'implicit', // The flow used by the OAuth2 security scheme. Valid values are "implicit", "password", "application" or "accessCode".
                'authorizationUrl' => 'http://example.com/auth', // The authorization URL to be used for (implicit/accessCode)
                //'tokenUrl' => 'http://example.com/auth' // The authorization URL to be used for (password/application/accessCode)
                'scopes' => [
                    'read:projects' => 'read your projects',
                    'write:projects' => 'modify projects in your account',
                ]
            ],
            */

            /* Open API 3.0 support
            'passport' => [ // Unique name of security
                'type' => 'oauth2', // The type of the security scheme. Valid values are "basic", "apiKey" or "oauth2".
                'description' => 'Laravel passport oauth2 security.',
                'in' => 'header',
                'scheme' => 'https',
                'flows' => [
                    "password" => [
                        "authorizationUrl" => config('app.url') . '/oauth/authorize',
                        "tokenUrl" => config('app.url') . '/oauth/token',
                        "refreshUrl" => config('app.url') . '/token/refresh',
                        "scopes" => []
                    ],
                ],
            ],
            'sanctum' => [ // Unique name of security
                'type' => 'apiKey', // Valid values are "basic", "apiKey" or "oauth2".
                'description' => 'Enter token in format (Bearer <token>)',
                'name' => 'Authorization', // The name of the header or query parameter to be used.
                'in' => 'header', // The location of the API key. Valid values are "query" or "header".
            ],
            */
        ],
        'security' => [
            /*
             * Examples of Securities
             */
            [
                /*
                'oauth2_security_example' => [
                    'read',
                    'write'
                ],

                'passport' => []
                */
            ],
        ],
    ],

    /*
     * Set this to `true` in development mode so that docs would be regenerated on each request
     * Set this to `false` to disable swagger generation on production
     */
    'generate_always' => env('L5_SWAGGER_GENERATE_ALWAYS', true),

    /*
     * Set this to `true` to generate a copy of documentation in yaml format
     */
    'generate_yaml_copy' => env('L5_SWAGGER_GENERATE_YAML_COPY', false),

    /*
     * Edit to trust the proxy's ip address - needed for AWS Load Balancer
     * string[]
     */
    'proxy' => false,

    /*
     * Configs plugin allows to fetch external configs instead of passing them to SwaggerUIBundle.
     * See more at: https://github.com/swagger-api/swagger-ui#configs-plugin
     */
    'additional_config_url' => null,

    /*
     * Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically),
     * 'method' (sort by HTTP method).
     * Default is the order returned by the server unchanged.
     */
    'operations_sort' => env('L5_SWAGGER_OPERATIONS_SORT', null),

    /*
     * Pass the validatorUrl parameter to SwaggerUi init on the JS side.
     * A null value here disables validation.
     */
    'validator_url' => null,

    /*
     * Swagger UI configuration parameters
     */
    'ui' => [
        'display' => [
            'dark_mode' => env('L5_SWAGGER_UI_DARK_MODE', false),
            /*
             * Controls the default expansion setting for the operations and tags. It can be :
             * 'list' (expands only the tags),
             * 'full' (expands the tags and operations),
             * 'none' (expands nothing).
             */
            'doc_expansion' => env('L5_SWAGGER_UI_DOC_EXPANSION', 'none'),

            /**
             * If set, enables filtering. The top bar will show an edit box that
             * you can use to filter the tagged operations that are shown. Can be
             * Boolean to enable or disable, or a string, in which case filtering
             * will be enabled using that string as the filter expression. Filtering
             * is case-sensitive matching the filter expression anywhere inside
             * the tag.
             */
            'filter' => env('L5_SWAGGER_UI_FILTERS', true), // true | false
        ],

        'authorization' => [
            /*
             * If set to true, it persists authorization data, and it would not be lost on browser close/refresh
             */
            'persist_authorization' => env('L5_SWAGGER_UI_PERSIST_AUTHORIZATION', false),

            'oauth2' => [
                /*
                 * If set to true, adds PKCE to AuthorizationCodeGrant flow
                 */
                'use_pkce_with_authorization_code_grant' => false,
            ],
        ],
    ],
    /*
     * Constants which can be used in annotations
     */
    'constants' => [
        'L5_SWAGGER_CONST_HOST' => env('L5_SWAGGER_CONST_HOST', 'http://my-default-host.com'),
    ],
],

]; `

composer.json { "name": "laravel/laravel", "type": "project", "description": "The skeleton application for the Laravel framework.", "keywords": ["laravel", "framework"], "license": "MIT", "require": { "php": "^8.2", "jenssegers/agent": "^2.6", "laravel/framework": "^11.9", "laravel/sanctum": "^4.0", "laravel/tinker": "^2.9", "nwidart/laravel-modules": "^11.1", "opcodesio/log-viewer": "^3.11" }, "require-dev": { "darkaonline/l5-swagger": "^8.6", "fakerphp/faker": "^1.23", "laravel/pint": "^1.13", "laravel/sail": "^1.32", "mockery/mockery": "^1.6", "nunomaduro/collision": "^8.0", "phpunit/phpunit": "^11.0.1" }, "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } }, "scripts": { "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], "post-update-cmd": [ "@php artisan vendor:publish --tag=laravel-assets --ansi --force" ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ "@php artisan key:generate --ansi", "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"", "@php artisan migrate --graceful --ansi" ] }, "extra": { "laravel": { "dont-discover": [] }, "merge-plugin": { "include": [ "Modules/*/composer.json" ] } }, "config": { "optimize-autoloader": true, "preferred-install": "dist", "sort-packages": true, "allow-plugins": { "pestphp/pest-plugin": true, "php-http/discovery": true, "wikimedia/composer-merge-plugin": true } }, "minimum-stability": "stable", "prefer-stable": true }

parvizansarian avatar Nov 14 '24 10:11 parvizansarian

Hi. 'docs' => ['auth:sanctum'], this line protects your route/docs/api-docs.json document. I can't figure out the exact reason without additional data however if you see an unauthorized error like bellow, just check your config.

Failed to load API definition. Fetch error Unauthorized http://127.0.0.1:8000/docs/api-docs.json

mehmetkalayci avatar Jan 13 '25 06:01 mehmetkalayci