如何在 Laravel + Swagger 中组合 属性 和 json 响应?

How to combine a property and json response in Laravel + Swagger?

我有一个项目使用 Laravel 作为 api 并使用 swagger 作为文档

我的登录控制器中有这个方法:

/**
 * Handle an incoming authentication request.
 * 
 * 
 * @OA\Post(
 *     tags={"UnAuthorize"},
 *     path="/login",
 *     summary="User Login",
 *     @OA\RequestBody(
 *          @OA\MediaType(
 *              mediaType="application/json",
 *              @OA\Schema(
 *                  type="object",    
 *                  ref="#/components/schemas/LoginRequest",                  
 *              )
 *          )
 *     ),
 *     @OA\Response(
 *          response="200", 
 *          description="An example resource", 
 *          @OA\JsonContent(
 *              type="object", 
 *              @OA\Property(
 *                  format="string", 
 *                  default="20d338931e8d6bd9466edeba78ea7dce7c7bc01aa5cc5b4735691c50a2fe3228", 
 *                  description="token", 
 *                  property="token"
 *              )
 *          ),
 *         @OA\JsonContent(ref="#/components/schemas/UserResource")
 *     ),
 *     @OA\Response(response="401", description="fail"),
 * )
 *
 * @param  \App\Http\Requests\Auth\LoginRequest  $request
 * @return \Illuminate\Http\JsonResponse
 */
public function store(LoginRequest $request)
{                

    $request->authenticate();                
  
    return response()->json(
        [ 
           "token" => $request->user()->createToken($request->email)->plainTextToken,
           "user" => $request->user();  

        ]
    );
        
    
}

然后,当我 运行 这个命令:php artisan l5-swagger:generate 时,它​​显示这个错误:

c:\myproject\vendor\zircote\swagger-php\src\Logger.php:40 36▕ $this->log = function ($entry, $type) { 37▕ if ($entry instanceof Exception) { 38▕ $entry = $entry->getMessage(); 39▕ } ➜ 40▕ trigger_error($entry, $type); 41▕ }; 42▕ }

当我删除它时

@OA\JsonContent(ref="#/components/schemas/UserResource")

它有效,但没有显示用户数据,也许我应该只 return 令牌,然后使用令牌发出另一个请求以获取有关已登录用户的信息。我能做什么?,谢谢

编辑:

@OA\Response(
     *          response="200", 
     *          description="An example resource", 
     *          @OA\JsonContent(
     *              type="object", 
     *              @OA\Property(
     *                  format="string", 
     *                  default="20d338931e8d6bd9466edeba78ea7dce7c7bc01aa5cc5b4735691c50a2fe3228", 
     *                  description="token", 
     *                  property="token"
     *              ),
     *              @OA\Property(
     *                  format="application/json", 
     *                  property="user",
     *                  @OA\JsonContent(ref="#/components/schemas/UserResource") 
     *              )
     *          ),     
     *     )

我试过了,但显示错误

你删除的 JsonContent 应该是 属性 我认为第一个 JsonContent

非常接近,除了...

  • 使用 'format' 而不是 'type'
  • 如果您的 属性 已经包含在 @OA\JsonContent
  • 中,则您不必指定内容类型
  • 你需要小心多余的尾随 ',';学说可以挑剔

这是我的作品 stand-alone(缺失的 @OA\Info 除外):

<?php

use OpenApi\Annotations\OpenApi as OA;

/**
 * @OA\Schema
 */
class LoginRequest{}

/**
 * @OA\Schema
 */
class UserResource{}

/**
 * Handle an incoming authentication request.
 *
 *
 * @OA\Post(
 *     tags={"UnAuthorize"},
 *     path="/login",
 *     summary="User Login",
 *     @OA\RequestBody(
 *          @OA\MediaType(
 *              mediaType="application/json",
 *              @OA\Schema(
 *                  type="object",
 *                  ref="#/components/schemas/LoginRequest"
 *              )
 *          )
 *     ),
 *     @OA\Response(
 *          response="200",
 *          description="An example resource",
 *          @OA\JsonContent(
 *              type="object",
 *              @OA\Property(
 *                  type="string",
 *                  default="20d338931e8d6bd9466edeba78ea7dce7c7bc01aa5cc5b4735691c50a2fe3228",
 *                  description="token",
 *                  property="token"
 *              ),
 *              @OA\Property(
 *                  property="user",
 *                  ref="#/components/schemas/UserResource"
 *              )
 *          )
 *     ),
 *     @OA\Response(response="401", description="fail")
 * )
 *
 */
class Controller {}