次のコマンドを使用して、コマンドウィンドウからFOsUserBundleを使用して管理者ユーザーを作成しようとしています。
php app/console fos:user:create
私のプロジェクトでは、管理者ユーザーが他のユーザーを必須の権限で拡張します。したがって、ユーザー名、メール、パスワードを選択すると、次のように表示されます。
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'latitude' cannot be null
AdminUserで値「latitude」を設定するにはどうすればよいですか? PUGXMultiUserBundleも使用しています。
私にそれを到達させるための唯一の可能な方法は
1 -_Command/CreateUserCommand.php
_に配置されたFOSUserBundle
のcliコマンドをオーバーライドします
2 -_Util/UserManipulator.php
_に配置されたFOSUserBundle
のユーザー作成メソッドをオーバーライドします
_// Command/CreateUserCommand.php
protected function execute(InputInterface $input, OutputInterface $output)
{
$username = $input->getArgument('username');
$email = $input->getArgument('email');
$password = $input->getArgument('password');
$inactive = $input->getOption('inactive');
$superadmin = $input->getOption('super-admin');
$latitude = $input->getOption('latitude'); //this will be your own logic add
$manipulator = $this->getContainer()->get('fos_user.util.user_manipulator');
$manipulator->create($username, $password, $email, $latitude, !$inactive, $superadmin);
$output->writeln(sprintf('Created user <comment>%s</comment>', $username));
}
_
そして
_// Util/UserManipulator.php
public function create($username, $password, $email, $latitude, $active, $superadmin)
{
$user = $this->userManager->createUser();
$user->setUsername($username);
$user->setEmail($email);
$user->setPlainPassword($password);
$user->setEnabled((Boolean) $active);
$user->setSuperAdmin((Boolean) $superadmin);
$user->setLatitude($latitude);
$this->userManager->updateUser($user);
return $user;
}
_
もちろん、私がオーバーライドと言うとき、私は意味します...オーバーライド:Pしたがって、FOSUserBundle
の元のファイルを変更する必要はありませんが(多くの理由で危険です)、バンドルをFOSUserBundle
バンドル「mainfile」(バンドルの登録に使用するもの)に、この行を追加するだけです。
_public function getParent()
{
return 'FOSUserBundle';
}
_
次に、ovverrideファイルが存在するツリー構造を元のバンドル、カスタムバンドルのResources /ディレクトリ(同じ位置、同じファイル名、同じ注釈がある場合)に再作成するだけで、魔法が始まります:) (これはビューにのみ有効です。注意してください!)
オーバーライドとは、既存の関数を取得し、他の場所で再定義して「シャドウ」することを意味します(phpはメソッドのオーバーロードをサポートしていないため、受け入れるパラメーターの数に関係なく、パラメーターのタイプに関係なく、同じ名前の関数を宣言します[あなたはいくつかの「ハック」をします])そしてあなたは元のものの代わりにそれを使うことができます。これは、関数に機能を追加したり、関数自体を変更したりするための一般的な手法です。
AとBの2つのクラスがあり、BはAの子クラスであるとします。また、AにはmyMethod()
というメソッドがあるとします。
Bでは次のようなことができます
_public function myMethod() {
parent::myMethod();
//add extra functionalities here
}
_
このようにして、親(「元の」)メソッドを呼び出しているときに追加の機能を追加してから、いくつかの追加の機能を実行します。
一方、Bの場合、次のようなものを作成します
public function myMethod(){//ここにいくつかのコードがありますが、親メソッドを呼び出していません}
myMethod()
の動作を再定義しています
前に私の答えで言ったように、あなたはあなたのバンドルをあなたがオーバーライドしようとしている関数(その場合はFOSUserBundle
)を含むバンドルの子にする必要があります。あなたがそれをしたら、 バンドルの オーバーライドする必要のある関数を含むクラスに到達するまで、元のバンドルの「ツリーフォルダー構造」(つまり、フォルダーの同じ名前)を再現します。Resources
ディレクトリを使用して、必要なことを実行します。
実際の例に従ってください。_Command/CreateUserCommand.php
_に含まれるexecute()
関数をオーバーライドする必要があります。バンドルフォルダに次のパスを作成する必要があります。
_PathTo/YourCostumBundle/Command/
_
上に示した内容をファイル_CreateUserCommand.php
_内に配置します。
私がそのパスをどこで見つけたかわからない場合は、FOSUserBundle
コードを見てください。それは完全に明確になります!
さて、私があなたに示すことができる批評家のポイントにはたくさんの答えがあります。メインの選択(重要度の順序はありません):
最後に:私はあなたのエンティティがintoFOSUserBundleではないことを完全に知っていますが、FOSUserBundleベースユーザーを拡張しているので、上記の内容が適用可能であることは間違いありませんあなたの場合。
あいまいさが減ったことを願っています:)
ドキュメント: http://symfony.com/doc/current/cookbook/bundles/inheritance.html#overriding-controllers