Статьи

Почему Laravel берет сообщество PHP от Storm

Я должен признать: в какой-то момент я чувствовал себя немного плохо на языке PHP. Ряд острых статей о ненависти к PHP циркулировал в сети как вирус, а некоторые из его флагманских сред, таких как CodeIgniter, быстро устарели. В то же время Ruby on Rails, казалось, лидировал в плане инноваций и простоты разработки. Время шло, и я все больше и больше тянулся к своему инструментальному поясу Руби.

Но однажды я обнаружил новую элегантную структуру под названием Laravel. Сначала я отклонил это как еще один клон Синатры, который быстро уменьшится в ничто, поскольку ведущий разработчик отказался от него. Но, тем не менее, неделя за неделей мои социальные сети были в шоке, восхваляя читаемость Ларавела. «Может быть, — подумал я, — что PHP наконец-то имеет по-настоящему современный фреймворк».

Узнайте больше о Laravel на http://laravel.com

Я больше не хотел сидеть в стороне; пришло время окунуться. Год спустя, и я один из его крупнейших евангелистов. Laravel снова делает PHP забавным! Более того, я больше не верю, что PHP навсегда обречен на в основном личные сайты и уродливые блоги WordPress. Нет; На самом деле, это убеждение автора в том, что благодаря Laravel, Composer и PHP 5.5 мы переживаем очередной ренессанс самого популярного в сети серверного языка.

Чтобы установить последнюю версию разработки Laravel (v4), вам необходимо сначала установить Composer. Затем просто клонируйте репо и установите зависимости. git clone git://github.com/illuminate/app.git myApp и composer install . Вы готовы к работе!


Большинство разработчиков PHP начинают свой путь с того, что вкладывают бесчисленные строки SQL прямо в свой фригидный, нечитаемый PHP. Само собой разумеется, исключая самые основные веб-сайты, это быстро приводит к неразрешимому беспорядку.

Помните, когда вы впервые услышали о Ruby on Rails ActiveRecord? В конце концов, Eloquent — это лучшая реализация.

Нужны примеры?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
// Fetch all tasks
$tasks = Task::all();
 
// Fetch the task with an id of 1
$task = Task::find(1);
 
// Update a task
$task = Task::find(1);
$task->title = ‘Put that cookie down!’;
$task->save();
 
// Create a new task
Task::create([
    ‘title’ => ‘Write article’
]);
 
// Delete a task
Task::find(1)->delete();

Люди, невозможно написать более читаемый код на PHP! Теперь было бы одно, если бы Eloquent только позволял вам выполнять базовые операции CRUD над таблицей, но это, конечно, не так.

Рассмотрим отношения таблицы, такие как пользователь и его / ее соответствующие задачи. В Laravel, после установки быстрого метода поиска для каждой модели, мы можем легко обрабатывать отношения один-к-одному или любую связь по этому вопросу. Вот несколько примеров, чтобы подогреть аппетит.

1
2
3
4
5
6
7
8
9
// Get all tasks by the author with an id of 1
$tasks = User::find(1)->tasks;
 
// Get the author of a task
$author = Task::find(5)->user()->username;
 
// Insert a new task by author
$task = new Task([ title: ‘Go to store.’ ]);
User::find(1)->tasks()->insert($task);

Нетрудно считать Eloquent лучшей реализацией ActiveRecord на языке PHP.


Начиная с Laravel 4 (в настоящее время в Alpha), весь фреймворк будет модульным и доступен в виде отдельных пакетов Composer.

Composer — это система упаковки для PHP, которая похожа на PEAR, но лучше. Это делает процесс управления зависимостями максимально простым.

Подумайте о существующей рамочной экосистеме. Прямо сейчас вы вынуждены жить с базовым набором функций каждого фреймворка. Вы не можете, скажем, использовать Eloquent в приложении CakePHP. Как вы можете себе представить, эта истина привела к безумному процессу переизобретения колеса снова и снова … и снова.

Дамы и господа, будущее PHP — модульное. Зачем устанавливать раздутый, массивный фреймворк, когда вам требуется только несколько его предложений? Ну, скоро тебе не придется. Требуется только Eloquent в простом проекте? Хорошо — не проблема вообще! Просто установите его через Composer и двигайтесь дальше!

Итак, если мы переходим к более модульному миру PHP, основанному на пакетах, как вписывается Laravel? Ну, подумайте об этом как о заранее определенной коллекции пакетов, завернутых в лук! Еще лучше, если вам нужно обновить систему до последней версии, это так же просто, как запустить composer update .

В качестве примера гибкости, которую это обеспечивает, давайте добавим популярную библиотеку тестирования Mockery в приложение Laravel. Начните с нового проекта Laravel 4 и отредактируйте его файл composer.json чтобы он требовал Mockery.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
{
    «require»: {
        «illuminate/foundation»: «>=1.0.0»,
        «mockery/mockery»: «dev-master»
    },
    «autoload»: {
        «classmap»: [
            «app/controllers»,
            «app/models»,
            «app/database/migrations»,
            «app/tests/TestCase.php»
        ]
    }
}

Обратитесь к Packagist.org за списком доступных пакетов Composer, а также инструкциями по установке.

Теперь, когда мы сообщили Composer, что наше приложение требует Mockery, мы можем установить соответствующие зависимости.

1
composer update

Вот и все! Теперь мы можем использовать Mockery в наших тестах. Это сила Composer и Laravel 4 в работе! У нас есть колеса; давайте прекратим создавать новые! Сотни и сотни пакетов доступны через Packagist.org.

1
2
3
4
5
<?php
 
use Mockery as m;
 
class ExampleTest extends PHPUnit_Framework_TestCase {}

Сотни и сотни пакетов доступны через Packagist.org.


Большинство начинающих разработчиков PHP не знакомы ни с чем, кроме самой естественной системы маршрутов. Создайте дерево каталогов, соответствующее вашему желаемому URI, и двигайтесь дальше. Например, добавьте файл index.php в следующий каталог: blog/admin/ , и теперь вы можете получить к нему доступ, перейдя по localhost:8888/blog/admin/index.php . Легко! Ну, может быть, сначала; но вы, вероятно, обнаружите, что вам нужно больше гибкости и контроль над тем, какой маршрут запускается в вашем приложении.

Laravel использует невероятно простой и удобный в использовании подход к маршрутизации. В качестве примера напишем необходимый маршрут для отображения представления профиля пользователя.

1
2
3
4
5
6
7
8
Route::get(‘users/{id}’, function($id) {
    // find the user
    $user = User::find($id);
 
    // display view, and pass user object
    return View::make(‘users.profile’)
        ->with(‘user’, $user);
});

Теперь, когда пользователь запрашивает example.com/users/1 , представление users/profile.php будет отображено.

В качестве альтернативы, мы можем использовать традиционные контроллеры для обработки логики.

1
Route::get(‘users/{id}’, ‘Users@show’);

Теперь за визуализацию будет отвечать Controllers/Users.php , в частности, метод show .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?php
 
class UsersController extends Controller {
    /**
     * Display the specified resource.
     */
    public function show($id)
    {
        // find the user
        $user = User::find($id);
 
        // display view, and pass user object
        return View::make(‘users.profile’)
            ->with(‘user’, $user);
    }
}

Почти любое веб-приложение по существу потребует некоторой формы аутентификации. Laravel предоставляет простой, но простой в использовании интерфейс для аутентификации пользователей.

Начните с создания таблицы users с необходимыми полями для имени username и password . Помните: это идеальный вариант использования для миграции!

Затем Laravel может attempt войти в систему пользователя — возможно, на основе предоставленных пользователем значений из формы.

Вот основной пример, за исключением аспекта проверки.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
Route::post(‘login’, function()
{
    $credentials = array(
        ‘username’ => Input::get(‘username’),
        ‘password’ => Input::get(‘password’)
    );
 
    // perform validation
 
    if ( Auth::attempt($credentials) )
    {
        // Credentials match.
        return Redirect::to(‘admin/profile’);
    }
});

Обратите внимание, что за кулисами Laravel автоматически хеширует предоставленный пароль и сравнивает его с тем, что хранится в таблице users .

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

1
$user = Auth::user()->username;

Согласитесь: отправка электронной почты через ваше приложение всегда сложнее, чем должно быть. Больше не в Laravel 4!

Построенный поверх популярного пакета SwiftMailer, вы теперь найдете новый файл config/mail.php в своем приложении. Здесь вы можете указать необходимые учетные данные для вашего провайдера электронной почты. Вот урезанная версия того, что вы найдете:

01
02
03
04
05
06
07
08
09
10
11
<?php
// app/config/mail.php
 
return array(
    ‘host’ => ‘smtp.example.com’,
    ‘port’ => 2525,
    ‘from’ => array(‘address’ => null, ‘name’ => null),
    ‘encryption’ => ‘tls’,
    ‘username’ => null,
    ‘password’ => null,
);

Просто замените значения значениями с вашего почтового сервера, соответственно.

Далее нам нужно посмотреть на электронную почту. Давайте создадим один с именем welcome.blade.php , который будет использоваться при регистрации нового участника на нашем фан-сайте Джастина Бибера.

01
02
03
04
05
06
07
08
09
10
11
<?php
// app/views/emails/welcome.blade.php
 
<html>
    <body>
        Hi there, {{ $user->name }}.
 
        Thanks,
        Management
    </body>
</html>

Теперь, когда все готово, настроим необходимый пример маршрута и отправим электронное письмо.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Route::get(‘/’, function()
{
    $user = User::find(1);
    $data = [ ‘user’ => $user ];
 
    // email view, data for view, closure to send email
    Mail::send(’emails/welcome’, $data, function($message) use($user)
    {
        $message
            ->to($user->email)
            ->subject(‘Welcome Bieber Fan!’)
            ->attach(‘images/bieberPhoto.jpg’);
    });
 
    return ‘Welcome email sent!’;
});

Довольно просто, а? Мы берем нового пользователя из таблицы и отправляем электронное письмо на связанный с ним адрес электронной почты. Благодаря функциональности SwiftMailer, выполнение, казалось бы, сложных действий, таких как прикрепление файлов, становится несложным делом! Теперь каждый новый участник получает фото Джастина Бибера при регистрации. Отлично!


«Backbone обеспечивает структуру для вашего грязного кода спагетти!»

Laravel 4 делает процесс создания RESTful API максимально простым для человека. Ключ в том, как по умолчанию JSON будет возвращен из маршрута.

Давайте представим, что нам нужно вернуть список всех пользователей в формате JSON. Ну, Чак, мы можем сделать это в одной строке.

1
2
3
4
Route::get(‘users’, function()
{
    return User::all();
});

Если вы запустите этот маршрут, будет отображаться немного JSON, например:

1
[{«id»:1,»username»:»[email protected]»},{«id»:2,»username»:»[email protected]»}]

Хотите знать, где поле password ? В Laravel, в связанной с таблицей модели, мы можем указать через свойство $hidden , какие поля скрыть от вывода JSON.

Теперь, с помощью библиотеки JavaScript, такой как Backbone, мы можем легко получать эти данные.

01
02
03
04
05
06
07
08
09
10
var User = Backbone.Model.extend({});
var UsersCollection = Backbone.Collection.extend({
    model: User,
    url: ‘/users’
});
 
var users = new UsersCollection;
users.fetch();
 
users.toJSON();

А как насчет получения одного пользователя вместо этого? Что ж, нам сначала нужно настроить правильный маршрут Laravel:

1
2
3
Route::get(‘users/{id}’, function($id) {
    return User::find($id);
});

Как мы узнали, это вернет JSON для запрошенного пользователя (без password ). Далее мы создаем модель Backbone и извлекаем данные.

1
2
3
4
5
6
var User = Backbone.Model.extend({
    urlRoot: ‘/users’
});
 
var user = new User({ id: 1 });
user.fetch();

Заметьте, как основная тяжесть работы лежит на стороне клиента? Наш код Laravel настолько прост, насколько это возможно.


Если вы являетесь исключительно разработчиком PHP, скорее всего, вы еще не испытали радости от миграций, которые впервые были популяризированы средой Ruby on Rails.

Думайте о миграциях как о контроле версий для вашей базы данных. Что произойдет, если на следующий день после того, как вы добавили это новое поле в таблицу tasks , вы поняли, что в конце концов оно не нужно. Ну, вы бы вручную удалили поле, верно? Но как насчет других разработчиков в вашей команде? Их код может сломаться, если вы им не скажете!

Однако в случае миграций мы просто откатываем предыдущую миграцию и продолжаем наш день! Более того, при внесении изменений на ваш сервер простая команда php artisan migrate автоматически обновит вашу производственную базу данных. В сочетании с Laravel Schema Builder это делает процесс управления базами данных максимально простым.

Давайте создадим миграцию, чтобы добавить новую таблицу users в нашу базу данных. Из командной строки:

1
php artisan migration:make create_users_table —table=users —create

В приведенном выше фрагменте мы указываем имя таблицы, а также флаг --create , чтобы указать, что мы создаем новую таблицу, а не модифицируем существующую.

Эта команда создаст новый файл миграции в нашем приложении. Затем мы можем использовать класс Schema Laravel для подготовки схемы нашей таблицы.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
use Illuminate\Database\Migrations\Migration;
 
class CreateTasksTable extends Migration {
    /**
     * Run the migrations.
     */
    public function up()
    {
        Schema::create(‘tasks’, function($table)
        {
            $table->increments(‘id’);
            $table->string(‘title’);
        });
    }
 
    /**
     * Reverse the migrations.
     */
    public function down()
    {
        Schema::drop(‘tasks’);
    }
}

Обратите внимание, что этот класс предлагает два метода: up и down , которые определяют, какое действие Laravel должен выполнить при выполнении миграции, а также откат ее назад.

В этом случае с помощью up() мы создаем новую таблицу tasks и указываем два поля для id и title задачи соответственно. Откатывая миграцию, мы просто опускаем стол.

Запустите миграцию, вернувшись в Терминал и введя:

1
php artisan migrate

Это оно! Теперь у вас есть новая таблица tasks с двумя полями! … Оу, нужно откатить его обратно? Просто:

1
php artisan migrate:rollback

До свидания таблица tasks .


Шаблонный движок Laravel’s Blade обеспечивает чистый синтаксис для представлений. Например, с обычным PHP, чтобы отфильтровать список людей и отобразить их соответствующие имена в элементе списка, мы могли бы написать:

1
2
3
4
5
<ul>
    <?php foreach($people as $p) : ?>
        <li><?php echo $p;
    <?php endforeach;
</ul>

Этот синтаксис может применяться к большинству управляющих структур PHP.

Это не так уж плохо, но мы можем сделать лучше. Любое представление Laravel, которое содержит .blade.php файла .blade.php будет проанализировано, соответственно. В результате предыдущий фрагмент может быть заменен следующим:

1
2
3
4
5
<ul>
    @foreach($people as $p)
        <li>{{ $p }}</li>
    @endforeach
</ul>

Обратите внимание, как переменные, которые должны отображаться, оборачиваются внутри {{ }} , подобно тому, что вы найдете в шаблонизаторе JavaScript, например, Handlebars.

Клинок также может быть использован для элегантных макетов и мастер-страниц. Давайте создадим базовое главное представление, чтобы продемонстрировать эту функциональность.

01
02
03
04
05
06
07
08
09
10
11
12
// views/layout.blade.php
<!doctype html>
<html>
<head>
    <title></title>
</head>
<body>
    <div class=»container»>
        @yield(‘container’)
    </div>
</body>
</html>

Линия @yield является ключевой. Это указывает, что любые дочерние представления с id раздела container должны быть вложены туда.

Давайте затем создадим новый вид.

1
2
3
4
5
6
// views/home/hello.blade.php
@layout(‘layout’)
 
@section(‘container’)
    <h1>Hello, {{ $user->name }}!</h1>
@endsection

Выполнено! Простые мастер-страницы в PHP!


Без небольшой помощи создание службы RESTful в PHP может оказаться несколько сложным. Ну, в Laravel 4 это не может быть проще. Фреймворк предлагает то, что мы называем Restful Resources. Давайте проверим это.

В вашем файле routes укажите новый ресурс.

1
Route::resource(‘tasks’, ‘TasksController’);

Эта строка кода обозначает, что мы хотим создать новый ресурс, tasks и разместить контроллер TasksController отвечающий за обработку логики для каждого маршрута.

Следуя принципам REST, этот ресурс автоматически регистрирует маршруты для:

  • ПОЛУЧИТЬ задачи (Показать все задачи)
  • GET tasks / {id} (Показать одну задачу)
  • GET tasks / create (Показать форму для создания нового задания)
  • POST задачи (Создать новую задачу)
  • ПОЛУЧИТЬ задачу / {id} / edit (Редактировать одну задачу)
  • PUT tasks / {id} (Обновить задачу)
  • УДАЛИТЬ задачи / {id} (Удалить задачу)

Далее, давайте создадим этот TasksController , но вместо того, чтобы делать это вручную, мы позволим Artisan обрабатывать шаблон.

1
php artisan controller:make TasksController

Это создаст новый controllers/TasksController.php и заполнит его небольшим шаблоном.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 
class TasksController extends Controller {
    /**
     * Display a listing of the resource.
     */
    public function index() {}
 
    /**
     * Show the form for creating a new resource.
     */
    public function create() {}
 
    /**
     * Store a newly created resource in storage.
     */
    public function store() {}
 
    /**
     * Display the specified resource.
     */
    public function show($id) {}
 
    /**
     * Show the form for editing the specified resource.
     */
    public function edit($id) {}
 
    /**
     * Update the specified resource in storage.
     */
    public function update($id) {}
 
    /**
     * Remove the specified resource from storage.
     */
    public function destroy($id) {}
}

Каждый из этих методов будет запущен при запуске соответствующего маршрута RESTful. Итак, чтобы отобразить форму для создания новой task , мы бы загрузили соответствующее представление в методе create , которое будет запущено при запросе example.com/tasks/create . Эта форма должна POST to /tasks , в этом случае будет запущен метод store .

Это не может быть чище!

Обратитесь к странице UserScape Vimeo для последних официальных скринкастах Laravel.


Сколько раз вам приходилось вручную «заполнять» таблицу базы данных фиктивными записями для целей тестирования? Для меня это большое количество! Laravel 4 позволяет нам указать seed файл для таблицы.

Чтобы попробовать, создайте новый файл с тем же именем, что и у соответствующей таблицы, в каталоге app/database/seeds вашего приложения. Этот файл должен хранить массив массивов, каждый из которых содержит необходимые пары ключ-значение. Вот пример:

1
2
3
4
5
6
7
8
<?php
// app/database/seeds/tasks.php
 
return [
    [ ‘title’ => ‘Go to the store’ ]
    [ ‘title’ => ‘Finish Laravel article’ ]
    [ ‘title’ => ‘Pick up eggs.’
]);

Теперь мы описали три новые строки для таблицы tasks в нашей базе данных. Давайте посеем это.

1
php artisan db:seed

Выполнено!


Вероятно, существует множество действий, которые вы часто запускаете при установке или получении поля из таблицы базы данных. Например, когда пользователь регистрируется, чтобы следовать рекомендациям по безопасности, мы всегда должны хэшировать его пароль. Вместо того, чтобы выполнять работу вручную, давайте вместо этого обновим модель User и уточним, что при установке пароля его сначала следует хэшировать.

1
2
3
4
5
6
7
8
9
<?php
// models/User.php
 
class User extends Eloquent {
    public function setPassword()
    {
        return Hash::make( $this->password );
    }
}

Легко! Теперь нам не нужно беспокоиться об этой части головоломки при регистрации нового пользователя. Естественно, доступна и обратная опция, если вам нужно обработать значение поля перед его получением.

Что если нам нужно предварительно указать временную метку или имя? Это также может быть достигнуто с помощью модели, если вы хотите.

1
2
3
4
5
6
7
8
9
<?php
// models/User.php
 
class User extends Eloquent {
    public function fullName()
    {
        return $this->firstName .
    }
}

Этот новый метод fullName() теперь будет доступен для нашего пользовательского экземпляра.

1
echo User::find(1)->fullName();

Возможно, более важный, чем что-либо еще, Laravel за относительно короткий промежуток времени накопил процветающее евангельское сообщество, в состав которого входят одни из самых влиятельных разработчиков в сообществе PHP.

Почему это важно? Просто: с евангелизацией приходит и образование, и вклад. Самым большим препятствием для новой платформы является распространение информации и демонстрация людям, как использовать чертову штуку! К счастью, Laravel отлично справляется с документацией и обучающими программами / скринкастами по всему Интернету — включая ваш истинный полный курс!

Узнайте все подробности Laravel здесь, в Tuts + Premium!

Правда в том, что мы едва поцарапали поверхность того, что возможно в Laravel. Мы еще не рассмотрели обработку ошибок Laravel, интеграцию с PHPUnit, активную загрузку (до и после получения коллекций) и многое другое. Обязательно ознакомьтесь с фантастической документацией, чтобы глубже вникнуть во фреймворк, и следите за официальным выпуском Версии 4!

Популярное сообщество Nettuts + предлагает несколько учебных пособий по Laravel .

Если эта статья послужила стимулом для вашей вновь обретенной любви к PHP и Laravel, возможно, вы захотите посетить первую ежегодную конференцию Laracon (конференцию), запланированную на конец февраля 2013 года в Вашингтоне, округ Колумбия. Возможно, я увижу вас там !

Первая в истории конференция Laravel, Laracon, состоится в Вашингтоне, округ Колумбия, 22-23 февраля 2013 года. Узнайте больше на http://conference.laravel.com