# Request Bodies

Generate a request body with this command:

php artisan openapi:make-requestbody StoreUser

You can refer to a schema by implementing use Vyuldashev\LaravelOpenApi\Contracts\Reusable on the schema and adding it to the request body like so:

class UserCreateRequestBody extends RequestBodyFactory
{
    public function build(): RequestBody
    {
        return RequestBody::create('UserCreate')
            ->description('User data')
            ->content(
                MediaType::json()->schema(UserSchema::ref())
            );
    }
}

RequestBodyFactory::build() must return a RequestBody builder. Request body content uses MediaType builders, and media type schemas use Schema builders.

Use a request body in your controller like this:

use Vyuldashev\LaravelOpenApi\Attributes as OpenApi;

class UserController extends Controller
{
    /**
     * Create a user.
     */
    #[OpenApi\Operation(tags: ['user'])]
    #[OpenApi\RequestBody(factory: UserCreateRequestBody::class)]
    public function store(Request $request)
    {
    }
}

# Form Content And Encoding

Use MediaType::formUrlEncoded() or another media type builder for form request bodies. Encoding entries are keyed by property name:

use Vyuldashev\LaravelOpenApi\Builders\Encoding;
use Vyuldashev\LaravelOpenApi\Builders\Header;
use Vyuldashev\LaravelOpenApi\Builders\MediaType;
use Vyuldashev\LaravelOpenApi\Builders\RequestBody;
use Vyuldashev\LaravelOpenApi\Builders\Schema;

return RequestBody::create('UploadAvatar')
    ->required()
    ->content(
        MediaType::formUrlEncoded()
            ->schema(
                Schema::object()->properties(
                    Schema::string('avatar')->format(Schema::FORMAT_BINARY),
                ),
            )
            ->encoding(
                Encoding::create('avatar')
                    ->contentType('image/png')
                    ->headers(
                        Header::create('X-Upload-Token')->schema(Schema::string()),
                    ),
            ),
    );

Encoding supports contentType(), headers(), style(), explode(), and allowReserved().