[Flow] Converting Objects by additional identity does not work?

Carsten Bleicker carsten at bleicker.de
Wed Mar 5 15:46:52 CET 2014


Thank you Alexander,
any further stuff stuff from me will walk into the issue:
http://forge.typo3.org/issues/56573


Am 05.03.2014 um 15:24 schrieb Alexander Berl <a.berl at outlook.com>:

> Hi Carsten,
> 
> I had to take some deep looks in the Flow code to understand, but I
> think I know what the problem is.
> 
> First of all, there is a difference between the persistence identifier
> (Persistence_Object_Identifier magic attribute or class attribute
> annotated with @ORM\Id) and an @Flow\Identity annotated attribute.
> The latter is not connected to the database primary key, but is
> supposedly used to identify entities by alternative unique attributes.
> 
> Now what happens in 2.) is this:
> 
> Since you don't use the identity route part handler in your route
> configuration, the external identity string is just forwarded directly
> to the property mapping/type converter.
> 
> However, the PersistentObjectTypeConverter expects a string type
> identifier to be the persistence identifier and tries to retrieve the
> object by that.
> This will obviously not match, as the primary key is the
> Persistence_Object_Identifer.
> 
> The PersistentObjectTypeConvert only falls back to retrieving the object
> by the additional identity when the value is an array.
> This may be arguable behaviour, but so far is supposed to work if you
> use the IdentityRoutePart configuration, to tell the Routing that you
> expect an entity that is given by its identifier, which would in turn be
> converted to array('__identity' => $value), so the TypeConverter would
> work as expected.
> 
> Now, there is another problem with the
> IdentityRoutePartHandler::getObjectIdentifierFromPathSegment:
> If you don't set an Uri pattern, it in turn will also try to check the
> given identity against the persistence identity (which again fails).
> If you do set an Uri pattern (or have your entity annotated with
> @Flow\Identity attributes), it only works if the route part is cached,
> e.g. you created an URI to that entity beforehand.
> 
> I guess that's something that has to be discussed with the core
> developers, as the behaviour is not quite consequent, but too deep to
> give a quick solution.
> 
> As for your actual problem I see two possible solutions:
> 1.) Use the identity route configuration. You'd need to pre-create the
> cache entries though, which might be problematic.
> 
> 2.) Completely skip the magic Persistence_Object_Identifier by
> annotating your external Id with @Orm\Id instead of @Flow\Identity
> 
> 
> Regards,
> Alexander
> 
> Am 05.03.2014 13:12, schrieb Carsten Bleicker:
>> Runnig a test in the frontend with a test action wich redirects me to the show action of a given artist works:
>> 
>> 1.) $this->redirect('show',array('resource' => $foo)) results in:
>> http://development.artmanager.local/foo/artist/test/fc700953-8911-9432-542e-968b7bff43e3
>> Status 200
>> 
>> 2.) $this->redirect('show',array('resource' => $foo->getForeignIdentity())) results in:
>> http://development.artmanager.local/foo/artist/test/5317133a3e1bb <-- foreignIdentity wich is also a @Flow\Identity
>> Status 500
>> #1297933823: Object with identity "5317133a3e1bb" not found.
>> 
>> 
>> Am 05.03.2014 um 12:14 schrieb Carsten Bleicker <carsten at bleicker.de>:
>> 
>>> hi folks,
>>> having an entity with the default flow persistence identity and also another identity:
>>> 
>>> // @Flow\Entity
>>> class Foo{
>>> 	
>>> 	/**
>>> 	* @var string
>>> 	* @Flow\Identity
>>> 	*/
>>> 	protected $foreignIdentity;
>>> 	
>>> }
>>> 
>>> 
>>> my routing:
>>> -
>>> 	name: 'Read Action with foreignIdentity as {foo}'
>>> 	uriPattern: 'rest/{foo}'
>>> 	httpMethods: ['GET']
>>> 	defaults:
>>> 		'@package':    'Foo.Bar'
>>> 		'@controller': 'Foo'
>>> 		'@action':     'read'
>>> 		'@format':     'json'
>>> 
>>> 
>>> I would expect that my controller receives the mapped entity, detected either by its foreignIdentity or by its flow_persistence_identifier.
>>> But only flow_persistence_identifier works.
>>> 
>>> Am i wron with my expectation?
>>> _______________________________________________
>>> Flow mailing list
>>> Flow at lists.typo3.org
>>> http://lists.typo3.org/cgi-bin/mailman/listinfo/flow
>> 
> _______________________________________________
> Flow mailing list
> Flow at lists.typo3.org
> http://lists.typo3.org/cgi-bin/mailman/listinfo/flow



More information about the Flow mailing list