Советы по Laravel. Часть 2.

Советы по Laravel

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
Перевод: Demiurge Ash