Kdyby/Doctrine, inicializace zakladnich dat v databazi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ja
Člen | 260
+
0
-

Ahoj,
jak resite v doctrine kdyz naklonujete projekt a chcete mit v databazi nejake predpripravene zaznamy? Napr. zakladniho admin uzivatele, nebo treba nejake predpripravene texty v CMSku? Asi bych mohl udelat dump s inserty, ale to mi neprijde moc ‚doctrine-way‘.

Jak to resite vy?

Moc diky:)
Ja

Lukeluha
Člen | 130
+
0
-

Nevidím důvod, proč toto uměle cpát přes Doctrine :) dle mého bohatě stačí dump, netřeba vymýšlet zbytečnosti :)

Oli
Člen | 1215
+
+3
-

Přesně takhle http://zlml.cz/…-si-databazi thx. @mrtnzlml :-)

Ja
Člen | 260
+
0
-

@Oli: jej, ja jsem tenhle clanek uz pred casem cetl a vubec jsem si na nej nevzpomnel. diky moc!

Azathoth
Člen | 495
+
0
-

podle mne jsou fixtures zbytečný overkill. já mám zkrátka službu, která mi umí vytvořit iniciální data a vytvořím si nějaký init kdyby/command, kůve kterém pouze zavolám tu jednu inicializační metodu té služby. Taky jsem si četl ten článek od Zlámala, ale pak mi přišlo, že fixture je v mém případě zbytečný mezičlánek a nepotřebuji to tam.

Tomáš Votruba
Moderator | 1114
+
0
-

K tomu muzes vyuzit migrace, ktere stejne pak budes potrebovat na zmeny ci pridavani dat.

Ja
Člen | 260
+
0
-

@Azathoth: souhlasim, ze je to overkill pokud mas vzdy stejnou db, pokud ale pouzivas mysql+postgre, tak to zacina davat smysl

@TomášVotruba: Jj, na to se chystam uz dlouho ale nejak jsem se jeste neodhodlal se tim prokousat. Jak se vlastne ta tva integrace lisi od migraci v Kdyby/Doctrine?

newPOPE
Člen | 648
+
0
-

V podstate su asi 2 mozne stavy projektu

  1. novy – tu proste pouzijes migracie (Doctrine, Phinx, DbUp, …)
  2. rozbehnuty – tu si urobis prvu migraciu (ja pouzivam len setup data nie klientske) ktora je vlastne dump DB. A nasledne pouzivas migracie z 1.

No a ked tie DB zacnu mat par desiatok GB tak tam uz sa to riesi inak.

Tomáš Jablonický
Člen | 115
+
0
-

Osobně bych si vytvořil pro Command Isntall, kde by byli základní data. Pak bych použil Fixtures pro naplnění DB.

Editoval Tomáš Jablonický (10. 9. 2015 16:57)

Tomáš Votruba
Moderator | 1114
+
0
-

@Ja Jake jsou migrace v Kdyby/Doctrine?

Jeste existuji fixtures, ty se hodi pro testovaci databaze.

Azathoth
Člen | 495
+
0
-

@TomášVotruba doctrine migrations
@Ja jde mi o to, že když už mám stejně v modelu třídu na přidání admina, protože admin může přidávat další adminy, tak pak vypadá můj command na inicializaci například takhle:

	protected function execute(InputInterface $input, OutputInterface $output)
	{
		/** @var IAdminCreator $adminCreator */
		$adminCreator = $this->getHelper('container')->getByType(IAdminCreator::class);
		$adminCreator->createAdmin('name', 'surname', 'login', 'password');
		return 0;
	}

a mám to i bez fixtures…

Tomáš Votruba
Moderator | 1114
+
0
-

@Azathoth Ty Kdyby\Doctrine ale neintegruje, stačí mrknout na composer.

Proto odkazuju na Zenify\DoctrineMigrations.

Ja
Člen | 260
+
0
-

@TomášVotruba zkousim ty tve DoctrineMigrations a nedari se mi to rozjet, konzole mi vubec nevraci prikazy pro migrations (php ./www/index.php), mam tam akorat klasicke prikazy pro doctrine orm:schema-tool, atd.
Navic se teda pres composer nestahl ten Symnedi\EventDispatcher\DI\EventDispatcherExtension – je potreba pro chod doctrinemigrations, nebo dokonce muze to byt pricinou, proc ty migrace vubec nevidim v konzoli?

moc diky

Ja

jiri.pudil
Nette Blogger | 1034
+
0
-

@Ja smazal jsi cache? Konzole totiž standardně běží v produkčním režimu

Tomáš Votruba
Moderator | 1114
+
0
-

@Ja Jak jsi balíček instaloval? Vypadá to, že používáš vývojovou dev-master. Používej poslední stabilní verzi. Composer ti ji vybere sám:

composer require zenify/doctrine-migrations

Editoval Tomáš Votruba (12. 9. 2015 15:32)

Ja
Člen | 260
+
+1
-

@jiri.pudil tywe, nette pouzivam asi tisic let, a todle me dycky prekvapi, to uz snad neni mozny :) moc diky, jede :)

@TomášVotruba musim rict, ze s composerem se docela jeste peru, ale tak nejak jsem dogooglil, ze bych mohl do composer.json dat neco v tomto smyslu „zenify/doctrine-migrations“: „~2.0“ – a nakonec fungovalo

Tomáš Votruba
Moderator | 1114
+
0
-

@Ja Jasně. Instalaci přes composer require x/y je mnohem lepší, jelikož vybere za tebe nejnovější funkční verzi. Jsem rád, že ti to jede.

Ja
Člen | 260
+
+1
-

@TomášVotruba ajo, ted koukam, ze composer require modifikuje i stavajici composer.json, tak perfektni, moc diky

Ja
Člen | 260
+
0
-

@TomášVotruba jeste dotaz prosim, jak doporucujes spoustet migraci na produkcnim sdilenem hostingu, kde neni k dispozice konzole? (nebo obecne prikazy dostupny v ramci kdyby/console?)

David Matějka
Moderator | 6445
+
0
-

Muzes si pro consoli vytvorit nejaky jiny rozhrani, ve zkratce:

  1. injectnes Symfony\Component\Console\Application
  2. jako vstup pouzijes ArrayInput
  3. jako vystup treba BufferedOutput
  4. a spustis prikaz na application metodou run
Ja
Člen | 260
+
0
-

@DavidMatějka tak uz to bastlim, jeste jsem si neco k tomu dogooglil, ale vykixl jsem na tomto:

<?php
Kdyby\Console\UnknownCommandException
There are no commands defined in the "orm:schema-tool" namespace.
?>

injectnul jsem si teda \Kdyby\Console\Application (ale zkousel jsem predtim i tu symfonackou), ale bohuzel to failuje

<?php
$app = $this->kdyby_console_application;
$command = $app->find('orm:schema-tool:update');
?>

nemel bys tuseni, kde je chyba? Zkousel jsem to i predat jako ArrayInput(array(‚command‘ ⇒ ‚orm:schema-tool:update‘); a pri spusteni run() to vyhodi stejnou chybu

Editoval Ja (14. 9. 2015 20:18)

fidransky
Člen | 1
+
+1
-

Pro @Ja už je asi pozdě, ale pro případné další zájemce doplním, jak je možno chybu „There are no commands defined in the namespace“ řešit.

// zaregistruju command do Kdyby\Console\Application
$this->application->add(new SampleCommand);

// nastavím IO
$input = new ArrayInput([		// Symfony\Component\Console\Input\ArrayInput
	'command' => 'app:sample',	// command name
	'some-argument' => 'foo',	// argument
	'-v' => TRUE,				// option
]);
$output = new StringOutput;		// Kdyby\Console\StringOutput

// spustím
$this->application->run($input, $output);

// vypíšu výstup
Debugger::dump($output->getOutput());

Více podrobností zde a tady.

Editoval fidransky (19. 1. 2016 18:35)