4. Interfejs linii komend Doctrine
Doctrine pozwala zarządzać schematem bazy danych poprzez linię komend. W tym celu musimy napisać prosty skrypt, który uruchomi odpowiedni interfejs wchodzący w skład biblioteki oraz odpowiednio go skonfiguruje, podając parametry połączenia i ścieżki do katalogów. Zapiszemy go pod nazwą /tools/doctrine.php:
<?php $paths = array( 'data_fixtures_path' => '../doctrine/fixtures', 'models_path' => '../models', 'migrations_path' => '../doctrine/migrations', 'sql_path' => '../doctrine/sql', 'yaml_schema_path' => '../doctrine/schema' ); // Ustaw autoloader require_once('../libs/Doctrine.php'); spl_autoload_register(array('Doctrine', 'autoload')); // Wczytaj konfiguracje require('../config.php'); // Inicjuj Doctrine $conn = Doctrine_Manager::connection($config['database']['dsn']); $conn->setCharset($config['database']['charset']); foreach($config['database']['attributes'] as $attribute_name => $attribute_value) { $conn->setAttribute($attribute_name, $attribute_value); } $conn->setAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER, true); $conn->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); $manager = Doctrine_Manager::getInstance(); $manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL); $manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE); // Odpal interfejs linii komend. $cli = new Doctrine_Cli($paths); $cli->run($_SERVER['argv']);
W pierwszych linijkach podajemy ścieżki do katalogów ze schematami i innymi elementami struktury. Następnie inicjujemy autoloader, wczytujemy konfigurację bazy danych, nawiązujemy połączenie i w ostatnich linijkach włączamy właściwy interfejs. Aby zainicjować połączenie z bazą danych, korzystamy ze statycznej metody Doctrine_Manager::connection(), której przekazujemy tzw. DSN. Ma on postać:
silnik_bazodanowy://uzytkownik:haslo@host/baza
Zawiera on wszystkie informacje niezbędne do nawiązania połączenia, a ponadto może on wyglądać nieco inaczej dla innych systemów bazodanowych, stąd najlepiej jest wpisać go bezpośrednio bez rozdrabniania na mniejsze pola. Wyjaśnienie zastosowanych opcji konfiguracyjnych:
Doctrine::ATTR_MODEL_LOADING– określa sposób ładowania modeli. Wybrane ustawienie „conservative” ładuje modele wtedy, gdy są potrzebne.Doctrine::ATTR_EXPORT– co ma być eksportowane do bazy. OpcjaEXPORT_ALLgwarantuje nam, że w bazie, oprócz samej struktury, zostaną także utworzone klucze obce i relacje.Doctrine::ATTR_QUOTE_IDENTIFIER– ta opcja pozwala nam używać jako identyfikatorów słów kluczowych SQL-a, które zostaną odpowiednio oznaczone, zależnie od systemu bazodanowego.Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE– włącza automatyczne metody dostępowe, o których powiemy dalej.
Aby wszystko zadziałało, musimy również stworzyć plik konfiguracyjny: /config.php:
<?php $config = array( 'database' => array( 'dsn' => 'mysql://user:password@host/dbname', 'charset' => 'utf8', 'attributes' => array( 'use_native_enum' => true ) ) );
Teraz uruchamiamy wiersz poleceń (terminal) w naszym systemie operacyjnym. Musimy wpierw upewnić się, iż wie on, gdzie znajduje się interpreter PHP, wpisując po prostu
php –version
Jeżeli pokaże nam się numer wersji PHP, wszystko jest w porządku. W przeciwnym wypadku należy ustawić zmienną środowiskową PATH tak, aby wskazywała na katalog z PHP. Przejdźmy teraz do folderu z naszym interfejsem linii komend:
cd /sciezka/do/tools php doctrine.php build-all-reload
Komenda build-all-reload powoduje przeładowanie schematu bazy danych i wgranie go na nowo na podstawie istniejącego schematu. Przy okazji zwróćmy uwagę, że w /models pojawiło się kilka plików PHP odpowiadających tabelom w naszej bazie. To za ich pomocą będziemy manipulować. Po tej operacji struktura znajduje się już w bazie i możemy przystąpić do pisania skryptu.