web-dev-qa-db-ja.com

FosUserBundleで管理者ユーザーを作成する

次のコマンドを使用して、コマンドウィンドウからFOsUserBundleを使用して管理者ユーザーを作成しようとしています。

php app/console fos:user:create

私のプロジェクトでは、管理者ユーザーが他のユーザーを必須の権限で拡張します。したがって、ユーザー名、メール、パスワードを選択すると、次のように表示されます。

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'latitude' cannot be null

AdminUserで値「latitude」を設定するにはどうすればよいですか? PUGXMultiUserBundleも使用しています。

13

私にそれを到達させるための唯一の可能な方法は

1 -_Command/CreateUserCommand.php_に配置されたFOSUserBundleのc​​liコマンドをオーバーライドします
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

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()の動作を再定義しています

Symfony2でメソッドをオーバーライドするにはどうすればよいですか?

前に私の答えで言ったように、あなたはあなたのバンドルをあなたがオーバーライドしようとしている関数(その場合はFOSUserBundle)を含むバンドルの子にする必要があります。あなたがそれをしたら、 バンドルのResourcesディレクトリを使用して、必要なことを実行します。 オーバーライドする必要のある関数を含むクラスに到達するまで、元のバンドルの「ツリーフォルダー構造」(つまり、フォルダーの同じ名前)を再現します。

実際の例に従ってください。_Command/CreateUserCommand.php_に含まれるexecute()関数をオーバーライドする必要があります。バンドルフォルダに次のパスを作成する必要があります。

_PathTo/YourCostumBundle/Command/
_

上に示した内容をファイル_CreateUserCommand.php_内に配置します。

私がそのパスをどこで見つけたかわからない場合は、FOSUserBundleコードを見てください。それは完全に明確になります!

FOSUserBundleコードを直接変更するのはなぜ危険ですか?

さて、私があなたに示すことができる批評家のポイントにはたくさんの答えがあります。メインの選択(重要度の順序はありません):

  • FOSUserBundleを更新する必要がある場合はどうなりますか? composerを使用し、FOSUserBundleコードに加えたすべての変更を失います
  • FOSUserBundleを使用する必要のあるバンドルがプロジェクトに複数ある場合はどうなりますか?たぶん、カスタム動作はバンドルには意味がありますが、他のバンドルには意味がありません。ローカルバンドルレベルで動作をコスチューム化すると、FOSUserBundleロジックをそのまま維持するのに役立ちます
  • 他のユーザーと共有したいバンドルを開発している場合はどうなりますか?コスチューム化された独自のFOSUserBundleバージョンを「取得」し、更新について警告するように強制する必要があります。

最後に:私はあなたのエンティティがintoFOSUserBundleではないことを完全に知っていますが、FOSUserBundleベースユーザーを拡張しているので、上記の内容が適用可能であることは間違いありませんあなたの場合。

あいまいさが減ったことを願っています:)


ドキュメント: http://symfony.com/doc/current/cookbook/bundles/inheritance.html#overriding-controllers

14
DonCallisto