2013-05-24 2 views
2

Я интегрирующую систему FileUpload с fosuserbundleКак переопределить FOSUserBundle/Doctrine/UserManager.php

мне нужно переопределить функцию updateUser в

/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Doctrine/UserManager.php 

Я скопировал этот файл

/ACME/UserBundle/Doctrine/UserManager.php 

Но это не сработает.

Это мой временного /vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Doctrine/UserManager.php

public function updateUser(UserInterface $user, $andFlush = true) 
{ 
    $this->updateCanonicalFields($user); 
    $this->updatePassword($user); 

    //it works but it should not be used here. 
    $user->upload(); 
    // 

    $this->objectManager->persist($user); 
    if ($andFlush) { 
     $this->objectManager->flush(); 
    } 
}  
+0

пожалуйста, просмотрите мой ответ и спросить, если что-то неясно, в противном случае принять :) – nifr

ответ

5

Вы не можете переопределить UserManager простого расслоения наследования, как вы пытались, поскольку он используется как сервис во всем FOSUserBundle.

Создание конфигурации службы в вашем пачке (т.е. services.xml) и добавить свой собственный сервис acme.user_manager:

<?xml version="1.0" encoding="UTF-8" ?> 

<container xmlns="http://symfony.com/schema/dic/services" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd" 
> 

    <parameters> 
     <parameter key="acme.user_manager.class">ACME/UserBundle/Doctrine/UserManager</parameter> 
    </parameters> 

    <services> 
     <service id="acme.user_manager" class="%acme.user_manager.class%" public="false"> 
      <argument type="service" id="security.encoder_factory" /> 
      <argument type="service" id="fos_user.util.username_canonicalizer" /> 
      <argument type="service" id="fos_user.util.email_canonicalizer" /> 
      <argument type="service" id="fos_user.entity_manager" /> 
      <argument>%fos_user.model.user.class%</argument> 
     </service> 
    </services> 
</container> 

Затем настройте FOSUserBundle использовать эту услугу, как UserManager в вашем config.yml

fos_user: 
    # ... 
    service: 
     user_manager: acme.user_manager 
+0

Спасибо! это работает! Я не уверен, как сделать сервис-скрипт, я постараюсь выяснить. – whitebear

0

Только что разрешили аналогичную проблему. Может быть, это будет полезно для кого-то. Symfony 3.3.6, FosUserBundle 2.0.1

services: 
    you_bundle.user_manager: 
     class: YourBundle\Services\UserManager 
     arguments: ["@fos_user.util.password_updater", "@fos_user.util.canonical_fields_updater", "@doctrine.orm.entity_manager", "%fos_user.model.user.class%"]