私は以下のようなシナリオを持っています:クライアント自身がインストールできるアプリケーションがあり、すべてのウェブホストがコンソールアクセスを提供するわけではないので、クライアントはブラウザ経由でアプリケーションをインストールして更新できる必要があります。 (例えばPiwikのの更新プロセスに似ている)Symfony:ブラウザ経由のユーザーテーブルの移行
特定のコントローラでコマンドを実行は問題ありません:現在、このルートはアプリのすべてのユーザーが開始することができないような構成を経由して無効にすることができ
// src/CoreBundle/Controller/UpdateController.php
public function updateAction()
{
$application = new Application($this->get('kernel'));
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'doctrine:migrations:migrate',
'--no-interaction',
));
$output = new BufferedOutput();
$application->run($input, $output);
return $this->render('system/update.html.twig', [
'dump' => $output->fetch()
]);
}
管理者のみが更新されます。 (将来的には、ルートアクセスを管理者アカウントに制限する必要があります)
問題が戦場に出たときに、ユーザーテーブルの追加移行:できるだけ早くこのフィールドはユーザエンティティに追加されるよう
// app/Resources/DoctrineMigrations/Version20160926090600.php
public function up(Schema $schema)
{
$this->addSql('ALTER TABLE `user` ADD `gender` tinyint(1) unsigned NOT NULL DEFAULT 0');
}
、 doctrineがセッション/セキュリティコンテキストのアカウントデータを入力するためにuser.gender
からデータを取得しようとするため、Webアクセスが失敗します。
この問題を回避する方法はありますか?特定のルートのユーザーテーブルからデータを取得できないようにすることはできますか?あるいは、後者の場合は、/route
にアクセスするために認証が必要な場合は動作しません。セッションの処理にいくつかのカラムだけをフェッチするように指示できますか?
また、コントローラ経由でアップデートを処理する必要がある場合は、ユーザーテーブルの内容を変更しないでください。
現在security.yml
security:
providers:
appuser:
entity:
class: CoreBundle:User
firewalls:
default:
anonymous: ~
http_basic: ~
provider: appuser
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false