Разработка с помощью Laravel 4. Часть 1

от автора

С каждым днем PHP-фреймворк Laravel набирает все больше и больше популярности, о чем говорит статистика репозитория на github и Google trends.

А совсем недавно вышла бета-версия четвертой версии фреймворка, которая кардинально отличается от предыдущей.

Под влиянием восторженных отзывов в англоязычных блогах, я решил написать небольшое приложение на основе Laravel 4. А заодно — поделится с вами подробным описанием процесса разработки, некоторыми наблюдениями и впечатлениями.
Во время разработки я постараюсь придерживаться идеологии Laravel, использовать встроенные библиотеки, ORM и шаблонизатор.

В первой части рассмотрим установку, настройку фреймворка и создание миграций базы данных.

Задача

Представьте, что мы работаем в офисе интернет-провайдера и нас попросили написать небольшое приложения для учета клиентов, их платежей и расходов. Идея не фонтан, но все же лучше, чем еще один блог.
Если что-то станет непонятно, итоговый результат можно подсмотреть на github по ссылке.

Установка

На сайте four.laravel.com скачиваем архив и распаковываем в нужную папку. Там же можно найти подробную документацию к фреймворку.

Скачиваем Composer в папку с приложением, устанавливаем зависимости:
php composer.phar install

и запускаем встроенный в PHP 5.4 сервер для разработки:
php artisan serve

Теперь наше приложение можно увидеть по адресу http://localhost:8000/.

Чтобы просмотреть все доступные команды штатной консольной утилиты laravel, введите php artisan.

База данных и миграции

Для начала нужно настроить параметры подключения к нашей базе данных в файле config/database.php, здесь трудностей возникнуть не должно.

В БД нашего приложения будет всего три таблицы:
clients — клиенты
pays — их платежи
expenses — и расходы.

Вот только закройте phpmyadmin — в Laravel есть удобный механизм миграций.
Зачем они нужны можно прочесть в этой статье

Создадим в БД служебную таблицу “migrations", это нужно проделать всего один раз:
php artisan migrate:install php artisan

Сгенерируем пустые «заготовки» для наших миграций:
php artisan migrate:make create_users_table
php artisan migrate:make create_pays_table
php artisan migrate:make create_expenses_table

Теперь в папке database/migrations появились три файла с примерно такими названиями:
2013_02_20_181013_create_clients_table.php
2013_02_20_200119_create_pays_table.php
2013_02_20_200127_create_expenses_table.php

В каждом из них находится класс с двумя пустыми методами: up() и down().
Наша задача — описать манипуляции со схемой БД в методе up(), а в методе down() — обратные действия.

В метод up() добавим:

Schema::create('clients', function($table) {     // первичный ключ с автоинкрементом     $table->increments('id');     $table->string('name');     $table->string('login');     $table->string('password');     // мак-адрес клиента, содержит ровно 12 символов.     // поэтому добавим в таблицу поле “mac” формата  varchar(12)     $table->string('mac', 12); }); 

В метод down():

// чтобы откатить эту миграцию, достаточно удалить таблицу 'clients' Schema::drop('clients'); 

После выполнения php artisan migrate в базе данных появится таблица ‘clients’ со структурой, которую мы только что описали в методе ‘up()’.

Таким же путем создадим остальные таблицы:

таблица "pays"

<?php  use Illuminate\Database\Migrations\Migration;  class CreatePaysTable extends Migration {  	/** 	 * Run the migrations. 	 * 	 * @return void 	 */ 	public function up() 	{         Schema::create('pays', function($table)         {             $table->increments('id');              // столбец с внешним ключем,             // связан со стобцом "id" таблицы "clients"             // при обновлении или удалении пользователя             // его платежи также удаляются             $table->integer('client_id')->unsigned();             $table->foreign('client_id')->references('id')->on('clients')                 ->onUpdate('cascade')                 ->onDelete('cascade');              // 6 цирф до запятой, две - после запятой             $table->float('amount', 6, 2)->unsigned();              // автоматически создает поля "created_at" и "updated_at"             $table->timestamps();         }); 	}  	/** 	 * Reverse the migrations. 	 * 	 * @return void 	 */ 	public function down() 	{ 	    Schema::drop('pays'); 	} } 
таблица "expenses"

<?php  use Illuminate\Database\Migrations\Migration;  class CreateExpensesTable extends Migration {  	/** 	 * Run the migrations. 	 * 	 * @return void 	 */ 	public function up() 	{         Schema::create('expenses', function($table)         {             $table->increments('id');              // столбец с внешним ключем,             // связан со стобцом "id" таблицы "clients"             // при обновлении или удалении пользователя             // его платежи также удаляются             $table->integer('client_id')->unsigned();             $table->foreign('client_id')->references('id')->on('clients')                 ->onUpdate('cascade')                 ->onDelete('cascade');              // 6 цирф до запятой, две - после запятой             $table->float('amount', 6, 2)->unsigned();              $table->string('cause');              // автоматически создает поля "created_at" и "updated_at"             $table->timestamps();         }); 	}  	/** 	 * Reverse the migrations. 	 * 	 * @return void 	 */ 	public function down() 	{ 		Schema::drop('expenses'); 	} } 

После создания всех миграций, выполним php artisan migrate еще раз, после чего в БД появятся еще две таблицы.

Если по какой-то причине нужно отменить последнюю миграцию, выполняем
php artisan migrate:rollback.
Чтобы отменить все миграции и вернуть базу данных в первоначальное состояние, используйте
migrate:reset.

Примечания

У меня в процессе разработки всплыло несколько неприятных моментов и багов (не забываем, что это бета-версия):

  • Чтобы переименовать папку ‘public’, нужно указать новый путь к ней в файле bootstrap/paths.php
  • Миграцию нельзя обернуть в транзакцию. Когда я попробовал добавить внешний ключ на несуществующий столбец, все сломалось. Нельзя было ни откатится назад, ни сбросить все миграции.
  • Конструкции вида $table->string('bar')->foobar(); не вызывают никаких предупреждений.
  • Когда ошибки все-таки возникают, они выводятся в консоль как HTML.
  • Отсутствие портянки из use-выражений в начале каждого файла (как у Zend и Symfony) возмущает IDE. В PHPStorm не работает автодополнение.

Ссылки

Ваше впечатление от статьи:

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Никто ещё не голосовал. Воздержавшихся нет.

ссылка на оригинал статьи http://habrahabr.ru/post/170289/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *