Полное руководство по Tinker

tinker

Недооцененный встроенный Laravel-компонент — команда php artisan tinker, которую используют для запуска кода в контексте приложения. Давайте разберемся, на что она способна.

Tinker — это REPL ( read-eval-print loop — цикл «чтение-вычисление-вывод») поверх PsySH. Он принимает данные из командной строки, обсчитывает их и выводит в консоль. Поэтому вместо того, чтобы использовать инструменты управления базой данных и писать SQL-запросы для получения количества пользователей, вы можете просто запустить App\User::count() и получить результат => 10.

Как он работает?

Команда php artisan tinker загружает ваше приложение и ожидает ввода команд. Она хранит состояние приложения, пока вы не набрали exit, Ctrl+C или просто не закрыли терминал. Это означает, что вам нужно инициализировать новую tinker-сессию каждый раз, как вы изменяете свой код, но это также позволяет вам задавать новые переменные, которые доступны до тех пор, пока вы не завершите сессию.

Когда это может понадобиться?

Всегда! Мы используем Tinker во множестве случаев и в цикле разработке и на продакшене. Наиболее распространенный вариант использования — доступ к базе данных через Laravel Eloquent Модели.

Использование Eloquent Моделей в Tinker

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

User::factory()->count(2)->create()

Эта команда использует фабрику моделей для пользователей и создает двух новых. Вывод этой команды должен выглядеть примерно так — с рандомными именами и адресами.

=> Illuminate\Database\Eloquent\Collection {#4612
     all: [
       App\Models\User {#4616
         gender: "male",
         firstname: "Orie",
         lastname: "Rath",
         email: "jocelyn.schuster@example.org",
       },
       App\Models\User {#4620
         gender: "female",
         firstname: "Karlie",
         lastname: "Ruecker",
         email: "trycia.koelpin@example.org",
       },
     ],
   }

Давайте изменим фамилию второго пользователя через php artisan tinker (введите и подтвердите каждую строку отдельно)

$user = User::where('email', 'trycia.koelpin@example.org')->first();

$user->lastname = 'Smith';

$user->save();

Если это сработает, то Tinker вернет => true.

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

User::where('email', 'trycia.koelpin@example.org')->first()->update(['lastname' => 'Carlson']);

Нет никаких ограничений на работу с Tinker, пока вы можете втиснуть свой код в одну строку или выполнять его построчно. С ним у вас есть доступ ко всем PHP-функциям и Laravel-хелперам.

Генерация UUID

Вместо того, чтобы гуглить интернет-сервис, который сгенерирует вам UUID, вы можете использовать Tinker и получить его с помощью хелпера Str.

Str::uuid()

Он мгновенно выдаст вам

=> Ramsey\Uuid\Lazy\LazyUuidFromString {#4632
     uuid: "a1d56de1-455d-4275-8812-c3e28d45428e",
   }

Создание слага из заголовка

Str::slug('The ultimate guide to php artisan tinker')
=> "the-ultimate-guide-to-php-artisan-tinker"

Получение даты первого дня недели через 3 месяца

now()->addMonths(3)->startOfWeek()
=> Illuminate\Support\Carbon @1627862400 {#5507
     date: 2021-08-02 00:00:00.0 UTC (+00:00),
   }

Кодирование и декодирование Base64

base64_encode('The ultimate guide to php artisan tinker')
base64_decode('VGhlIHVsdGltYXRlIGd1aWRlIHRvIHBocCBhcnRpc2FuIHRpbmtlcg==')
=> "VGhlIHVsdGltYXRlIGd1aWRlIHRvIHBocCBhcnRpc2FuIHRpbmtlcg=="
=> "The ultimate guide to php artisan tinker"

Ну, вы поняли.

Отправка задач

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

$order = new Order(['invoice_id' => 12345, 'item' => 'Tinker Fangirl Mug']);
dispatch(new OrderPlacedJob($order));

Отправка уведомлений

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

(new User)->notify(new InvoicePaid($invoice);

Проверка текущей версии Laravel

Файл composer.json содержит версию Laravel-приложения Laravel. Вы можете легко узнать её вызвав:

app()->version()
=> "8.42.0"

Tinkerwell — Tinker на стероидах

Вы можете вывести Tinker на ещё более мощный уровень. Представляем вам Tinkerwell — редактор кода для macOS, Windows и Linux, который полностью посвящен Tinker. Он поддерживает многострочность, SSH-соединения и позволяет работать с несколькими приложениями одновременно.

С Tinkerwell нет необходимости перезагружать tinker-сессию, поскольку он самостоятельно оценивает текущее состояние вашего кода и не сохраняет состояние приложения.

Использование коллекций

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

App\User::whereNull('confirmed_at')
  ->get()
  ->each(function ($user) {
    $user->update([
      'confirmed_at' => $user->created_at->addDay(),
    ]);
  });

Тестирование API

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

$apiKey = 'Your-Forge-API-Key';

$response = Http::withHeaders([
  	'accept' => 'application/json'
  ])
  ->withToken($apiKey)
  ->get('https://forge.laravel.com/api/v1/servers')
  ->json();

collect($response['servers'])->pluck('name');
=> Illuminate\Support\Collection {#1046
     all: [
       "HELO-cloud",
       "bc-dev",
       "bc-prod-01",
       "bc-prod-02",
       "bc-prod-03",
       "bc-website",
       "expose",
       "expose-eu-1",
       ...
     ],
   }

Автор: Sebastian Schlein
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.