0

I try to save initial value for user field in UserService entity. The reason is, I use this entity in EasyAdminBundle and when I build a form, I want to set a default value for user_id (ManyToOne to User entity).

  • init entity manager in constructor,
  • I override save method.
  • I get user from security session context and set to user service object, persist and flush.

...but I still can't see a change during save.

class UserServiceRepository extends ServiceEntityRepository
{

protected $_em;

public function __construct(RegistryInterface $registry)
{

    $this->_em = $this->entityManager;

    parent::__construct($registry, UserService::class);
}

// I override save method:
public function save(UserService $userService)
{
    // Get current user from security:
    $user = $this->get('security.token_storage')->getToken()->getUser();
    // set to useService...
    $userService->setUser($user);

        // and persist & flush:
        $this->_em->persist($userService);
        $this->_em->flush();


}
tolga
  • 2,462
  • 4
  • 31
  • 57

1 Answers1

1
// I override save method:

You're overriding non-existent method in parent, there's no save method in ServiceEntityRepository nor EntityRepository. So what's the main point of what you are doing and why you're setting default user_id in service repository?

UPDATE:

services:
    my.listener:
        class: UserServiceListener
        arguments:
            - "@security.token_storage"
        tags:
            - { name: doctrine.event_listener, event: prePersist }

Listener:

class UserServiceListener
{
    private $token_storage;

    public function __construct(TokenStorageInterface $token_storage)
    {
        $this->token_storage = $token_storage;
    }

    public function prePersist(LifeCycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if (!$entity instanceof UserService) {
           return;
        }

        $entity->setUser($this->token_storage->getToken()->getUser());
    }
}
alvery
  • 1,863
  • 2
  • 15
  • 35
  • Thanks. I use easyadminbundle...i defined a form for userservice....what i need is to set current user id as default in user_service – tolga Mar 27 '19 at 18:55
  • UserService object is a doctrine entity? The main idea for token storage is to retrieve user by token and restore session for it, but you want to persist related object, am i right. So EVERY time you initiate request - there will be write operation to your entity – alvery Mar 27 '19 at 19:05
  • Everytime I save a user_service, I want user_service.user_id to be equal to active user id of the logged in user. – tolga Mar 27 '19 at 19:19
  • Okay, got it. Look at the above code, you should create doctrine event listener with prePersist method for your UserService entity – alvery Mar 27 '19 at 19:27