Статьи

25 советов и хитростей Laravel

Не так давно был период, когда PHP и его сообщество были из-за отсутствия лучших слов ненавидимы. По-видимому, заголовок каждого дня был связан с тем, насколько ужасен PHP. Давайте посмотрим, какая новая статья в блоге, посвященная PHP, будет опубликована сегодня?

Да, к сожалению, сообщество и экосистема просто не были на том же уровне, что и другие современные языки.

Да, к сожалению, сообщество и экосистема просто не были на том же уровне, что и другие современные языки. Казалось, что PHP суждено было прожить доминирующую продолжительность жизни в виде грязных тем WordPress.

Но затем, что удивительно, все начало меняться — и тоже быстро. Как колдунья, размешивающая горшок, новые инновационные проекты начали появляться из ниоткуда. Возможно, наиболее заметным из этих проектов был Composer: менеджер окончательных зависимостей PHP (не похожий на Ruby’s Bundler или Node’s NPM). Если в прошлом разработчики PHP были вынуждены приводить PEAR в форму (это действительно кошмар), то теперь, благодаря Composer, они могут просто обновить файл JSON и сразу получить желаемую зависимость. Профилировщик здесь, рамки тестирования там … все за секунды

В переполненном мире фреймворков PHP, когда CodeIgniter начал истощаться, фреймворк Тейлора Отвелла возник из пепла и стал любимцем сообщества. При таком простом и элегантном синтаксисе создание приложений с использованием Laravel и PHP стало просто досадным развлечением! Кроме того, с 4-й версией фреймворка, в значительной степени использующего Composer, казалось, что в конечном итоге все стало на свои места для сообщества.


Хотите миграции (контроль версий для вашей базы данных)? Выполнено. Как насчет мощной реализации Active-Record? Конечно, Eloquent отлично справится с задачей. А как насчет средств тестирования? Конечно. А пойдут? Несомненно. Как насчет высоко проверенного уровня HTTP? Благодаря Composer Laravel может использовать многие из превосходных компонентов Symfony. Когда дело доходит до дела, скорее всего, если вам это нужно, Laravel предлагает это.


В то время как PHP раньше не отличался от игры Jenga — всего в одном блоке и не разваливался на части — внезапно, благодаря Laravel и Composer, будущее не могло выглядеть более светлым. Так что вытащите несколько оттенков и покопайтесь во всем, что может предложить фреймворк.


Laravel предлагает одну из самых мощных реализаций Active-Record в мире PHP. Допустим, у вас есть таблица orders вместе с моделью Order Eloquent:

1
class Order extends Eloquent {}

Мы можем легко выполнить любое количество запросов к базе данных, используя простой и элегантный PHP. Не нужно разбрасывать грязный SQL по комнате. Давайте захватить все заказы.

1
$orders = Order::all();

Выполнено. Или, может быть, эти заказы должны быть возвращены в порядке, в соответствии с датой выпуска. Это легко:

1
$orders = Order::orderBy(‘release_date’, ‘desc’)->get();

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

1
2
3
$order = new Order;
$order->title = ‘Xbox One’;
$order->save();

Законченный! С Laravel задачи, которые раньше были громоздкими, до смешного просты.


Laravel уникален тем, что его можно использовать разными способами. Предпочитаете более простую, более похожую на Синатру систему маршрутизации? Несомненно, Laravel может предложить это довольно легко, используя замыкания.

1
2
3
4
5
Route::get(‘orders’, function()
{
    return View::make(‘orders.index’)
        ->with(‘orders’, Order::all());
});

Это может оказаться полезным для небольших проектов и API, но высока вероятность того, что вам понадобятся контроллеры для большинства ваших проектов. Это нормально; Ларавел тоже может это сделать!

1
Route::get(‘orders’, ‘OrdersController@index’);

Выполнено. Обратите внимание, как Laravel растет с вашими потребностями? Этот уровень размещения делает систему такой же популярной, как сегодня.


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

01
02
03
04
05
06
07
08
09
10
11
12
13
class Task extends Eloquent {
    public function user()
    {
        return $this->belongsTo(‘User’);
    }
}
 
class User extends Eloquent {
    public function tasks()
    {
        return $this->hasMany(‘Task’);
    }
}

И с этим мы закончили! Давайте возьмем все задачи для пользователя с идентификатором 1. Мы можем сделать это в две строки кода.

1
2
$user = User::find(1);
$tasks = $user->tasks;

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

1
2
$task = Task::find(1);
$user = $task->user;

Часто бывает полезно связать форму с моделью. Очевидный пример этого — когда вы хотите отредактировать некоторую запись в вашей базе данных. С помощью привязки модели формы мы можем мгновенно заполнить поля формы значениями из связанной строки таблицы.

01
02
03
04
05
06
07
08
09
10
11
{{ Form::model($order) }}
    <div>
        {{ Form::label(‘title’, ‘Title:’) }}
        {{ Form::text(‘title’) }}
    </div>
 
    <div>
        {{ Form::label(‘description’, ‘Description:’) }}
        {{ Form::textarea(‘description’) }}
    </div>
{{ Form::close() }}

Поскольку форма теперь связана с конкретным экземпляром Order , входные данные будут отображать правильные значения из таблицы. Просто!


Слишком много запросов к базе данных, и очень быстро ваше приложение может стать как патока. К счастью, Laravel предлагает простой механизм для кэширования этих запросов, используя всего лишь один вызов метода.

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

1
$questions = Question::remember(60)->get();

Это оно! Теперь в течение следующего часа запросов страниц этот запрос останется в кэше, а база данных не будет затронута.


Вы столкнетесь с ситуациями, когда для нескольких представлений требуется определенная переменная или фрагмент данных. Хорошим примером этого является панель навигации, которая отображает список тегов.

Слишком сдерживая контроллеры как можно меньше, Laravel предлагает композиторам представления управлять такими вещами.

1
2
3
4
View::composer(‘layouts.nav’, function($view)
{
    $view->with(‘tags’, [‘tag1’, ‘tag2’]);
});

С этим фрагментом кода каждый раз, когда layouts/nav.blade.php представление layouts/nav.blade.php , у него будет доступ к переменной $tags , равной указанному массиву.


Laravel использует очень простой подход к аутентификации. Просто передайте массив учетных данных, которые, вероятно, извлечены из формы входа в систему, в Auth::attempt() . Если предоставленные значения соответствуют тому, что хранится в таблице users , пользователь сразу войдет в систему.

01
02
03
04
05
06
07
08
09
10
$user = [
    ’email’ => ’email’,
    ‘password’ => ‘password’
];
 
if (Auth::attempt($user))
{
    // user is now logged in!
    // Access user object with Auth::user()
}

Что делать, если нам нужно выйти из системы — возможно, при ударе по URI /logout ? Это тоже легко.

1
2
3
4
5
6
Route::get(‘logout’, function()
{
    Auth::logout();
     
    return Redirect::home();
});

Работать RESTful в Laravel никогда не было проще. Чтобы зарегистрировать находчивый контроллер, просто вызовите Route::resource() , например так:

1
Route::resource(‘orders’, ‘OrdersController’);

С этим кодом Laravel зарегистрирует восемь маршрутов.

  • GET / заказы
  • GET / orders /: order
  • GET / заказы / создание
  • GET / orders /: order / edit
  • POST / заказы
  • PUT / orders /: order
  • PATCH / orders /: order
  • УДАЛИТЬ / заказы /: заказ

Кроме того, сопутствующий контроллер может быть сгенерирован из командной строки:

1
php artisan controller:make OrdersController

В этом сгенерированном контроллере каждый метод будет соответствовать одному из указанных выше маршрутов. Например, /orders будет отображаться на метод index , /orders/create будет create и т. Д.

Теперь у нас есть необходимые возможности для создания приложений и API-интерфейсов RESTful.


Хотя да, PHP по своей природе является языком шаблонов, он не стал слишком хорошим. Это нормально, хотя; Laravel предлагает свой двигатель Blade, чтобы заполнить пробел. Просто назовите ваши представления с расширением .blade.php , и они будут автоматически проанализированы, соответственно. Теперь мы можем делать такие вещи как:

1
2
3
4
5
6
7
@if ($orders->count())
    <ul>
        @foreach($orders as $order)
            <li>{{ $order->title }}</li>
        @endforeach
    </ul>
@endif

Поскольку Laravel использует Composer, мы мгновенно имеем встроенную поддержку PHPUnit. Установите фреймворк и запустите phpunit из командной строки, чтобы проверить его.

Более того, Laravel предлагает несколько помощников для наиболее распространенных типов функциональных тестов.

Давайте проверим, что домашняя страница возвращает код состояния 200.

1
2
3
4
5
public function test_home_page()
{
    $this->call(‘GET’, ‘/’);
    $this->assertResponseOk();
}

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

01
02
03
04
05
06
07
08
09
10
11
12
public function test_contact_page_redirects_user_to_home_page()
{
    $postData = [
        ‘name’ => ‘Joe Example’,
        ’email’ => ’email-address’,
        ‘message’ => ‘I love your website’
    ];
 
    $this->call(‘POST’, ‘/contact’, $postData);
 
    $this->assertRedirectedToRoute(‘home’, null, [‘flash_message’]);
}

В рамках Laravel 4.1, выпуск которого запланирован на ноябрь 2013 года, вы можете легко написать команду Artisan для SSH на свой сервер и выполнить любое количество действий. Это так же просто, как использовать фасад SSH :

1
2
3
4
SSH::into(‘production’)->run([
    ‘cd /var/www’,
    ‘git pull origin master’
]);

Передайте массив команд методу run() , а Laravel обработает все остальное! Теперь, поскольку имеет смысл выполнять подобный код как команду Artisan, вам нужно всего лишь запустить php artisan command:make DeployCommand и вставить соответствующий код в метод команды fire для быстрого создания специальной команды развертывания!


Laravel предлагает элегантную реализацию шаблона наблюдателя, который вы можете использовать в своих приложениях. Слушайте нативные события, такие как illuminate.query или даже огонь, и ловите свои собственные.

Разумное использование событий в приложении может оказать невероятное влияние на его удобство обслуживания и структуру.

1
2
3
4
5
Event::listen(‘user.signUp’, function()
{
    // do whatever needs to happen
    // when a new user signs up
});

Как и большинство вещей в Laravel, если вы вместо этого предпочитаете ссылаться на имя класса, а не на закрытие, вы можете сделать это свободно. Laravel затем разрешит его из контейнера IoC.

1
Event::listen(‘user.signUp’, ‘UserEventHandler’);


По мере роста приложения может быть трудно увидеть, какие маршруты были зарегистрированы. Это особенно верно, если должный уход не был предоставлен вашему файлу routes.php (т.е. неявная маршрутизация).

Laravel предлагает полезную команду routes , которая отображает все зарегистрированные маршруты, а также методы контроллера, которые они запускают.

1
php artisan routes

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

Зачем заставлять пользователя ждать этих действий, когда мы можем вместо этого выбросить их в фоновый режим?

1
Queue::push(‘SignUpService’, compact(‘user’));

Возможно, самая захватывающая часть в том, что Laravel блестяще предлагает поддержку push-очередей Iron.io. Это означает, что даже без унции опыта «работника» или «демона» мы все равно можем использовать силу очередей. Просто зарегистрируйте конечную точку URL-адреса, используя полезную команду php artisan queue:subscribe Laravel php artisan queue:subscribe , и Iron.io будет пинговать выбранный вами URL-адрес каждый раз, когда задание добавляется в очередь.


Простые шаги для повышения производительности!


Когда требуется проверка (а когда нет), Laravel снова приходит на помощь! Использование класса Validator настолько интуитивно, насколько это возможно. Просто передайте проверяемый объект, а также список правил методу make , и Laravel позаботится обо всем остальном.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
$order = [
    ‘title’ => ‘Wii U’,
    ‘description’ => ‘Game console from Nintendo’
];
 
$rules = [
    ‘title’ => ‘required’,
    ‘description’ => ‘required’
];
 
$validator = Validator::make($order, $rules);
 
if ($validator->fails())
{
    var_dump($validator->messages());
}

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

1
$order->isValid();


Особенно, когда вы впервые изучаете Laravel, полезно поработать с ядром. В этом может помочь команда Ремесленника tinker .

В версии 4.1 команда tinker стала еще более мощной, поскольку теперь она использует популярный компонент Boris.

1
2
3
4
5
$ php artisan tinker
 
> $order = Order::find(1);
> var_dump($order->toArray());
> array(…)

Думайте о миграциях как о контроле версий для вашей базы данных. В любой момент вы можете «откатить» все миграции, запустить их и многое другое. Возможно, настоящая сила заключается в том, чтобы запустить приложение в производство и запустить одну команду php artisan migrate для мгновенного создания базы данных.

Чтобы подготовить схему для новой таблицы пользователей, мы можем запустить:

1
php artisan migrate:make create_users_table

Это создаст файл миграции, который вы можете заполнить в соответствии со своими потребностями. После завершения php artisan migrate создаст таблицу. Это оно! Нужно откатить это творение? Легко! php artisan migrate:rollback .

Вот пример схемы для таблицы часто задаваемых вопросов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public function up()
{
    Schema::create(‘faqs’, function(Blueprint $table) {
        $table->integer(‘id’, true);
        $table->text(‘question’);
        $table->text(‘answer’);
        $table->timestamps();
    });
}
 
public function down()
{
    Schema::drop(‘faqs’);
}

Обратите внимание, как метод drop() выполняет обратное преобразование up() . Это то, что позволяет нам откатить миграцию. Разве это не намного проще, чем спорить кучу SQL на месте?


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

В этом предыдущем совете мы были вынуждены вручную написать схему. Однако, с включенным генератором, мы можем вместо этого сделать:

1
php artisan generate:migration create_users_table —fields=»username:string, password:string»

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

Генераторы Laravel 4 могут быть установлены через Composer.


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

Поскольку это такая распространенная задача, Laravel делает процесс создания команды настолько простым, насколько это возможно.

1
php artisan command:make MyCustomCommand

Эта команда сгенерирует необходимый шаблон для вашей новой пользовательской команды. Затем из вновь созданного app/commands/MyCustomCommand.php введите соответствующее имя и описание:

1
2
protected $name = ‘command:name’;
protected $description = ‘Command description.’;

И, наконец, в методе fire() командного класса выполните любое действие, которое вам нужно. После завершения единственным оставшимся шагом является регистрация команды в Artisan из app/start/Artisan.php .

1
Artisan::add(new MyCustomCommand);

Хочешь верь, хочешь нет; Это оно! Теперь вы можете вызывать свою пользовательскую команду из терминала.


Laravel сильно использует рисунок фасада. Это позволяет использовать чистый статический синтаксис, который вам несомненно понравится ( Route::get() , Config::get() и т. Д.), И в то же время обеспечивает полную тестируемость за кулисами.

Поскольку эти «базовые классы» разрешаются из контейнера IoC, мы можем легко заменить эти базовые экземпляры на mock для целей тестирования. Это позволяет осуществлять такой контроль, как:

1
Validator::shouldReceive(‘make’)->once();

Да, мы звоним, shouldReceive прямо с фасада. За кулисами Laravel использует отличную среду Mockery, чтобы учесть это. Это означает, что вы можете свободно использовать эти фасады в своем коде, в то же время допуская 100% тестируемость.


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

1
2
3
4
5
{{ Form::open() }}
    {{ Form::text(‘name’) }}
    {{ Form::textarea(‘bio’) }}
    {{ Form::selectYear(‘dob’, date(‘Y’) — 80, date(‘Y’)) }}
{{ Form::close() }}

А как насчет задач, таких как запоминание ввода из предыдущей отправки формы? Laravel может делать все это автоматически!


В основе Laravel лежит его мощный контейнер IoC, который является инструментом, который помогает управлять зависимостями классов. Примечательно, что контейнер может автоматически разрешать классы без настройки!

Просто напишите ваши зависимости внутри конструктора, и после создания экземпляра Laravel будет использовать PHP Reflection API для интеллектуального чтения набранных текстов и попытается внедрить их для вас.

1
2
3
4
public function __construct(MyDependency $thing)
{
    $this->thing = $thing;
}

Пока вы запрашиваете класс из контейнера IoC, это разрешение будет выполняться автоматически.

1
$myClass = App::make(‘MyClass’);

Важным примечанием является то, что контроллеры всегда разрешаются из контейнера IoC. Таким образом, вы можете освободить typhint зависимости вашего контроллера, и Laravel сделает все возможное, чтобы внедрить их для вас.


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

Возможно, ваша тестовая среда использует базу данных в памяти для тестирования. Возможно, ваша среда разработки использует разные ключи API. Вероятно, ваша производственная среда будет использовать пользовательскую строку подключения к базе данных.

К счастью, Laravel снова упрощает нашу работу. Взгляните на bootstrap/start.php в вашем приложении.

Вот базовая демонстрация настройки как local и production среды на основе адресной строки браузера.

1
2
3
4
$env = $app->detectEnvironment(array(
    ‘local’ => array(‘localhost’),
    ‘production’ => array(‘*.com’)
));

Хотя в целом это будет работать, для такого рода вещей предпочтительнее использовать переменные среды. Не стоит беспокоиться; это все еще выполнимо в Laravel! Вместо этого просто верните функцию из метода detectEnvironment для объекта-контейнера.

1
2
3
4
$env = $app->detectEnvironment(function()
{
    return getenv(‘ENV_NAME’) ?: ‘local’;
});

Теперь, если переменная среды не была установлена ​​(что вы будете делать для производства), среда по умолчанию будет local .


Laravel, опять же, использует очень простой подход к настройке. Создайте папку в app/config которая соответствует желаемой среде, и любые файлы конфигурации в ней будут иметь приоритет, если имя среды совпадает. Таким образом, чтобы, скажем, установить другой ключ API биллинга для разработки, вы можете сделать:

1
2
3
4
5
<?php app/config/development/billing.php
 
return [
    ‘api_key’ => ‘your-development-mode-api-key’
];

Конфигурация switcharoo является автоматической. Просто введите Config::get('billing.api_key') , и Laravel правильно определит, из какого файла читать.


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

Узнайте все от основ , до тестирования , создания и поддержки больших приложений !