Blog tutorial – część 3

W poprzedniej części przygotowaliśmy strukturę bazy danych oraz przykładowe dane, które dodają użytkownika do bazy. Teraz przyszedł czas na pierwsze prace z CodeIgniterem – jeśli pracujesz z tym frameworkiem po raz pierwszy, to warto najpierw dowiedzieć się w jaki sposób przeprowadzić podstawową konfigurację.

Zazwyczaj, kod który przygotowaliśmy w poprzedniej części turorialu po prostu importowaliśmy do bazy danych, ale od jakiegoś czasu CodeIgniter udostępnia nam jeszcze inne podejście – migracje. Czy warto korzystać z tego rozwiązania? Jak najbardziej. Dzięki niemu w łatwy sposób możemy poruszać się między różnymi wersjami naszej bazy danych. Migracje odpowiadają przede wszystkim za definicję struktury bazy danych, ale mogą również dodawać domyślne (lub przykładowe) dane, na których będziemy pracować w aplikacji. Szczególnie w przypadku pracy grupowej, gdy zaczniemy wykorzystywać migracje, odczujemy zwiększenie komfortu pracy.

Jeśli chcemy zdefiniować nasze tabele za pomocą migracji, możemy to zrobić w następujący sposób. Najpierw należy przejść do pliku application/config/migration.php i ustawić zmienną $config['migration_enabled'] na TRUE, co spowoduje udostępnienie migracji dla naszej aplikacji. Dodatkowo, musimy też ustawić zmienną $config['migration_version'] na 3 – co określi liczbę plików migracji, które są dostępne. Oczywiście nie możemy zapomnieć o stworzeniu samej bazy danych i dodaniu odpowiednich ustawień do pliku konfiguracyjnego application/config/database.php. Po szczegóły zapraszam do podręcznika lub tego artykułu.

Teoretycznie, dobrą praktyką byłoby skorzystanie wyłącznie z klasy DB Forge, do definicji tabel w bazie danych, ale z racji tego, że posiada ona w tej chwili „lekkie” braki, posłużymy się po prostu wygenerowanym wcześniej kodem SQL.

Przejdźmy do kodu, który należy napisać – tworzymy plik 001_create_users.php w katalogu application/migrations (ten katalog również musimy stworzyć).

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Create_users extends CI_Migration 
{

	public function up()
	{
		return $this->db->query('
				CREATE  TABLE IF NOT EXISTS `blogtutorial`.`users` (
				  `id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT ,
				  `username` VARCHAR(50) NOT NULL ,
				  `email` VARCHAR(50) NOT NULL ,
				  `password` VARCHAR(40) NOT NULL ,
				  PRIMARY KEY (`id`) ,
				  INDEX `login_idx` (`email` ASC, `password` ASC) )
				ENGINE = InnoDB;
				');
	}

	public function down()
	{
		$this->dbforge->drop_table('users');
	}
}

Następnie stwórzmy kolejną migrację, która utworzy tabelę, w której będziemy przechowywać wpisy naszego bloga – 002_create_posts.php:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Create_posts extends CI_Migration 
{

	public function up()
	{
		return $this->db->query('
				CREATE  TABLE IF NOT EXISTS `blogtutorial`.`posts` (
				  `id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT ,
				  `title` VARCHAR(100) NOT NULL ,
				  `body` TEXT NOT NULL ,
				  `user_id` MEDIUMINT UNSIGNED NOT NULL ,
				  PRIMARY KEY (`id`) ,
				  INDEX `fk_posts_user_idx` (`user_id` ASC) ,
				  CONSTRAINT `fk_posts_users`
					FOREIGN KEY (`user_id` )
					REFERENCES `blogtutorial`.`users` (`id` )
					ON DELETE NO ACTION
					ON UPDATE NO ACTION)
				ENGINE = InnoDB;
				');
	}

	public function down()
	{
		$this->dbforge->drop_table('posts');
	}
}

I ostatnią, która stworzy przykładowego użytkownika 003_add_default_user.php:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Add_default_user extends CI_Migration 
{

	public function up()
	{
		return $this->db->query("INSERT INTO `users` VALUES (1, 'admin', 'admin@admin.dev', SHA1('admin'));");
	}

	public function down()
	{
		return $this->db->query("DELETE FROM `users` WHERE `id` = 1");
	}
}

Jak widać stworzyliśmy trzy pliki z migracjami, ale równie dobrze możemy stworzyć ich więcej lub mniej – ilość operacji na bazie danych wykonanych w danej migracji zależy tylko od nas.

No dobrze, jeśli mamy już gotowe pliki z migracjami, to wypadałoby je uruchomić. Niestety CodeIgniter nie posiada prostego narzędzia, które zautomatyzowałoby ten proces, ale nic nie stoi na przeszkodzie, aby za pomocą kilku linijek kodu, stworzyć bardzo prosty manager migracji ;) Zatem do dzieła – tworzymy plik application/controllers/migrations.php z poniższym kodem:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Migrations extends CI_Controller
{
	public function __construct()
	{
		parent::__construct();
		// Sprawdzamy, czy wywołanie klasy nie odbyło się z poziomu linii komend
		if ( ! $this->input->is_cli_request())
		{
			show_error("Aby skorzystac z migracji wykonaj polecenie z linii komend: php index.php migrations");
		}
		$this->load->library('migration');
	}

	/**
	 * Zwraca listę dostępnych komend wraz z opisem
	 *
	 * @access	public
	 */
	public function index()
	{
		print("\n\nDostepne sa nastepujace komendy:\n\n");
		print("php index.php migrations/latest - migruje baze danych do ostatniej wersji\n");
		print("php index.php migrations/version/:id - migruje baze danych do wybranej wersji (parametr :id nalezy zastapic numerem wersji migracji)\n");
	}

	/**
	 * Migruje bazę danych do ostatniej dostępnej wersji
	 *
	 * @access	public
	 */
	public function latest()
	{
		if ( ! $this->migration->current())
		{
			print($this->migration->error_string());
		}
		else
		{
			print("Poprawnie wykonano migracje bazy danych, do ostatniej dostepnej wersji.");
		}
	}

	/**
	 * Migruje bazę do wersji podanej w parametrze
	 *
	 * @access	public
	 * @param	int	Numer wersji
	 */
	public function version($number)
	{
		if ( ! $this->migration->version($number))
		{
			print($this->migration->error_string());
		}
		else
		{
			print("Poprawnie wykonano migracje bazy danych do wersji ". $number);
		}
	}

}
/* End of file migrations.php */
/* Location: ./application/controllers/migrations.php */

Za pomocą powyższego kodu, możemy w prosty sposób dokonać migracji do najnowszej wersji bazy danych – wystarczy wykonać polecenie z linii komend (będąc w głównym katalogu naszej aplikacji)
php index.php migrations/latest lub php index.php migrations/version/3
Jeśli nie zapomnieliśmy o dodaniu ustawień konfiguracyjnych bazy danych i wcześniejszym utworzeniu samej bazy, to wszystko powinno przebiec bez problemów.

W następnej części zajmiemy się logowaniem do naszego bloga.

3 komentarze do “Blog tutorial – część 3”

  1. witam !!!

    Jak uruchomić tą migrację ? Można jaśniej ?? Jak ją aktywować. Czy zrobienie migracji jest wymagane, aby codeigniter „widział” bazę ?

    Odpowiedz
    • Witaj.

      Korzystanie z migracji nie jest wymagane – zostało przedstawione jedynie jako dobra praktyka (w mojej opinii).

      Zawsze możesz „odpalić” kod SQL np. w phpMyAdmin lub zwyczajnie skorzystać z dostępnego tam interfejsu aby utworzyć bazę danych.

      Odpowiedz
      • wydaje się, że temat nt. MIGRACJI mógł zostać pominięty w tutorialu dla początkujących – sam jestem początkujący i ten temat na tą chwilę traktuję jedynie jako ciekawostkę, bardziej ciekawi mnie osiągnięcie pierwszych efektów i przekonanie się jakim narzędziem jest framework i jak go w ogóle zacząć używać… :)

        Odpowiedz

Dodaj komentarz

Ta strona używa Akismet do redukcji spamu. Dowiedz się, w jaki sposób przetwarzane są dane Twoich komentarzy.