nextapps-be / laravel-swagger-ui

Add Swagger UI to a Laravel application.
MIT License
160 stars 20 forks source link

How to use yaml instead of json file? #13

Closed plateena closed 1 year ago

plateena commented 2 years ago

Hi, I want to use yaml file instead of json file. And I don't know how to set it.

I already tried to change 'file' => resource_path('docs/openapi.yaml'), in the config file.

But got the error
Fetch error Internal Server Error /docs/openapi.json

In last project I use npm package to transform yaml file to json file.

Please help me.

gdebrauwer commented 2 years ago

Can you share the full stack trace of the error? Can you also check that a openapi.yaml file really exists in that location by running file_exists(resource_path('docs/openapi.yaml'))?

plateena commented 2 years ago

image

true on top of the screen are the dump file_exist check for both openapi.json and openapi.yml file. So both file are exists. When I change the setting to json it work. But not for yml file.

Here are the error log:

[2022-04-24 13:00:48] local.ERROR: NextApps\SwaggerUi\Http\Controllers\OpenApiJsonController::getJson(): Return value must be of type array, null returned {"exception":"[object] (TypeError(code: 0): NextApps\SwaggerUi\Http\Controllers\OpenApiJsonController::getJson(): Return value must be of type array, null returned at /app/vendor/nextapps/laravel-swagger-ui/src/Http/Controllers/OpenApiJsonController.php:34) [stacktrace]

0 /app/vendor/nextapps/laravel-swagger-ui/src/Http/Controllers/OpenApiJsonController.php(13): NextApps\SwaggerUi\Http\Controllers\OpenApiJsonController->getJson()

1 /app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(48): NextApps\SwaggerUi\Http\Controllers\OpenApiJsonController->__invoke()

2 /app/vendor/laravel/framework/src/Illuminate/Routing/Route.php(261): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(NextApps\SwaggerUi\Http\Controllers\OpenApiJsonController), '__invoke')

3 /app/vendor/laravel/framework/src/Illuminate/Routing/Route.php(204): Illuminate\Routing\Route->runController()

4 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(728): Illuminate\Routing\Route->run()

5 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))

6 /app/vendor/nextapps/laravel-swagger-ui/src/Http/Middleware/EnsureUserIsAuthorized.php(14): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

7 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): NextApps\SwaggerUi\Http\Middleware\EnsureUserIsAuthorized->handle(Object(Illuminate\Http\Request), Object(Closure))

8 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

9 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))

10 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

11 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))

12 /app/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

13 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))

14 /app/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

15 /app/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest(Object(Illuminate\Http\Request), Object(Illuminate\Session\Store), Object(Closure))

16 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))

17 /app/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

18 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))

19 /app/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

20 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))

21 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

22 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(730): Illuminate\Pipeline\Pipeline->then(Object(Closure))

23 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(705): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))

24 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(667): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))

25 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(656): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))

26 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))

27 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))

28 /app/vendor/livewire/livewire/src/DisableBrowserCache.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

29 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Livewire\DisableBrowserCache->handle(Object(Illuminate\Http\Request), Object(Closure))

30 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

31 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))

32 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure))

33 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

34 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))

35 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle(Object(Illuminate\Http\Request), Object(Closure))

36 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

37 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))

38 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

39 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure))

40 /app/vendor/laravel/framework/src/Illuminate/Http/Middleware/Handle

This the working json file: image

This json file are converted of yaml file.

viniciuSquare commented 1 year ago

I've set my yaml file at config/swagger-ui and worked just fine. Could you fix it?

gaetandezeiraud commented 1 year ago

Don't work for me. If I set openapi.yaml I have the following error Internal Server Error /swagger/openapi.json. Yes, the error message say .json even if I specify .yaml in configuration. With modify_file => false.

Any idea?

sabrio commented 1 year ago

@Brouilles I was facing the same Internal Server Error /swagger/openapi.json, the yaml PHP extension was missing in my server, make sure to enable it and it will work, btw the message is misleading.

mengfong96 commented 1 year ago

@Brouilles I was facing the same Internal Server Error /swagger/openapi.json, the yaml PHP extension was missing in my server, make sure to enable it and it will work, btw the message is misleading.

Yes, we need php-yaml extension to get rid of misleading message. Refer here for steps (Windows XAMPP user).

A bit about my findings: File: vendor\nextapps\laravel-swagger-ui\src\Http\Controllers\OpenApiJsonController.php

    protected function getJson() : array
    {
        $path = config('swagger-ui.file');
        $content = file_get_contents($path);

        if (Str::endsWith($path, '.yaml')) {
            if (! extension_loaded('yaml')) {
                throw new RuntimeException('OpenAPI YAML file can not be parsed if the YAML extension is not loaded');
            }

            return yaml_parse($content);
        }

        return json_decode($content, true);
    }