Приложение Б: Шпаргалка по Laravel
📋 Быстрый справочник для ежедневной работы
🎯 Artisan — Командная строка Laravel
Основные команды
bash
# Справка и список команд
php artisan list # Все доступные команды
php artisan help <command> # Помощь по конкретной команде
# Сервер разработки
php artisan serve # Запуск на localhost:8000
php artisan serve --port=8080 # На другом порту
php artisan serve --host=0.0.0.0 # Доступ из сети
# Очистка кеша
php artisan cache:clear # Очистить application cache
php artisan config:clear # Очистить config cache
php artisan route:clear # Очистить route cache
php artisan view:clear # Очистить compiled views
# Кеширование для production
php artisan config:cache # Кешировать конфигурацию
php artisan route:cache # Кешировать маршруты
php artisan view:cache # Кешировать views
php artisan event:cache # Кешировать события
php artisan optimize # Все оптимизации сразу
php artisan optimize:clear # Очистить все кешиКонтроллеры
bash
# Создание контроллеров
php artisan make:controller UserController # Обычный
php artisan make:controller UserController --resource # С CRUD методами
php artisan make:controller UserController --api # API (без create/edit)
php artisan make:controller UserController --model=User # С type hints модели
php artisan make:controller UserController --invokable # Single actionМодели
bash
# Создание моделей
php artisan make:model Post # Только модель
php artisan make:model Post -m # + миграция
php artisan make:model Post -f # + factory
php artisan make:model Post -s # + seeder
php artisan make:model Post -c # + контроллер
php artisan make:model Post -mfsc # Всё сразу
php artisan make:model Post --all # Всё + policy + resource
# Информация о модели
php artisan model:show Post # Атрибуты, связи, observersМиграции
bash
# Создание миграций
php artisan make:migration create_posts_table # Создание таблицы
php artisan make:migration add_status_to_posts_table # Изменение таблицы
php artisan make:migration create_posts_table --create=posts
# Выполнение миграций
php artisan migrate # Запустить новые миграции
php artisan migrate --force # В production (без подтверждения)
php artisan migrate:rollback # Откатить последний batch
php artisan migrate:rollback --step=2 # Откатить 2 последних batch
php artisan migrate:reset # Откатить всё
php artisan migrate:refresh # Откатить и запустить заново
php artisan migrate:refresh --seed # + запустить seeders
php artisan migrate:fresh # Drop all + migrate
php artisan migrate:fresh --seed # + seeders
# Информация
php artisan migrate:status # Статус миграцийSeeders и Factories
bash
# Создание
php artisan make:seeder UserSeeder # Seeder
php artisan make:factory PostFactory # Factory
php artisan make:factory PostFactory --model=Post # С привязкой к модели
# Запуск
php artisan db:seed # Запустить DatabaseSeeder
php artisan db:seed --class=UserSeeder # Конкретный seeder
php artisan migrate:fresh --seed # Пересоздать БД и заполнитьMiddleware
bash
php artisan make:middleware CheckAge # Создать middleware
php artisan make:middleware EnsureTokenIsValidRequests
bash
php artisan make:request StorePostRequest # Form Request для валидации
php artisan make:request UpdatePostRequestResources (API)
bash
php artisan make:resource PostResource # Одиночный ресурс
php artisan make:resource PostCollection # Коллекция
php artisan make:resource Post --collection # То же самоеPolicies и Gates
bash
php artisan make:policy PostPolicy # Policy без модели
php artisan make:policy PostPolicy --model=Post # С type hints моделиJobs и Queues
bash
# Создание
php artisan make:job SendEmailJob # Job для очереди
php artisan make:job ProcessPodcast --sync # Синхронный
# Работа с очередями
php artisan queue:work # Обработка очереди
php artisan queue:work --queue=emails,default # Конкретные очереди
php artisan queue:work --tries=3 # Количество попыток
php artisan queue:work --timeout=60 # Таймаут
php artisan queue:listen # То же, но перезапускается
php artisan queue:restart # Перезапустить workers
php artisan queue:failed # Список failed jobs
php artisan queue:retry <id> # Повторить failed job
php artisan queue:retry all # Повторить все
php artisan queue:flush # Удалить все failedEvents и Listeners
bash
php artisan make:event UserRegistered # Event
php artisan make:listener SendWelcomeEmail --event=UserRegistered
php artisan event:generate # Создать все из EventServiceProvider
php artisan event:list # Список событийCommands (консольные команды)
bash
php artisan make:command SendEmails # Создать команду
php artisan make:command SendEmails --command=emails:sendNotifications
bash
php artisan make:notification InvoicePaid # Notification
php artisan notifications:table # Миграция для database channelMail
bash
php artisan make:mail OrderShipped # Mailable класс
php artisan make:mail OrderShipped --markdown=emails.orders.shippedTesting
bash
php artisan make:test UserTest # Feature test
php artisan make:test UserTest --unit # Unit test
php artisan make:test UserTest --pest # Pest test
php artisan test # Запустить все тесты
php artisan test --filter UserTest # Конкретный тест
php artisan test --parallel # ПараллельноДругие полезные команды
bash
# Информация о приложении
php artisan about # Информация о Laravel
php artisan env # Текущее окружение
php artisan inspire # Мотивирующая цитата 😊
# Tinker (REPL)
php artisan tinker # Интерактивная консоль
>>> User::count()
>>> User::factory()->create()
# Storage
php artisan storage:link # Создать symlink storage/app/public
php artisan storage:unlink # Удалить symlink
# Vendor
php artisan vendor:publish # Опубликовать vendor файлы
php artisan vendor:publish --tag=config
php artisan vendor:publish --provider="Vendor\Package\ServiceProvider"
# Maintenance mode
php artisan down # Включить maintenance mode
php artisan down --secret="secret-token" # С bypass токеном
php artisan up # Выключить
# Horizon (если установлен)
php artisan horizon # Запустить Horizon
php artisan horizon:terminate # Остановить
# Telescope (если установлен)
php artisan telescope:install # Установить
php artisan telescope:publish # Опубликовать assets
php artisan telescope:prune # Очистить старые записи🗄️ Eloquent — Методы запросов
Создание и сохранение
php
// Создание
$user = new User();
$user->name = 'John';
$user->save();
// Массовое присваивание
$user = User::create([
'name' => 'John',
'email' => 'john@example.com'
]);
// firstOrCreate — найти или создать
$user = User::firstOrCreate(
['email' => 'john@example.com'],
['name' => 'John']
);
// firstOrNew — найти или новый экземпляр (без сохранения)
$user = User::firstOrNew(['email' => 'john@example.com']);
// updateOrCreate — найти и обновить или создать
$user = User::updateOrCreate(
['email' => 'john@example.com'],
['name' => 'John Doe']
);
// upsert — вставить или обновить (batch)
User::upsert([
['email' => 'john@example.com', 'name' => 'John'],
['email' => 'jane@example.com', 'name' => 'Jane']
], ['email'], ['name']);Получение данных
php
// Все записи
$users = User::all();
// С условием
$users = User::where('active', 1)->get();
// Первая запись
$user = User::first();
$user = User::where('email', 'john@example.com')->first();
// Первая или исключение
$user = User::firstOrFail();
$user = User::where('email', 'john@example.com')->firstOrFail();
// По ID
$user = User::find(1);
$users = User::find([1, 2, 3]);
$user = User::findOrFail(1);
// По другому ключу
$user = User::where('email', 'john@example.com')->sole(); // Одна или исключение
// Один из столбцов
$names = User::pluck('name');
$names = User::pluck('name', 'id'); // Ключ => значение
// Только первое значение
$name = User::where('id', 1)->value('name');
// Количество
$count = User::count();
$count = User::where('active', 1)->count();
// Проверка существования
$exists = User::where('email', 'john@example.com')->exists();
$doesntExist = User::where('email', 'john@example.com')->doesntExist();WHERE условия
php
// Простые условия
User::where('name', 'John')->get();
User::where('votes', '>', 100)->get();
User::where('votes', '>=', 100)->get();
User::where('votes', '<>', 100)->get();
User::where('name', 'like', 'John%')->get();
// Несколько условий (AND)
User::where('name', 'John')
->where('votes', '>', 100)
->get();
// Массив условий (AND)
User::where([
['name', '=', 'John'],
['votes', '>', 100]
])->get();
// OR условия
User::where('votes', '>', 100)
->orWhere('name', 'John')
->get();
// Группировка условий
User::where('name', 'John')
->orWhere(function ($query) {
$query->where('votes', '>', 100)
->where('title', 'Admin');
})->get();
// whereBetween
User::whereBetween('votes', [1, 100])->get();
User::whereNotBetween('votes', [1, 100])->get();
// whereIn
User::whereIn('id', [1, 2, 3])->get();
User::whereNotIn('id', [1, 2, 3])->get();
// whereNull
User::whereNull('deleted_at')->get();
User::whereNotNull('email_verified_at')->get();
// whereDate, whereMonth, whereDay, whereYear, whereTime
User::whereDate('created_at', '2024-01-01')->get();
User::whereMonth('created_at', 12)->get();
User::whereDay('created_at', 1)->get();
User::whereYear('created_at', 2024)->get();
User::whereTime('created_at', '14:30:00')->get();
// whereColumn — сравнение столбцов
User::whereColumn('updated_at', '>', 'created_at')->get();
// whereExists — с подзапросом
User::whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereColumn('orders.user_id', 'users.id');
})->get();
// JSON столбцы
User::where('options->language', 'en')->get();
User::whereJsonContains('options->languages', 'en')->get();
User::whereJsonLength('options->languages', 3)->get();Сортировка и лимиты
php
// Сортировка
User::orderBy('name')->get();
User::orderBy('name', 'desc')->get();
User::latest()->get(); // По created_at desc
User::oldest()->get(); // По created_at asc
User::latest('updated_at')->get();
User::inRandomOrder()->get();
// Группировка
User::groupBy('account_id')->get();
User::groupBy('account_id', 'status')->get();
// Having
User::groupBy('account_id')
->having('account_id', '>', 100)
->get();
// Лимиты
User::take(5)->get();
User::limit(5)->get();
User::skip(10)->take(5)->get();
User::offset(10)->limit(5)->get();Обновление
php
// Обновление одной модели
$user = User::find(1);
$user->name = 'John Doe';
$user->save();
// Массовое обновление
User::where('active', 1)
->update(['status' => 'verified']);
// increment / decrement
User::where('id', 1)->increment('votes');
User::where('id', 1)->increment('votes', 5);
User::where('id', 1)->decrement('votes');
User::where('id', 1)->increment('votes', 1, ['status' => 'active']);Удаление
php
// Удаление модели
$user = User::find(1);
$user->delete();
// Массовое удаление
User::where('active', 0)->delete();
// Удаление по ID
User::destroy(1);
User::destroy([1, 2, 3]);
User::destroy(1, 2, 3);
// Soft Delete
$user->delete(); // Мягкое удаление
$user->forceDelete(); // Жёсткое удаление
$user->restore(); // Восстановление
// Запросы с soft deleted
User::withTrashed()->get(); // Включая удалённые
User::onlyTrashed()->get(); // Только удалённыеОтношения (Relationships)
php
// Загрузка отношений
$user = User::with('posts')->find(1);
$users = User::with(['posts', 'comments'])->get();
$users = User::with('posts:id,title,user_id')->get(); // Выбрать столбцы
// Вложенные отношения
$users = User::with('posts.comments')->get();
// Условия для отношений
$users = User::with(['posts' => function ($query) {
$query->where('published', 1);
}])->get();
// Lazy Eager Loading
$users = User::all();
$users->load('posts');
// withCount — количество связанных
$users = User::withCount('posts')->get();
echo $users[0]->posts_count;
// withCount с условиями
$users = User::withCount(['posts' => function ($query) {
$query->where('published', 1);
}])->get();
// withExists — проверка существования
$users = User::withExists('posts')->get();
echo $users[0]->posts_exists;
// has — фильтр по наличию отношений
$users = User::has('posts')->get();
$users = User::has('posts', '>=', 3)->get();
// whereHas — фильтр с условиями
$users = User::whereHas('posts', function ($query) {
$query->where('published', 1);
})->get();
// doesntHave
$users = User::doesntHave('posts')->get();
// withAggregate — агрегация
$users = User::withMax('posts', 'votes')->get();
$users = User::withMin('posts', 'votes')->get();
$users = User::withSum('posts', 'votes')->get();
$users = User::withAvg('posts', 'votes')->get();Агрегация
php
// Подсчёт
$count = User::count();
$count = User::where('active', 1)->count();
// Максимум, минимум
$max = User::max('votes');
$min = User::min('votes');
// Сумма
$sum = User::sum('votes');
// Среднее
$avg = User::avg('votes');
// Aggregate с группировкой
$result = User::select('status', DB::raw('count(*) as count'))
->groupBy('status')
->get();Scopes
php
// Global Scope (в модели)
protected static function booted()
{
static::addGlobalScope('active', function (Builder $query) {
$query->where('active', 1);
});
}
// Использование
User::withoutGlobalScope('active')->get();
User::withoutGlobalScopes()->get();
// Local Scope (в модели)
public function scopeActive($query)
{
return $query->where('active', 1);
}
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}
// Использование
User::active()->get();
User::active()->popular()->get();
// Scope с параметрами
public function scopeOfType($query, $type)
{
return $query->where('type', $type);
}
User::ofType('admin')->get();Chunks и Cursors
php
// chunk — обработка большого количества записей
User::chunk(100, function ($users) {
foreach ($users as $user) {
// Обработка
}
});
// chunkById — безопаснее при обновлениях
User::chunkById(100, function ($users) {
foreach ($users as $user) {
$user->update(['processed' => true]);
}
});
// lazy — ленивая коллекция
User::lazy()->each(function ($user) {
// Обработка
});
// cursor — генератор (минимум памяти)
foreach (User::cursor() as $user) {
// Обработка
}Дополнительные методы
php
// Дублирование модели
$user = User::find(1);
$newUser = $user->replicate();
$newUser->save();
// Обновление timestamps
$user->touch();
// Refresh — перезагрузка из БД
$user->refresh();
// Raw выражения
User::select(DB::raw('count(*) as user_count'))
->get();
User::whereRaw('age > ? and votes = 100', [25])
->get();
// Lock
User::where('id', 1)->lockForUpdate()->first();
User::where('id', 1)->sharedLock()->first();🛠️ Helper функции
Массивы и объекты
php
// array_*
Arr::accessible($value); // Проверка доступности как массив
Arr::add($array, 'key', 'value'); // Добавить если не существует
Arr::collapse($array); // Схлопнуть многомерный массив
Arr::divide($array); // Разделить на ключи и значения
Arr::dot($array); // Преобразовать в dot-нотацию
Arr::except($array, ['key1', 'key2']); // Исключить ключи
Arr::exists($array, 'key'); // Проверка существования ключа
Arr::first($array, $callback); // Первый элемент
Arr::flatten($array); // Схлопнуть в одномерный
Arr::forget($array, 'key'); // Удалить по ключу
Arr::get($array, 'key', 'default'); // Получить с default
Arr::has($array, 'key'); // Проверка наличия
Arr::hasAny($array, ['key1', 'key2']); // Любой из ключей
Arr::only($array, ['key1', 'key2']); // Только эти ключи
Arr::pluck($array, 'key'); // Извлечь значения
Arr::prepend($array, 'value', 'key'); // Добавить в начало
Arr::pull($array, 'key'); // Извлечь и удалить
Arr::random($array, 2); // Случайные элементы
Arr::set($array, 'key', 'value'); // Установить значение
Arr::shuffle($array); // Перемешать
Arr::sort($array); // Сортировать
Arr::where($array, $callback); // Фильтр
Arr::wrap($value); // Обернуть в массив
// data_*
data_get($array, 'key.nested', 'default');
data_set($array, 'key.nested', 'value');
data_fill($array, 'key', 'value'); // Установить если не существуетСтроки
php
// Str::*
use Illuminate\Support\Str;
Str::after('This is my name', 'This is'); // " my name"
Str::afterLast('App\Http\Controllers\Controller', '\\'); // "Controller"
Str::before('This is my name', 'my'); // "This is "
Str::beforeLast('This is my name', 'is'); // "This "
Str::between('This is my name', 'This', 'name'); // " is my "
Str::camel('foo_bar'); // "fooBar"
Str::contains('This is my name', 'my'); // true
Str::containsAll('This is my name', ['my', 'name']); // true
Str::endsWith('This is my name', 'name'); // true
Str::finish('this/string', '/'); // "this/string/"
Str::headline('steve_jobs'); // "Steve Jobs"
Str::is('foo*', 'foobar'); // true (паттерн)
Str::isAscii('Taylor'); // true
Str::isJson('{"foo":"bar"}'); // true
Str::isUuid($value); // true/false
Str::kebab('fooBar'); // "foo-bar"
Str::length('Laravel'); // 7
Str::limit('Very long text', 10); // "Very long..."
Str::lower('LARAVEL'); // "laravel"
Str::upper('laravel'); // "LARAVEL"
Str::plural('child'); // "children"
Str::singular('children'); // "child"
Str::random(40); // Случайная строка
Str::remove('e', 'Peter Piper'); // "Ptr Pipr"
Str::replace('Laravel', 'PHP', 'Laravel is great'); // "PHP is great"
Str::replaceArray('?', ['8:30', '9:00'], 'The event is at ?');
Str::replaceFirst('the', 'a', 'the quick brown fox');
Str::replaceLast('the', 'a', 'the quick brown fox the');
Str::slug('Laravel Framework'); // "laravel-framework"
Str::snake('fooBar'); // "foo_bar"
Str::start('this/string', '/'); // "/this/string"
Str::startsWith('This is my name', 'This'); // true
Str::studly('foo_bar'); // "FooBar"
Str::title('a nice title'); // "A Nice Title"
Str::ucfirst('foo bar'); // "Foo bar"
Str::uuid(); // UUID строка
Str::wordCount('Hello, world!'); // 2
Str::words('Perfectly balanced, as all things should be.', 3);
// "Perfectly balanced, as..."
// str() helper
str('foo bar')->camel(); // "fooBar"
str('foo bar')->kebab(); // "foo-bar"
str('foo bar')->studly(); // "FooBar"Пути
php
app_path(); // /path/to/app
app_path('Http/Controllers'); // /path/to/app/Http/Controllers
base_path(); // /path/to/project
base_path('vendor/bin'); // /path/to/project/vendor/bin
config_path(); // /path/to/config
database_path(); // /path/to/database
public_path(); // /path/to/public
resource_path(); // /path/to/resources
storage_path(); // /path/to/storage
storage_path('app/file.txt'); // /path/to/storage/app/file.txtURL и роуты
php
// URL
url('/posts'); // http://example.com/posts
url()->current(); // Текущий URL
url()->previous(); // Предыдущий URL
url()->full(); // С query string
// Роуты
route('posts.index'); // URL по имени роута
route('posts.show', ['id' => 1]); // С параметрами
route('posts.show', ['post' => $post]); // Route model binding
// Asset
asset('img/photo.jpg'); // http://example.com/img/photo.jpg
secure_asset('img/photo.jpg'); // https://...
mix('css/app.css'); // С версионированием (Mix)Переменные окружения
php
env('APP_ENV'); // Значение из .env
env('APP_DEBUG', false); // С default значением
config('app.name'); // Значение из config
config('app.timezone', 'UTC'); // С default
config(['app.debug' => true]); // Установить runtimeОтветы
php
// Response
response('Hello World', 200);
response()->json(['name' => 'John']);
response()->download($pathToFile);
response()->download($pathToFile, $name, $headers);
response()->file($pathToFile);
response()->streamDownload(function () {
echo 'CSV content';
}, 'export.csv');
// Redirect
redirect('/home');
redirect()->route('posts.index');
redirect()->back();
redirect()->away('https://example.com');
redirect()->action([UserController::class, 'index']);
// С flash данными
redirect('/home')->with('status', 'Task was successful!');
// Abort
abort(404);
abort(403, 'Unauthorized action.');
abort_if($user->id !== $post->user_id, 403);
abort_unless(Auth::check(), 403);Валидация
php
// В контроллере
$validated = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
// Validator facade
$validator = Validator::make($request->all(), [
'title' => 'required|max:255',
]);
if ($validator->fails()) {
return redirect('/post/create')
->withErrors($validator)
->withInput();
}
// Правила
'required'
'nullable'
'email'
'unique:users,email'
'unique:users,email,10' // Исключить ID
'exists:users,id'
'min:3'
'max:255'
'size:10'
'between:1,100'
'in:foo,bar,baz'
'not_in:foo,bar,baz'
'numeric'
'integer'
'string'
'array'
'boolean'
'date'
'date_format:Y-m-d'
'after:tomorrow'
'before:2024-12-31'
'confirmed' // password_confirmation
'same:field'
'different:field'
'regex:/pattern/'
'alpha'
'alpha_dash'
'alpha_num'
'url'
'active_url'
'ip'
'json'
'mimes:jpg,png'
'image'
'dimensions:min_width=100,min_height=200'
'file'
'max:10240' // KB для файловКоллекции
php
collect([1, 2, 3])->all();
collect([1, 2, 3])->avg();
collect([1, 2, 3])->chunk(2);
collect([1, 2, 3, 4])->collapse();
collect([1, 2, 3])->contains(2);
collect([1, 2, 3])->count();
collect([1, 2, 2])->countBy();
collect([1, 2, 3])->diff([2, 3, 4]);
collect(['a' => 1, 'b' => 2])->diffKeys(['b' => 2, 'c' => 3]);
collect([1, 2, 3])->each(function ($item) { });
collect([1, 2, 3])->every(function ($item) { return $item > 0; });
collect([1, 2, 3])->filter(function ($item) { return $item > 1; });
collect([1, 2, 3])->first();
collect([1, 2, 3])->firstWhere('id', 1);
collect([[1, 2], [3, 4]])->flatten();
collect([1, 2, 3])->flip();
collect([1, 2, 3])->forget(1);
collect(['a' => 1, 'b' => 2])->get('a');
collect([['id' => 1], ['id' => 2]])->groupBy('id');
collect([1, 2, 3])->has(0);
collect([1, 2, 3])->implode(', ');
collect([1, 2, 3])->isEmpty();
collect([1, 2, 3])->isNotEmpty();
collect(['a' => 1, 'b' => 2])->keys();
collect([1, 2, 3])->last();
collect([1, 2, 3])->map(function ($item) { return $item * 2; });
collect([1, 2, 3])->max();
collect([1, 2, 3])->merge([4, 5]);
collect([1, 2, 3])->min();
collect(['a' => 1, 'b' => 2])->only(['a']);
collect([1, 2, 3])->pluck('name');
collect([1, 2])->pop();
collect([1, 2])->prepend(0);
collect(['a' => 1, 'b' => 2])->pull('a');
collect([1, 2])->push(3);
collect([1, 2, 3])->random();
collect([1, 2, 3])->reduce(function ($carry, $item) { });
collect([1, 2, 3])->reject(function ($item) { });
collect([1, 2, 3])->reverse();
collect([1, 2, 3])->search(2);
collect([1, 2])->shift();
collect([1, 2, 3])->shuffle();
collect([1, 2, 3])->skip(1);
collect([1, 2, 3])->slice(1, 1);
collect([3, 1, 2])->sort();
collect([['name' => 'Desk']])->sortBy('name');
collect([1, 2, 3])->splice(1, 1);
collect([1, 2, 3])->sum();
collect([1, 2, 3])->take(2);
collect([1, 2, 3])->toArray();
collect([1, 2, 3])->toJson();
collect([1, 2, 3])->transform(function ($item) { });
collect([1, 2, 2])->unique();
collect(['a' => 1, 'b' => 2])->values();
collect([1, 2, 3])->when(true, function ($collection) { });
collect([1, 2, 3])->where('id', 1);
collect([1, 2, 3])->whereIn('id', [1, 2]);
collect([1, 2, 3])->whereNotIn('id', [1, 2]);
collect([1, null, 3])->whereNotNull();
collect([1, null, 3])->whereNull();
collect([1, 2, 3, 4])->zip([5, 6, 7, 8]);Логирование
php
use Illuminate\Support\Facades\Log;
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
// С контекстом
Log::info('User login', ['id' => $user->id]);
// Конкретный channel
Log::channel('slack')->info('Something happened!');
Log::stack(['single', 'slack'])->info('Something happened!');Кеширование
php
use Illuminate\Support\Facades\Cache;
Cache::get('key');
Cache::get('key', 'default');
Cache::get('key', function () { return 'default'; });
Cache::has('key');
Cache::missing('key');
Cache::put('key', 'value', $seconds);
Cache::put('key', 'value', now()->addMinutes(10));
Cache::forever('key', 'value');
Cache::remember('users', $seconds, function () {
return DB::table('users')->get();
});
Cache::rememberForever('users', function () {
return DB::table('users')->get();
});
Cache::pull('key'); // Получить и удалить
Cache::forget('key');
Cache::flush(); // Очистить весь кеш
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::add('key', 'value', $seconds); // Добавить если не существует
// Блокировки
Cache::lock('foo')->get(function () {
// Выполнить с блокировкой
});Дата и время
php
// Carbon (уже включён в Laravel)
use Carbon\Carbon;
now(); // Carbon::now()
today(); // Carbon::today()
$date = now();
$date->format('Y-m-d H:i:s');
$date->toDateString(); // "2024-01-30"
$date->toDateTimeString(); // "2024-01-30 15:30:00"
$date->toTimeString(); // "15:30:00"
$date->addDays(5);
$date->subDays(5);
$date->addMonths(1);
$date->addYears(1);
$date->startOfDay();
$date->endOfDay();
$date->startOfMonth();
$date->endOfMonth();
$date->diffInDays($otherDate);
$date->diffForHumans(); // "5 days ago"
$date->isPast();
$date->isFuture();
$date->isToday();
$date->isYesterday();
$date->isTomorrow();Прочие
php
// Session
session('key');
session('key', 'default');
session(['key' => 'value']);
session()->get('key');
session()->put('key', 'value');
session()->has('key');
session()->forget('key');
session()->flush();
session()->flash('status', 'Task completed!');
// Auth
auth()->user();
auth()->id();
auth()->check();
auth()->guest();
auth()->login($user);
auth()->logout();
// Encryption
encrypt('secret');
decrypt($encryptedValue);
// Hash
Hash::make('password');
Hash::check('password', $hashedPassword);
Hash::needsRehash($hashed);
// CSRF
csrf_token();
csrf_field(); // <input type="hidden" name="_token">
method_field('PUT'); // <input type="hidden" name="_method">
// Прочее
bcrypt('password');
now();
today();
optional($user)->name; // Безопасный доступ
tap($user, function ($user) {
$user->update(['active' => true]);
});
throw_if($invalidCondition, Exception::class);
throw_unless($validCondition, Exception::class);
value(function () { return 'result'; }); // Выполнить callable
with($user)->name; // То же что $user->name📦 Blade директивы
blade
{{-- Комментарий --}}
{{-- Вывод переменных --}}
{{ $name }}
{{ $name ?? 'Default' }}
{!! $html !!} {{-- Без экранирования --}}
{{-- Условия --}}
@if($condition)
...
@elseif($otherCondition)
...
@else
...
@endif
@unless($condition)
...
@endunless
@isset($variable)
...
@endisset
@empty($variable)
...
@endempty
@auth
{{-- Пользователь авторизован --}}
@endauth
@guest
{{-- Пользователь гость --}}
@endguest
@production
{{-- Production окружение --}}
@endproduction
@env('local')
{{-- Local окружение --}}
@endenv
{{-- Switch --}}
@switch($type)
@case('admin')
...
@break
@case('user')
...
@break
@default
...
@endswitch
{{-- Циклы --}}
@for($i = 0; $i < 10; $i++)
{{ $i }}
@endfor
@foreach($users as $user)
{{ $user->name }}
@endforeach
@forelse($users as $user)
{{ $user->name }}
@empty
Нет пользователей
@endforelse
@while($condition)
...
@endwhile
{{-- $loop переменная в циклах --}}
$loop->index {{-- Индекс с 0 --}}
$loop->iteration {{-- Итерация с 1 --}}
$loop->remaining {{-- Осталось итераций --}}
$loop->count {{-- Всего элементов --}}
$loop->first {{-- Первая итерация --}}
$loop->last {{-- Последняя итерация --}}
$loop->even {{-- Чётная итерация --}}
$loop->odd {{-- Нечётная итерация --}}
$loop->depth {{-- Глубина вложенности --}}
$loop->parent {{-- Родительский $loop --}}
{{-- Подключение шаблонов --}}
@include('view.name')
@include('view.name', ['var' => $value])
@includeIf('view.name')
@includeWhen($condition, 'view.name')
@includeFirst(['custom.view', 'default.view'])
{{-- Layouts --}}
@extends('layouts.app')
@section('title', 'Page Title')
@section('content')
...
@endsection
@yield('content')
@yield('content', 'Default content')
@parent {{-- Вывести родительский контент --}}
{{-- Components --}}
<x-alert type="error" :message="$message" />
@props(['type', 'message'])
{{ $slot }} {{-- Основной слот --}}
<x-card>
<x-slot:header>
Header content
</x-slot>
Main content
</x-card>
{{-- Стеки --}}
@push('scripts')
<script src="/example.js"></script>
@endpush
@stack('scripts')
@prepend('scripts')
<script src="/first.js"></script>
@endprepend
{{-- Once --}}
@once
<script>
// Выполнится только один раз
</script>
@endonce
{{-- PHP код --}}
@php
$counter = 0;
@endphp
{{-- CSRF и методы --}}
@csrf {{-- <input type="hidden" name="_token"> --}}
@method('PUT') {{-- <input type="hidden" name="_method"> --}}
{{-- Прочее --}}
@json($array) {{-- JSON.stringify --}}
@error('email')
<div>{{ $message }}</div>
@enderror
@can('update', $post)
{{-- Проверка прав --}}
@endcan
@cannot('update', $post)
...
@endcannot
@canany(['update', 'delete'], $post)
...
@endcanany
@verbatim
{{ Не обрабатывается Blade }}
@endverbatim🎯 Полезные паттерны
Repository Pattern
php
// PostRepository.php
class PostRepository
{
public function all()
{
return Post::all();
}
public function find($id)
{
return Post::findOrFail($id);
}
public function create(array $data)
{
return Post::create($data);
}
}
// PostController.php
public function __construct(private PostRepository $repository)
{
}
public function index()
{
return $this->repository->all();
}Service Pattern
php
// UserService.php
class UserService
{
public function register(array $data)
{
DB::transaction(function () use ($data) {
$user = User::create($data);
$user->profile()->create([...]);
Mail::to($user)->send(new WelcomeEmail);
return $user;
});
}
}
// RegisterController.php
public function store(Request $request, UserService $service)
{
$user = $service->register($request->validated());
return redirect()->route('home');
}Query Builder с Pipe
php
$users = User::query()
->when($request->search, fn($q) =>
$q->where('name', 'like', "%{$request->search}%")
)
->when($request->status, fn($q) =>
$q->where('status', $request->status)
)
->paginate();Collection Pipeline
php
$result = collect($users)
->filter(fn($user) => $user->isActive())
->map(fn($user) => [
'name' => $user->name,
'email' => $user->email,
])
->sortBy('name')
->values();🔥 Быстрые команды для ежедневной работы
bash
# Новый проект
composer create-project laravel/laravel my-app
cd my-app
cp .env.example .env
php artisan key:generate
php artisan migrate
# Создать CRUD за 30 секунд
php artisan make:model Post -mfsc
php artisan migrate
# Очистить всё
php artisan optimize:clear
# Запустить тесты
php artisan test --parallel
# Посмотреть routes
php artisan route:list
php artisan route:list --except-vendor
# Tinker для быстрых проверок
php artisan tinker
>>> User::count()
>>> User::factory()->create()
# Git workflow
git add .
git commit -m "Feature: Add user registration"
git pushСовет: Добавь эту шпаргалку в закладки и возвращайся к ней, когда забудешь синтаксис. Это нормально — даже опытные разработчики постоянно гуглят документацию! 🚀