Skip to content

Use PHP8 return type instead of annotations  #6776

@dennismetz

Description

@dennismetz

API Platform version(s) affected:
I currently use api-platform/symfony in version 4.0.6

Description
The PHP8 return data type of the method is ignored. Only the old notation for annotations is taken into account.
You then get an error message when you call the whole thing via the API platform: Unexpected non-iterable value for to-many relation.

How to reproduce
I call a collection in my entity and only want to return a single item or null from it.

	#[Groups(['Vehicles', 'readVehicle'])]
	public function getDriver(): null|VehiclesDriver // null|VehiclesDriver is completly ignored
	{
		if (0 < count($this->getVehiclesDriver()))
			foreach ($this->getVehiclesDriver() as $driver)
				return $driver;
		return null;
	}

Possible Solution
Currently you can fix the error by returning the return type in the annotation.

	/**
	 * @return VehiclesDriver|null
	 */
	#[Groups(['Vehicles', 'readVehicle'])]
	public function getDriver(): null|VehiclesDriver
	{
		if (0 < count($this->getVehiclesDriver()))
			foreach ($this->getVehiclesDriver() as $driver)
				return $driver;
		return null;
	}

Activity

soyuka

soyuka commented on Nov 6, 2024

@soyuka
Member

I expect this is an issue from symfony? But it's weird, what property info extractor are registered on your project?

stale

stale commented on Jan 5, 2025

@stale

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

dennismetz

dennismetz commented on Feb 4, 2025

@dennismetz
Author

Sorry for the late reply.
We have only implemented the standard Symfony/Doctrine/API Platform features.

We had the problem again today, only with a lot more “add” and “get” methods.

reopened this on Feb 4, 2025
soyuka

soyuka commented on Feb 5, 2025

@soyuka
Member

Could you help tracking this by checking values at https://github.com/api-platform/core/blob/main/src/Metadata/Property/Factory/PropertyInfoPropertyMetadataFactory.php#L48-L59 ? (remove your cache if you don't hit these lines)

I need to know if this needs fixing in symfony or in our codebase, thanks!

dennismetz

dennismetz commented on Feb 5, 2025

@dennismetz
Author

I will definitely get to the foreach:

Image
Image

I hope this helps.

dennismetz

dennismetz commented on Feb 5, 2025

@dennismetz
Author

I just tested again whether I can get into the foreach, but I can't get in at the moment.

Image
Image

EDIT:
I have done the tests with and without the annotations, but both lead to the same result.

With the annotations, however, the call works in the frontend without the error message “Unexpected non-iterable value for to-many relation”.

soyuka

soyuka commented on Feb 6, 2025

@soyuka
Member

since symfony/symfony#57617 got merged, can you try #6947 ?

dennismetz

dennismetz commented on Feb 6, 2025

@dennismetz
Author

I have just tested it, but I still get the error when I remove the annotations.
With the annotations it works.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @dunglas@soyuka@dennismetz

        Issue actions

          Use PHP8 return type instead of annotations · Issue #6776 · api-platform/core