Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

25 Laravel Tips and Tricks

Anna | 29.05.2014 | нет комментариев

Было время, довольно незадолго, когда PHP и его сообщество ненавидели. Основная шутка была про то, насколько страшен PHP.

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

Но позднее, на изумление, вещи начали меняться — и довольно стремительно. Как словно пока ведьма помешивала горшочек, из ниотколе начали возникать новаторские планы. Вероятно, самый невидимый план был Composer: особенно полный администратор зависимостей для PHP (как Bundler для Ruby либо NPM для Node.js). В прошлом PHP разработчики были обязаны совладать с PEAR (что было ужасным сном, на самом деле), теперь, вследствие Composer, они могут легко обновить JSON файл, и незамедлительно подтянуть все надобные зависимости. Тут — профайлер, там — фреймворк для тестирования. Это занимает секунды.

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

image

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

image

Прежде PHP был схож на игру Дженга — в одном кубике от того, Дабы развалиться — внезапно, вследствие Laravel и Composer, загорелся свет в конце тоннеля. Так что уберем все намёки, и давайте пороемся во каждому, что фреймворк может предложить!

1. Речистые запросы*

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

class Order extends Eloquent {}

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

Order::all();

Готово! Либо, может, эти заказы обязаны быть отсортированы по дате. Легко:

$orders = Order::orderBy('release_date', 'desc')->get();

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

$order = new Order;
$order->title = 'Xbox One';
$order->save();

Готово! С Laravel, задачи, которые прежде были массивными для выполнения, сейчас до хохота примитивны.

* — Eloquent — наименование реализации Active Record в Laravel, а также в переводе с английского речистый.

2. Эластичная маршрутизация (роутинг)

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

Route::get('orders', function()
{
    return View::make('orders.index')
        ->with('orders', Order::all());
});

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

Route::get('orders', 'OrdersController@index');

Готово! Подметили, как Laravel растет по мере ваших надобностей? ?рус приспособления — вот, что делает фреймворк таким знаменитым сегодня.

3. Отношения без задач

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

class Task extends Eloquent {
    public function user()
    {
        return $this->belongsTo('User');
    }
}

class User extends Eloquent {
    public function tasks()
    {
        return $this->hasMany('Task');
    }
}

Всё готово! Давайте получим все задачи пользователя с id = 1. Для этого нам потребуется каждого 2 строчки кода.

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

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

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

4. Связь формы с моделью

Дюже Зачастую, будет пригодным связать форму с моделью. ?вственный пример — когда Вы хотите изменить какую-то запись в базе. Связав форму с моделью, мы можем молниеносно заполнить поля формы данными из базы.

{{ Form::model($order) }}
    <div>
        {{ Form::label('title', 'Title:') }}
        {{ Form::text('title') }}
    </div>

    <div>
        {{ Form::label('description', 'Description:') }}
        {{ Form::textarea('description') }}
    </div>
{{ Form::close() }}

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

5. Кеш запросов в базу

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

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

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

Вот и всё! Сейчас, в течение дальнейшего часа, данный запрос будет храниться в кеше, и база будет нетронутой.

6. Композиторы образцов

Вы столкнётесь с обстановками, когда несколько образцов затребуют некоторую переменную либо кусок данных. Отличный пример этого — навигационное меню, которое отображает список тегов.
Дабы контроллеры были с минимальным кодом, Laravel предлагает композиторы образцов (вьюшек), Дабы руководить такими вещами.

View::composer('layouts.nav', function($view)
{
    $view->with('tags', ['tag1', 'tag2']);
});

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

7. Простая авторизация

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

$user = [
    'email' => 'email',
    'password' => 'password'
];

if (Auth::attempt($user))
{
    // пользователь авторизован
}

Что если нужно произвести выход при переходе, скажем на /logout URI?

Route::get('logout', function()
{
    Auth::logout();

    return Redirect::home();
});

8. Источники

Трудиться RESTfully в Laravel также дюже легко! Дабы объявить контроллер источник, легко вызовите Route::resource() дальнейшим образом.

Route::resource('orders', 'OrdersController');

Данный код зарегистрирует 8 роутов.

  • GET /orders
  • GET /orders/:order
  • GET /orders/create
  • GET /orders/:order/edit
  • POST /orders
  • PUT /orders/:order
  • PATCH /orders/:order
  • DELETE /orders/:order

Дальше, OrdersController может быть сгенерирован из командной строки:

php artisan controller:make OrdersController

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

Сейчас у нас есть нужная сила, Дабы с легкостью строить RESTful приложения и API.

9. Шаблонизатор Blade

Да, PHP по натуре язык образцов, но он не стал слишком отличным. Однако, ничего ужасного. Laravel предлагает свой движок Blade, Дабы восполнить пробел. Легко назовите ваши образцы с растяжением .blade.php, и они соответствующим образом будут парситься. Сейчас мы можем делать следующее:

@if ($orders->count())
    <ul>
        @foreach($orders as $order)
            <li>{{ $order->title }}</li>
        @endforeach
    </ul>
@endif

10. Средства для тестирования

Так как Laravel использует Composer, мы тут же имеет поддержку PHPUnit “из коробки”. Установите фреймворк и запустите phpunit из командной строки, Дабы протестировать.

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

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

public function test_home_page()
{
    $this->call('GET', '/');
    $this->assertResponseOk();
}

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

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']);
}

11. Компонент “Дистанционное управление”

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

SSH::into('production')->run([
    'cd /var/www',
    'git pull origin master'
]);

В способ run() передайте массив команд, а Laravel займётся каждому остальным! Сейчас, так как есть толк исполнять команды в качестве Artisan команд, вам каждого лишь необходимо исполнить php artisan command:make DeployCommand и в способ fire() написать необходимый код для выполнения деплоя.

12. События

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

Продуманное применение событий даст вам много вероятностей.

Event::listen('user.signUp', function()
{
    // исполните то, что нужно,
    // когда пользователь регистрируется
});

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

Event::listen('user.signUp', 'UserEventHandler');

13. Покажите маршруты

image

Приложение растёт, и может стать трудно посмотреть, какие роуты описаны. Исключительно, если Вы не уделяли надлежащего внимания файлу routes.php (скажем, излишния изложения роутов).

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

php artisan routes

14. Очереди

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

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

Queue::push('SignUpService', compact('user'));

Вероятно, самое восхитительное, это то, что Laravel великолепно работает с Iron.io “push” очередями. Это значит, что даже не имея навыка работы с воркерами либо демонами, мы всё равно можем применять очереди. Легко опишите роут с поддержкой команды php artisan queue:subscribe, и Iron.io будет отправлять данные на данный урл всякий раз, когда задача отправлена в очередь. А данный роут в свою очередь исполнит надобные действия.
image

15. Простая валидация

Когда необходима валидация, Laravel вновь приходит нам на поддержка! Применяя класс Validator как невозможно легко. Легко передайте объект для валидации совместно с правилами в способ make, а Laravel сделает всё остальное.

$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()); // validation errors array
}

16. Tinker

image

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

Tinker использует знаменитый компонент Boris.

$ php artisan tinker

> $order = Order::find(1);
> var_dump($order->toArray());
> array(...)

17. Миграции

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

Дабы приготовить схема для новой таблицы users, мы можем исполнить:
php artisan migrate:make create_users_table

Команда сгененерирует файл миграции, тот, что вы наполните так, как вам необходимо. Как будете готовы, команда php artisan migrate сделает таблицу. Вот и всё! Необходимо откатить метаморфозы? Легко! php artisan migrate:rollback.

Вот пример таблица для таблицы ЧаВО.

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?

18. Генераторы

Laravel предлагает некоторое число генераторов. Но также есть пакет, тот, что именуется “Laravel 4 Generators”, и он зашел еще дальше. Он может генерировать источники, файлы для наполнения базы, pivot таблицы и миграции.

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

php artisan generate:migration create_users_table --fields="username:string, password:string"

А генератор сделает всё остальное. С этой командой вы сумеет подоготовить и сделать новую таблицу в базе.
Laravel 4 Generators может быть установлен через Composer.

19. Консольные команды

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

Так как это распространенная задача, Laravel делает процесс создания команд особенно простым.
php artisan command:make MyCustomCommand

Это команда сгенерирует необходимый образец для Вашей кастомной команды. Дальше, в только что сделанном файле app/commands/MyCustomCommand.php, заполните наименование и изложение.

protected $name = 'command:name';
protected $description = 'Command description.';

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

Artisan::add(new MyCustomCommand);

Хотите верьте, хотите нет, но это всё! Сейчас вы можете вызывать эту команду из терминала.

20. Тестируйте фасады

Laravel много использует образец Фасад. Это даёт вероятность применять “статический” синтаксис, тот, что, без сомнений, Вам понравится (Route::get(), Config::get(), и так дальше), и при этом разрешает всецело тестировать их.

Так как “лежащий в основе” класс разруливается через IoC контейнер, мы легко можем подменить “нижние” классы с нашими тестовыми. Это разрешает нам делать следующее:

Validator::shouldReceive('make')->once();

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

21. Хелперы форм

Так как построение форм Зачастую бывает массивной задачей, в дело вступает построитель форм в Laravel, Дабы облегчить данный процесс, а также применять некоторые “особенности стиля”, связанные с конструированием форм. Вот несколько примеров:

{{ Form::open() }}
    {{ Form::text('name') }}
    {{ Form::textarea('bio') }}
    {{ Form::selectYear('dob', date('Y') - 80, date('Y')) }}
{{ Form::close() }}

Что насчёт задачи запоминания введенных данных при прошлой отправке формы? Laravel это делает механически!

22. IoC контейнер (Inverse of control)

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

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

public function __construct(MyDependency $thing)
{
    $this->thing = $thing;
}

Пока вы запрашиваете класс из IoC контейнера, разрешение зависимости произойдет механически.

$myClass = App::make('MyClass');

Значимо подметить, что контроллеры неизменно запрашиваются из IoC контейнера. Следственно вы можете вольно делать typehint для зависимостей ваших контроллеров, а Laravel постарается внедрить их.

23. Окружения

Одно окружение может подойти для маленьких планов. Для других планов, несколько окружений — животрепещуще значимо! Разработка, тестирование, продакшн. Всё это животрепещуще значимо и всякое окружение требует своих настроек.

Допустимо ваше тестовое окружение использует базу данных в памяти для тестирование. Может ваше dev окружение использует другие ключи API. А продакшн окружение использует свои настройки подключения к базе.

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

Там находится простая демонстрация настройки local окружения, которое основывается на hostname компьютера.

$env = $app->detectEnvironment(array(

	'local' => array('your-machine-name'),

));

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

$env = $app->detectEnvironment(function()
{
    return getenv('ENV_NAME') ?: 'local';
});

Сейчас, если переменная окружения не задана (а для продакшна Вы её установите), окружение будет иметь значение local.

24. Простая настройка

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

<?php // app/config/development/billing.php

return [
    'api_key' => 'your-development-mode-api-key'
];

Конфигурация всецело механическая. Легко вызовите способ Config::get(‘billing.api_key’) и Laravel сам определит из какого именно файла, считать это значение.

25. Обучаемость

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB