Страницы

11.08.2016

Вещи, о которых я не знал, но которые существуют в Laravel

Оказывается, есть длинный путь между “У меня есть идея для книги” и “Я знаю все, что нужно знать для того, чтобы написать эту книгу.”
Не имеет значения, насколько вы считаете себя экспертом. Не имеет значения, сколько времени вы провели за обучением. Повсюду, каждый образованный автор говорил мне, что сколько бы я не знал, за время написания книги мне придется выучить еще больше.
И я в самом деле узнал много нового за время написания Laravel: Up and Running. И я хочу поделиться этим с вами.


Я хотел написать книгу, которая вам понравится

У меня появилась парочка больших опасений, когда я начал писать Laravel: Up and Running.
Во-первых, я боялся, что я не смог бы предложить больше, чем имеется в моём блоге. Этот страх быстро рассеялся, когда я понял, как много я еще не раскрыл.
И во-вторых, я боялся, что писал книгу, которая была бы полезна для новичков, но бесполезна для всех остальных. И опять же, этот страх длился недолго.
Эта книга содержит так много, потому что кроме тех знаний, что у меня были, там содержатся и знания, которые я получил за время её написания (о чем я уже упомянул выше).
Количество исследованного мною исходного кода, а так же количество написанного тестового кода просто невероятно. В нескольких главах я потратил больше времени на кодирование, тестирование и чтение исходного кода, чем на написание самой книги.

Несколько вещей, которые я узнал

Ни один блог не может содержать все те новые вещи, которые я узнал при написании этой книги. Я использую и изучаю Laravel в течение многих лет, и я до сих пор в шоке от того, сколько инструментов и особенностей я обнаружил.
Вот несколько из них, которые выделяются для меня тем, что я никогда их не встречал до написания книги.
Cookies немного отличается от других аналогичных инструментов - кэша, сессий и т.п., тем, что PHP не может записывать их посреди пользовательского запроса. Вместо этого, они должны быть возвращены вместе с ответом.
Это означает, что фасад Cookie (и глобальный хелпер сookie ()) не имеет чего то вроде Cookie::put(), для того, что бы устанавливать куки. По традиции, мы создаем куки, а затем прикрепляем их к ответу, используя следующий код:
Route::get('dashboard', function () {
    $cookie = cookie('saw-dashboard', true, 15);

    return view('dashboard')->withCookie($cookie);
});
Но при написании книги я узнал, что есть метод queue() в фасаде Cookie (и только в фасаде, а не в хелпере или внедрённом классе), который можно использовать перед ответом, и посредник Laravel AddQueuedCookiesToResponse будет без очереди прикреплять куки к ответу, который возвращает роут. Таким образом, это делает рабочим следующий код:
Route::get('dashboard', function () {
    Cookie::queue('saw-dashboard', true, 15);

    return view('dashboard');
});
В данном примере это не имеет особого значения, но в более длинных методах контроллера вам может пригодиться возможность устанавливать куки как можно раньше или даже, при желании, вне контроллера.

2. Вкладывать файлы в Email сообщения проще, чем вы думаете

Всегда знал, что можно прикреплять файлы к сообщениям электронной почты, но предполагал, что это выглядит как то так: “Получим основной Swift объект, а затем напишем полсотни волшебных строк, чтобы заставить это случиться.”
Но нет. На самом деле всё намного проще.
Mail::send('emails.whitepaper', [], function ($m) {
    $m->to('barasa@wangusi.ke');
    $m->subject('Your whitepaper download');
    $m->attach(storage_path('pdfs/whitepaper.pdf'));
});
Встроить своё изображение прямо в шаблон электронной почты так же невероятно просто:
// emails/has-image.blade.php
Вот это изображение мы и отправим:

<img src="{{ $message->embed(storage_path('embed.jpg')) }}">

Thanks!
Волшебство.

3. Вы можете объединять больше методов Планировщика задач, чем это показано в документации

В документации показано, что вы можете объединять несколько разных методов планировщика задач вместе, чтобы определить расписание выполнения ваших команд. Оказывается, вы можете объединять любую разумную комбинацию времени.
Это делает планировщик задач гораздо более мощным, чем показано в документации. Теперь вы можете сделать что-то вроде этого:
// Run once an hour, weekdays, from 8-5
$schedule->command('do:thing')->weekdays()->hourly()->when(function () {
    return date('H') >= 8 && date('H') <= 17;
});
Вы также можете написать более сложные комбинации в других классах и передать их в замыкании:
$schedule->command('do:thing')->everyThirtyMinutes()->skip(function () {
    return app('SkipDetector')->shouldSkip();
});

4. Вы можете дать шаблону доступ к определенным данным

Кажется, что все и так должны это знать, но, так или иначе, я никогда не встречался с этой особенностью. В своих тестах вы можете давать определенному шаблону доступ к получению определенных данных. Таким образом, вы можете написать, к примеру, такой маршрут:
Route::get('test', function () {
    return view('test')->with('foo', 'bar');
});
А потом написать к нему тест:
public function test_view_gets_data()
{
    $this->get('test');
    $this->assertViewHas('foo');        // true
    $this->assertViewHas('foo', 'bar'); // true
    $this->assertViewHas('foo', 'baz'); // false
}

Ссылка на оригинальную статью