phpdoctrine-extensionsmezzio

How to set an user value in BlameableListener in a Zend Expressive application context?


How can I set an user value on Gedmo\Blameable\BlameableListener in a Zend Expressive application?

The event subscribers are successfully added to the EventManager (see configuration file). The TimestampableListener is working as expected.

/config/autoload/doctrine.local.php

<?php

declare(strict_types = 1);

use Gedmo\Blameable\BlameableListener;
use Gedmo\Timestampable\TimestampableListener;

return [
    'doctrine' => [
        // [..]
        'event_manager' => [
            'orm_default' => [
                'subscribers' => [
                    BlameableListener::class,
                    TimestampableListener::class,
                ],
            ],
        ],
    ],
];

backend/App/Entity/Role.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Blameable\Traits\BlameableEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;

/**
 * @ORM\Entity()
 * @ORM\Table(name="role")
 */
class Role
{
    use TimestampableEntity;
    use BlameableEntity;

    /**
     * @ORM\Id()
     * @ORM\Column(name="id", type="guid")
     * @ORM\GeneratedValue(strategy="UUID")
     * @var string
     */
    private $id;

    /**
     * @ORM\Column(name="name", type="string")
     * @var string
     */
    private $name;

    // [..]
}

In the documentation it states:

Note that you need to set the user on the BlameableListener (unless you use the Symfony2 extension which does automatically assign the current security context user).

I'm not sure how to implement it. Somewhere I should be able to define a callable or class which handles setting a user value, but how?


Solution

  • I solved this by defining a BlameableUserValueHandlerInterface. Which must be implemented and passed to the authentication middleware. The middleware provides the current identity to a BlameableUserValueHandler which assigns it to the user value in the BlameableListener.