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:

  1. Doctrine::ATTR_MODEL_LOADING – określa sposób ładowania modeli. Wybrane ustawienie „conservative” ładuje modele wtedy, gdy są potrzebne.

  2. Doctrine::ATTR_EXPORT – co ma być eksportowane do bazy. Opcja EXPORT_ALL gwarantuje nam, że w bazie, oprócz samej struktury, zostaną także utworzone klucze obce i relacje.

  3. 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.

  4. 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.