Недооцененный встроенный Laravel-компонент - команда php artisan tinker, которую используют для запуска кода в контексте приложения. Давайте разберемся, на что она способна.
Tinker - это REPL (read-eval-print loop - цикл "чтение-вычисление-вывод") поверх PsySH (Runtime developer console, interactive debugger and REPL for PHP). Он принимает данные из командной строки, обсчитывает их и выводит в консоль. Поэтому вместо того, чтобы использовать инструменты управления базой данных и писать SQL-запросы для получения количества пользователей, вы можете просто запустить App\Models\User::count() и получить результат => 10.
Как он работает?
Команда php artisan tinker загружает ваше приложение и ожидает ввода команд. Она хранит состояние приложения, пока вы не набрали exit, Ctrl+C или просто не закрыли терминал. Это означает, что вам нужно инициализировать новую tinker-сессию каждый раз, как вы изменяете свой код, но это также позволяет вам задавать новые переменные, которые доступны до тех пор, пока вы не завершите сессию.
Когда это может понадобиться?
Всегда! Мы используем Tinker во множестве случаев и в цикле разработки и на продакшене. Наиболее распространенный вариант использования - доступ к базе данных через Laravel Eloquent Модели.
- ИСПОЛЬЗОВАНИЕ ELOQUENT МОДЕЛЕЙ В TINKER
Tinker очень удобен для создания тестовых данных в процессе разработки. Например, быстро создадим двух новых тестовых пользователей с фабрикой.
App\Models\User::factory()->count(2)->create();
Эта команда использует фабрику моделей для пользователей и создает двух новых. Вывод этой команды должен выглядеть примерно так - с рандомными именами и адресами.
>>> App\Models\User::factory()->count(2)->create(); => Illuminate\Database\Eloquent\Collection {#4412 all: [ App\Models\User {#4416 name: "Kacey Herzog", email: "bosco.amara@example.com", email_verified_at: "2021-09-01 05:36:09", #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi", #remember_token: "JeCHXrMgdL", updated_at: "2021-09-01 05:36:09", created_at: "2021-09-01 05:36:09", id: 1, }, App\Models\User {#4417 name: "Kelton Boyle Jr.", email: "bpouros@example.com", email_verified_at: "2021-09-01 05:36:09", #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi", #remember_token: "304GO1pkOv", updated_at: "2021-09-01 05:36:09", created_at: "2021-09-01 05:36:09", id: 2, }, ], }
Давайте изменим имю второго пользователя через php artisan tinker (введите и подтвердите каждую строку отдельно):
$user = App\Models\User::where('email', 'bpouros@example.com')->first(); $user->name = 'Orkhan'; $user->save();
Если это сработает, то Tinker вернет => true.
Если нет желания запускать по одной команде, а модель поддерживает массовые назначения, то вы можете запустить это одной строкой:
App\Models\User::where('email', 'bpouros@example.com')->first()->update(['name' => 'Taylor', 'email' => 'mail@taylor.com']);
Нет никаких ограничений на работу с Tinker, пока вы можете втиснуть свой код в одну строку или выполнять его построчно. С ним у вас есть доступ ко всем PHP-функциям и Laravel-хелперам.
- ГЕНЕРАЦИЯ UUID
Вместо того, чтобы гуглить интернет-сервис, который сгенерирует вам UUID, вы можете использовать Tinker и получить его с помощью хелпера Str.
>>> Str::uuid(); => Ramsey\Uuid\Lazy\LazyUuidFromString {#4180 uuid: "b2e1f89b-c591-4b7c-9a4d-b1290dc4d25a", }
- СОЗДАНИЕ СЛАГА ИЗ ЗАГОЛОВКА
>>> Str::slug('The ultimate guide to PHP artisan tinker'); => "the-ultimate-guide-to-php-artisan-tinker"
- ПОЛУЧЕНИЕ ДАТЫ ПЕРВОГО ДНЯ НЕДЕЛИ ЧЕРЕЗ 3 МЕСЯЦА
>>> now()->addMonths(3)->startOfWeek(); => Illuminate\Support\Carbon @1638144000 {#4442 date: 2021-11-29 00:00:00.0 UTC (+00:00), }
- КОДИРОВАНИЕ И ДЕКОДИРОВАНИЕ BASE64
>>> base64_encode('The ultimate guide to PHP artisan tinker'); => "VGhlIHVsdGltYXRlIGd1aWRlIHRvIFBIUCBhcnRpc2FuIHRpbmtlcg==" >>> base64_decode('VGhlIHVsdGltYXRlIGd1aWRlIHRvIFBIUCBhcnRpc2FuIHRpbmtlcg=='); => "The ultimate guide to PHP artisan tinker"
Ну, вы поняли.
- ПРОВЕРКА ТЕКУЩЕЙ ВЕРСИИ LARAVEL
Файл composer.json содержит версию Laravel-приложения Laravel. Вы можете легко узнать её вызвав:
>>> app()->version(); => "8.57.0"