А совсем недавно вышла бета-версия четвертой версии фреймворка, которая кардинально отличается от предыдущей.
Под влиянием восторженных отзывов в англоязычных блогах, я решил написать небольшое приложение на основе 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 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'); } }
<?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/
Добавить комментарий