Sonata User Bundleを拡張し、新しいユーザーエンティティにいくつかの追加フィールドを作成しています。これらのフィールドは、ユーザーの下のSonata管理領域内でのみ更新されるため、プロファイルの編集フォームで使用できる必要はありません。Sonata User Managerを介してこれらのフィールドを更新するのに問題があり、Application \ Sonata\UserBundleでそのクラスを拡張/実装するためのいくつかの異なる方法を試しました。誰かが以前にこれに遭遇したことがあり、新しいユーザーエンティティを拡張するための最もクリーンな方法のチュートリアルまたはステップバイステップのプロセスを教えてくれますか?
3 に答える
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
私はその問題が教義の問題であることに気づきました。私の拡張バンドルは、元のxmlフィールドマッピングを利用していました。それらのファイルを削除し、注釈に戻しました。そこからすべてが見事に機能しました。これが同じ問題を経験している他の誰かに役立つことを願っています。
これは簡単ですが、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
キャッシュをクリアします。組み込みのエンティティの代わりにエンティティが使用されます。