Ich habe folgendes Szenario: Es gibt eine App, die von Clients selbst installiert werden kann und da nicht jeder Webhoster Konsolenzugriff bietet, müssen Clients in der Lage sein, die App über Browser zu installieren und zu aktualisieren. (Ähnlich den Update-Prozess von zB Piwik)Symfony: Migration der Benutzertabelle über Browser
Ausführen von Befehlen in bestimmten Controller ist kein Problem:
// 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()
]);
}
Derzeit kann dieser Weg über die Konfiguration deaktiviert werden, so dass nicht jeder Benutzer der App kann den Start Update, aber nur Admins. (In der Zukunft Route sollte den Zugang zu Admin-Konten begrenzt)
Das Problem kommt ins Spiel, wenn das Hinzufügen Migrationen für die Benutzertabelle:
// app/Resources/DoctrineMigrations/Version20160926090600.php
public function up(Schema $schema)
{
$this->addSql('ALTER TABLE `user` ADD `gender` tinyint(1) unsigned NOT NULL DEFAULT 0');
}
Sobald dieses Feld an die Benutzereinheit hinzugefügt wird, Der Webzugriff schlägt fehl, da die Doktrin versucht, Daten von user.gender
abzurufen, um die Kontodaten für den Sitzungs-/Sicherheitskontext zu füllen.
Gibt es eine Möglichkeit, dieses Problem zu umgehen? Ist es möglich, das Abrufen von Daten aus der Benutzertabelle für eine bestimmte Route zu deaktivieren? Oder noch besser, da letzteres nicht funktioniert, wenn eine Authentifizierung benötigt wird, um auf /route
zuzugreifen: Ist es möglich, die Sitzungsbehandlung zu veranlassen, nur ein paar Spalten zu holen?
Oder muss ich in der Benutzertabelle nie etwas ändern, wenn ich Updates über Controller bearbeiten muss?
Die aktuellen 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