Laravel полон скрытых жемчужин, недокументированных или малоизвестных функций, опций и «хаков». Все что я нашёл, за время своей работы, я оформил в отдельную статью. Это вторая её часть, а первую вы можете прочесть здесь: Советы по Laravel. Часть 1.
Совет 21. Wildcard субдомены
Вы можете создать группу маршрутов с динамическим именем субдомена и передать это значение каждому маршруту.
Route::domain('{username}.workspace.com')->group(function () { Route::get('user/{id}', function ($username, $id) { // }); });
Совет 22. Точная версия Laravel
Вы можете узнать версию Laravel запустив команду:
php artisan --version
Совет 23. Тестирование почты в laravel.log
Если вы хотите проверить содержимое электронной почты в своем приложении, но не можете или не хотите настраивать какой-нибудь Mailgun,
то используйте .env параметр MAIL_DRIVER=log, и вся почта будет сохраняться в файл storage/logs/laravel.log, вместо фактической отправки.
Совет 24. Blade-страницы для ошибок
Если вы хотите создать страницу для определенной ошибки HTTP, например, 500 — просто создайте blade-файл с этим кодом в качестве имени файла в папке resources/views/errors/500.blade.php или 403.blade.php и она будет автоматически загружена в случае возникновения этой ошибки.
Совет 25. Фабричные обратные вызовы
Когда вы используете фабрики для заполнения данных, вы можете использовать функцию обратного вызова для выполнения каких-либо действий после вставки записи.
$factory->afterCreating(App\User::class, function ($user, $faker) { $user->accounts()->save(factory(App\Account::class)->make()); });
Совет 26. Параметры команды Artisan
При создании команды Artisan вы можете запрашивать ввод различными способами: $this->confirm(), $this->anticipate(), $this->choice().
// Да или нет? if ($this->confirm('Хотите продолжить?')) { // } // Вопрос с опцией автозаполнения $name = $this->anticipate('Как тебя зовут?', ['Taylor', 'Dayle']); // Один из перечисленных вариантов с индексом по умолчанию $name = $this->choice('Как тебя зовут?', ['Taylor', 'Dayle'], $defaultIndex);
Совет 27. Предварительный просмотр почтовых сообщений
Если вы используете Mailables для отправки электронной почты, вы можете просмотреть результат без отправки, прямо в браузере. Просто верните Mailable в маршрут:
Route::get('/mailable', function () { $invoice = App\Invoice::find(1); return new App\Mail\InvoicePaid($invoice); });
Совет 28. Не создавайте контроллеры
Если вы хотите, чтобы в маршруте просто отображался определенный шаблон, то не создавайте метод в контроллере, просто используйте функцию Route::view().
// Вместо этого Route::get('about', 'TextsController@about'); // и этого class TextsController extends Controller { public function about() { return view('texts.about'); } } // сделайте так Route::view('about', 'texts.about');
Совет 29. @auth в Blade
Вместо оператора if для проверки зарегистрированного пользователя используйте директиву @auth.
Обычный способ: @if(auth()->user()) // Пользователь аутентифицирован. @endif Короче: @auth // Пользователь аутентифицирован. @endauth
Совет 30. Поля в ::all
При вызове Model::all() вы можете указать, какие поля возвращать:
$users = User::all(['id', 'name', 'email']);
Совет 31. Localhost в .env
Не забудьте изменить APP_URL в вашем файле .env с http://localhost на реальный URL, потому что он используется для ссылок в ваших почтовых уведомлениях, да и в других местах тоже.
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:9PHz3TL5C4YrdV6Gg/Xkkmx9btaE93j7rQTUZWm2MqU= APP_DEBUG=true APP_URL=http://localhost
Совет 32: Что стоит за маршрутами?
Хотите знать, какие маршруты на самом деле стоят за Auth::routs()? Проверьте файл /vendor/laravel/framework/src/illuminate/Routing/Router.php. Обратите внимание, что в Laravel 5.7 появилась опция для проверки электронных писем.
public function auth(array $options = []) { // Authentication Routes... $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); $this->post('logout', 'Auth\LoginController@logout')->name('logout'); // Registration Routes... if ($options['register'] ?? true) { $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register', 'Auth\RegisterController@register'); } // Password Reset Routes... $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request'); $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email'); $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset'); $this->post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update'); // Email Verification Routes... if ($options['verify'] ?? false) { $this->emailVerification(); } } public function emailVerification() { $this->get('email/verify', 'Auth\VerificationController@show')->name('verification.notice'); $this->get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify'); $this->get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend'); }
Совет 33. Ошибка или нет?
В дополнение к findOrFail(), есть также метод firstOrFail(), который вернет 404 страницу, если запись не будет найдена.
$user = User::where('email', 'povilas@laraveldaily.com')->firstOrFail();
Совет 34. Изменение названия поля
В Eloquent Query Builder вы можете указать «as», чтобы вернуть любое поле с другим именем, также как и в обычном SQL запросе
$users = DB::table('users') ->select('name', 'email as user_email') ->get();
Совет 35. Ведение журнала с параметрами
Вы можете сделать запись через Log::info() или, более кратко info(), с дополнительными параметрами, чтобы получить больше информации о том, что произошло.
Log::info('User failed to login.', ['id' => $user->id]);
Совет 36. Модель по умолчанию
Вы можете назначить модель по умолчанию в отношениях belongsTo, чтобы избежать фатальных ошибок при ее вызове через {{ $post->user->name }}, если $post->user не существует.
/** * Получить автора сообщения */ public function user() { return $this->belongsTo('App\User')->withDefault(); }
Совет 37. Используйте hasMany для создания Many
Если у вас есть отношение hasMany(), вы можете использовать saveMany() для сохранения нескольких «дочерних» записей из вашего «родительского» объекта, одной строкой.
$post = Post::find(1); $post->comments()->saveMany([ new Comment(['message' => 'Первый комментарий']), new Comment(['message' => 'Второй комментарий']), ]);
Совет 38. Более удобный DD
Вместо того, чтобы написать dd($result); вы можете добавить ->dd() как метод непосредственно в конец вашего Eloquent запроса или Коллекции.
// Вместо этого $users = User::where('name', 'Taylor')->get(); dd($users); // сделайте это $users = User::where('name', 'Taylor')->get()->dd();
Совет 39. Изменение результата через map
После Eloquent запроса вы можете изменить полученный результат, используя функцию map() в Коллекциях
$users = User::where('role_id', 1)->get()->map(function (User $user) { $user->some_column = some_function($user); return $user; })
Совет 40. Пользовательские сообщения об ошибках валидации
Вы можете настроить сообщения об ошибках валидации для каждого поля, правила и языка — просто создайте файл для конкретного языка resources/lang/xx/validation.php с соответствующей структурой массива
'custom' => [ 'email' => [ 'required' => 'Нам нужно знать ваш адрес электронной почты!', ], ],
Продолжение: Советы по Laravel. Часть 3.
Автор: Povilas Korop
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.