-
-
Notifications
You must be signed in to change notification settings - Fork 950
Open
Description
API Platform version(s) affected: 4.1
Description
Post operation for property of type float fails
How to reproduce
curl -X 'POST' \
'https://localhost/product/api/tests' \
-H 'accept: application/ld+json' \
-H 'Content-Type: application/json' \
-d '{
"price": 1.99
}'<?php
namespace App\Models;
use ApiPlatform\Laravel\Eloquent\Filter\DateFilter;
use ApiPlatform\Laravel\Eloquent\Filter\OrderFilter;
use ApiPlatform\Laravel\Eloquent\Filter\PartialSearchFilter;
use ApiPlatform\Metadata\ApiProperty;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Delete;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Patch;
use ApiPlatform\Metadata\Post;
use Illuminate\Database\Eloquent\Model;
use Symfony\Component\Serializer\Annotation\Groups;
#[ApiResource(
operations: [
new Get,
new Patch(),
new Delete(),
new Post(),
]
)]
#[GetCollection(
)]
#[ApiProperty(property: 'id')]
#[ApiProperty(property: 'price')]
/**
* @mixin IdeHelperProductVariant
*/
class Test extends Model
{
/**
* The attributes that are mass assignable.
*
* @var list<string>
*/
protected $fillable = [
'price',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'price' => 'float',
];
}
}<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('tests', function (Blueprint $table) {
$table->id()->primary();
$table->double('price');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('tests');
}
};Additional Context
{
"@context": "/api/contexts/Error",
"@id": "/api/errors/500",
"@type": "Error",
"trace": [
{
"file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
"line": 576,
"function": "createForUnexpectedDataType",
"class": "Symfony\\Component\\Serializer\\Exception\\NotNormalizableValueException",
"type": "::"
},
{
"file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
"line": 1315,
"function": "validateAttributeType",
"class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
"type": "->"
},
{
"file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
"line": 1085,
"function": "createAndValidateAttributeValue",
"class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
"type": "->"
},
{
"file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
"line": 530,
"function": "createAttributeValue",
"class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
"type": "->"
},
{
"file": "/app/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php",
"line": 398,
"function": "setAttributeValue",
"class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
"type": "->"
},
{
"file": "/app/vendor/api-platform/serializer/AbstractItemNormalizer.php",
"line": 260,
"function": "denormalize",
"class": "Symfony\\Component\\Serializer\\Normalizer\\AbstractObjectNormalizer",
"type": "->"
},
{
"file": "/app/vendor/api-platform/serializer/ItemNormalizer.php",
"line": 76,
"function": "denormalize",
"class": "ApiPlatform\\Serializer\\AbstractItemNormalizer",
"type": "->"
},
{
"file": "/app/vendor/symfony/serializer/Serializer.php",
"line": 240,
"function": "denormalize",
"class": "ApiPlatform\\Serializer\\ItemNormalizer",
"type": "->"
},
{
"file": "/app/vendor/symfony/serializer/Serializer.php",
"line": 145,
"function": "denormalize",
"class": "Symfony\\Component\\Serializer\\Serializer",
"type": "->"
},
{
"file": "/app/vendor/api-platform/state/Provider/DeserializeProvider.php",
"line": 103,
"function": "deserialize",
"class": "Symfony\\Component\\Serializer\\Serializer",
"type": "->"
},
{
"file": "/app/vendor/api-platform/laravel/JsonApi/State/JsonApiProvider.php",
"line": 36,
"function": "provide",
"class": "ApiPlatform\\State\\Provider\\DeserializeProvider",
"type": "->"
},
{
"file": "/app/vendor/api-platform/laravel/State/ValidateProvider.php",
"line": 50,
"function": "provide",
"class": "ApiPlatform\\Laravel\\JsonApi\\State\\JsonApiProvider",
"type": "->"
},
{
"file": "/app/vendor/api-platform/state/Provider/SecurityParameterProvider.php",
"line": 50,
"function": "provide",
"class": "ApiPlatform\\Laravel\\State\\ValidateProvider",
"type": "->"
},
{
"file": "/app/vendor/api-platform/laravel/State/ParameterValidatorProvider.php",
"line": 87,
"function": "provide",
"class": "ApiPlatform\\State\\Provider\\SecurityParameterProvider",
"type": "->"
},
{
"file": "/app/vendor/api-platform/state/Provider/ParameterProvider.php",
"line": 102,
"function": "provide",
"class": "ApiPlatform\\Laravel\\State\\ParameterValidatorProvider",
"type": "->"
},
{
"file": "/app/vendor/api-platform/laravel/State/AccessCheckerProvider.php",
"line": 45,
"function": "provide",
"class": "ApiPlatform\\State\\Provider\\ParameterProvider",
"type": "->"
},
{
"file": "/app/vendor/api-platform/state/Provider/ContentNegotiationProvider.php",
"line": 56,
"function": "provide",
"class": "ApiPlatform\\Laravel\\State\\AccessCheckerProvider",
"type": "->"
},
{
"file": "/app/vendor/api-platform/laravel/Controller/ApiPlatformController.php",
"line": 80,
"function": "provide",
"class": "ApiPlatform\\State\\Provider\\ContentNegotiationProvider",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php",
"line": 54,
"function": "__invoke",
"class": "ApiPlatform\\Laravel\\Controller\\ApiPlatformController",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php",
"line": 43,
"function": "callAction",
"class": "Illuminate\\Routing\\Controller",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
"line": 265,
"function": "dispatch",
"class": "Illuminate\\Routing\\ControllerDispatcher",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php",
"line": 211,
"function": "runController",
"class": "Illuminate\\Routing\\Route",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
"line": 822,
"function": "run",
"class": "Illuminate\\Routing\\Route",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 180,
"function": "{closure:Illuminate\\Routing\\Router::runRouteWithinStack():821}",
"class": "Illuminate\\Routing\\Router",
"type": "->"
},
{
"file": "/app/vendor/api-platform/laravel/ApiPlatformMiddleware.php",
"line": 47,
"function": "{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "ApiPlatform\\Laravel\\ApiPlatformMiddleware",
"type": "->"
},
{
"file": "/app/vendor/mcamara/laravel-localization/src/Mcamara/LaravelLocalization/Middleware/LaravelLocalizationRoutes.php",
"line": 21,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Mcamara\\LaravelLocalization\\Middleware\\LaravelLocalizationRoutes",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 137,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
"line": 821,
"function": "then",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
"line": 800,
"function": "runRouteWithinStack",
"class": "Illuminate\\Routing\\Router",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
"line": 764,
"function": "runRoute",
"class": "Illuminate\\Routing\\Router",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php",
"line": 753,
"function": "dispatchToRoute",
"class": "Illuminate\\Routing\\Router",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
"line": 200,
"function": "dispatch",
"class": "Illuminate\\Routing\\Router",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 180,
"function": "{closure:Illuminate\\Foundation\\Http\\Kernel::dispatchToRouter():197}",
"class": "Illuminate\\Foundation\\Http\\Kernel",
"type": "->"
},
{
"file": "/app/vendor/pidc/pidc-common/src/Middleware/LocalizeApi.php",
"line": 25,
"function": "{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Pidc\\Common\\Middleware\\LocalizeApi",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
"line": 21,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php",
"line": 31,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php",
"line": 21,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php",
"line": 51,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\TrimStrings",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php",
"line": 27,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Http\\Middleware\\ValidatePostSize",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php",
"line": 109,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php",
"line": 61,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Http\\Middleware\\HandleCors",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php",
"line": 58,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Http\\Middleware\\TrustProxies",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php",
"line": 22,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Middleware\\InvokeDeferredCallbacks",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php",
"line": 26,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 219,
"function": "handle",
"class": "Illuminate\\Http\\Middleware\\ValidatePathEncoding",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php",
"line": 137,
"function": "{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
"line": 175,
"function": "then",
"class": "Illuminate\\Pipeline\\Pipeline",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php",
"line": 144,
"function": "sendRequestThroughRouter",
"class": "Illuminate\\Foundation\\Http\\Kernel",
"type": "->"
},
{
"file": "/app/vendor/laravel/framework/src/Illuminate/Foundation/Application.php",
"line": 1220,
"function": "handle",
"class": "Illuminate\\Foundation\\Http\\Kernel",
"type": "->"
},
{
"file": "/app/public/index.php",
"line": 20,
"function": "handleRequest",
"class": "Illuminate\\Foundation\\Application",
"type": "->"
}
],
"type": "/errors/500",
"title": "An error occurred",
"status": 500,
"detail": "The type of the \"price\" attribute must be \"string\", \"double\" given."
}Metadata
Metadata
Assignees
Labels
No labels