Laravel полон скрытых жемчужин, недокументированных или малоизвестных функций, опций и «хаков». Все что я нашёл, за время своей работы, я оформил в отдельную статью. Это вторая её часть, а первую вы можете прочесть здесь: Советы по Laravel. Часть 1.
Вы можете создать группу маршрутов с динамическим именем субдомена и передать это значение каждому маршруту.
Route::domain('{username}.workspace.com')->group(function () {
Route::get('user/{id}', function ($username, $id) {
//
});
});
Вы можете узнать версию Laravel запустив команду:
php artisan --version
Если вы хотите проверить содержимое электронной почты в своем приложении, но не можете или не хотите настраивать какой-нибудь Mailgun,
то используйте .env параметр MAIL_DRIVER=log, и вся почта будет сохраняться в файл storage/logs/laravel.log, вместо фактической отправки.
Если вы хотите создать страницу для определенной ошибки HTTP, например, 500 — просто создайте blade-файл с этим кодом в качестве имени файла в папке resources/views/errors/500.blade.php или 403.blade.php и она будет автоматически загружена в случае возникновения этой ошибки.
Когда вы используете фабрики для заполнения данных, вы можете использовать функцию обратного вызова для выполнения каких-либо действий после вставки записи.
$factory->afterCreating(App\User::class, function ($user, $faker) {
$user->accounts()->save(factory(App\Account::class)->make());
});
При создании команды Artisan вы можете запрашивать ввод различными способами: $this->confirm(), $this->anticipate(), $this->choice().
// Да или нет?
if ($this->confirm('Хотите продолжить?')) {
//
}
// Вопрос с опцией автозаполнения
$name = $this->anticipate('Как тебя зовут?', ['Taylor', 'Dayle']);
// Один из перечисленных вариантов с индексом по умолчанию
$name = $this->choice('Как тебя зовут?', ['Taylor', 'Dayle'],
$defaultIndex);
Если вы используете Mailables для отправки электронной почты, вы можете просмотреть результат без отправки, прямо в браузере. Просто верните Mailable в маршрут:
Route::get('/mailable', function () {
$invoice = App\Invoice::find(1);
return new App\Mail\InvoicePaid($invoice);
});
Если вы хотите, чтобы в маршруте просто отображался определенный шаблон, то не создавайте метод в контроллере, просто используйте функцию Route::view().
// Вместо этого
Route::get('about', 'TextsController@about');
// и этого
class TextsController extends Controller
{
public function about()
{
return view('texts.about');
}
}
// сделайте так
Route::view('about', 'texts.about');
Вместо оператора if для проверки зарегистрированного пользователя используйте директиву @auth.
Обычный способ:
@if(auth()->user())
// Пользователь аутентифицирован.
@endif
Короче:
@auth
// Пользователь аутентифицирован.
@endauth
При вызове Model::all() вы можете указать, какие поля возвращать:
$users = User::all(['id', 'name', 'email']);
Не забудьте изменить APP_URL в вашем файле .env с http://localhost на реальный URL, потому что он используется для ссылок в ваших почтовых уведомлениях, да и в других местах тоже.
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:9PHz3TL5C4YrdV6Gg/Xkkmx9btaE93j7rQTUZWm2MqU=
APP_DEBUG=true
APP_URL=http://localhost
Хотите знать, какие маршруты на самом деле стоят за 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');
}
В дополнение к findOrFail(), есть также метод firstOrFail(), который вернет 404 страницу, если запись не будет найдена.
$user = User::where('email',
'povilas@laraveldaily.com')->firstOrFail();
В Eloquent Query Builder вы можете указать «as», чтобы вернуть любое поле с другим именем, также как и в обычном SQL запросе
$users = DB::table('users')
->select('name', 'email as user_email')
->get();
Вы можете сделать запись через Log::info() или, более кратко info(), с дополнительными параметрами, чтобы получить больше информации о том, что произошло.
Log::info('User failed to login.', ['id' => $user->id]);
Вы можете назначить модель по умолчанию в отношениях belongsTo, чтобы избежать фатальных ошибок при ее вызове через {{ $post->user->name }}, если $post->user не существует.
/**
* Получить автора сообщения
*/
public function user()
{
return $this->belongsTo('App\User')->withDefault();
}
Если у вас есть отношение hasMany(), вы можете использовать saveMany() для сохранения нескольких «дочерних» записей из вашего «родительского» объекта, одной строкой.
$post = Post::find(1);
$post->comments()->saveMany([
new Comment(['message' => 'Первый комментарий']),
new Comment(['message' => 'Второй комментарий']),
]);
Вместо того, чтобы написать dd($result); вы можете добавить ->dd() как метод непосредственно в конец вашего Eloquent запроса или Коллекции.
// Вместо этого
$users = User::where('name', 'Taylor')->get();
dd($users);
// сделайте это
$users = User::where('name', 'Taylor')->get()->dd();
После Eloquent запроса вы можете изменить полученный результат, используя функцию map() в Коллекциях
$users = User::where('role_id', 1)->get()->map(function (User $user) {
$user->some_column = some_function($user);
return $user;
})
Вы можете настроить сообщения об ошибках валидации для каждого поля, правила и языка — просто создайте файл для конкретного языка resources/lang/xx/validation.php с соответствующей структурой массива
'custom' => [
'email' => [
'required' => 'Нам нужно знать ваш адрес электронной почты!',
],
],
Продолжение: Советы по Laravel. Часть 3.
Автор: Povilas Korop
Перевод: Demiurge Ash