11

Sonata User Bundleを拡張し、新しいユーザーエンティティにいくつかの追加フィールドを作成しています。これらのフィールドは、ユーザーの下のSonata管理領域内でのみ更新されるため、プロファイルの編集フォームで使用できる必要はありません。Sonata User Managerを介してこれらのフィールドを更新するのに問題があり、Application \ Sonata\UserBundleでそのクラスを拡張/実装するためのいくつかの異なる方法を試しました。誰かが以前にこれに遭遇したことがあり、新しいユーザーエンティティを拡張するための最もクリーンな方法のチュートリアルまたはステップバイステップのプロセスを教えてくれますか?

4

3 に答える 3

30

1.新しいバンドルを作成します

AcmeUserBundleのようなもの。通常どおりに作成して登録します。

2.新しいユーザーエンティティを作成します

次に、とを拡張するUserエンティティGroupを作成Sonata\UserBundle\Entity\BaseUserしますSonata\UserBundle\Entity\BaseGroup。たとえば、主キーの構成も追加する必要があります。

/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
    /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;
}

3.エンティティを構成します

次に、app/config/config.ymlファイルに移動して、次の新しいエンティティを構成します。

sonata_user:
    class:
        user: Acme\UserBundle\Entity\User
        group: Acme\UserBundle\Entity\Group

4.UserAdminクラスをオーバーライドします

次に、新しいUserAdminクラスを作成する必要があります。これを行うにはUserAdmin、バンドル内に新しいクラスを作成し、Sonata\UserBundle\Admin\Model\UserAdmin次のようにメソッドを拡張してオーバーライドします。

namespace Acme\UserBundle\Admin;

use Sonata\UserBundle\Admin\Model\UserAdmin as SonataUserAdmin;

class UserAdmin extends SonataUserAdmin
{
    /**
        * {@inheritdoc}
        */
    protected function configureFormFields(FormMapper $formMapper)
    {
        parent::configureFormFields($formMapper);

        $formMapper
            ->with('new_section')
                ->add(...)
                // ...
            ->end()
        ;
    }
}

5.古いUserAdminクラスを置き換えます

次に、Sonataが新しいUserAdminクラスを使用していることを確認する必要があります。パラメータを新しいクラスに設定するだけsonata.user.admin.user.classで、準備が整います。

# app/config/config.yml
parameters:
    sonata.user.admin.user.class: Acme\UserBundle\Admin\UserAdmin
于 2013-03-25T21:21:12.993 に答える
7

私はその問題が教義の問題であることに気づきました。私の拡張バンドルは、元のxmlフィールドマッピングを利用していました。それらのファイルを削除し、注釈に戻しました。そこからすべてが見事に機能しました。これが同じ問題を経験している他の誰かに役立つことを願っています。

于 2013-04-02T16:09:37.483 に答える
0

これは簡単ですが、SonataUserBundleドキュメントはこれについてかなり短いです。基本的に、ここここで説明されているように2つのバンドルを設定した後:

Sonata\UserBundle\Entity\BaseUserでクラスを拡張するクラスを作成する必要がありますSonataUserBundle。コンストラクターをオーバーライドする場合でも、親オブジェクトのコンストラクターを呼び出す必要があることに注意してください。

namespace Your\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityManager;
use Sonata\UserBundle\Entity\BaseUser as BaseUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="user",indexes={@ORM\Index(name="username_idx", columns={"username"})})
 */

class User extends BaseUser {

    public function __construct()
    {
        parent::__construct();
        // your code here
    }

    /**
     * @ORM\Column(type="string")
     */
    protected $firstName = "";

    public function getFirstName() {
        return $this->firstName;
    }

    public function setFirstName($firstName) {
        $this->firstName = $firstName;
    }
}

必要に応じて、Sonata\UserBundle\Entity\BaseGroup同様の方法でオブジェクトをオーバーライドすることもできます。

config.yml次に、このように名前空間に一致するように編集します

# FOS User Bundle Configuration
fos_user:
    user_class: Your\Bundle\Entity\User
    # To also override the Group object
    # group:
    #     group_class: Your\Bundle\Entity\Group

# Sonata User Bundle configuration
sonata_user:
    class:
        user:               Your\Bundle\Entity\User
        # To also override the Group object
        # group:              Your\Bundle\Entity\Group

キャッシュをクリアします。組み込みのエンティティの代わりにエンティティが使用されます。

于 2013-03-25T21:14:45.713 に答える