С каждым днем 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()'.
Таким же путем создадим остальные таблицы:
<?php
use IlluminateDatabaseMigrationsMigration;
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');
}
}
<?php
use IlluminateDatabaseMigrationsMigration;
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 не работает автодополнение.
Ссылки
Автор: rsvasilyev