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

в 23:31, , рубрики: laravel, laravel 4, php, метки: ,

С каждым днем 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 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');
	}
}
таблица "expenses"

<?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

Источник

Поделиться

* - обязательные к заполнению поля