Больше полезных советов по Laravel

Было бы здорово, если бы вы нашли эту статью, содержащую 20 очень полезных и передовых советов по Laravel, которые помогут вам в ваших будущих проектах. Я расскажу только о некоторых советах, которые заинтересовали меня и которые я буду часто использовать, но посетите источник для более глубокого изучения https://ashallendesign.co.uk/blog/20-useful-laravel-tips.

  • Использование полей DATETIME вместо булевых значений
class Post extends Model
{
    public function isPublished(): bool
    {
        return $this->published_at !== null; // is_published
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Использование ‘when’ в PendingRequest
$http = Http::withBasicAuth($username, $password);
if (app()->environment('local')) {
    $http->withoutVerifying();
}

// with when
$http = Http::withBasicAuth($username, $password)
    ->when(app()->environment('local'), function (PendingRequest $request) {
        $request->withoutVerifying();
    });
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Использование getOrPut() в Collections
if (! $collection->has($key)) {
    $collection->put($key, $this->builtItem($data));
}
return $collection->get($key);

// getOrPut()
return $collection->getOrPut($key, fn () => $this->buildItem($data));
Войти в полноэкранный режим Выход из полноэкранного режима
  • Отладка HTTP-запросов
Http::dump()->get($url);
Http::dd()->get($url);
Войти в полноэкранный режим Выход из полноэкранного режима
  • Дублирование моделей

Вы можете дублировать модель следующим образом

$post = Post::find(123);
$copiedPost = $post->replicate();
$copiedPost->save();
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы хотите исключить свойства из копирования, вы можете передать имена полей в виде массива в метод

$post = Post::find(123);
$copiedPost = $post->replicate([
    'author_id',
]);
$copiedPost->save();
Войти в полноэкранный режим Выйти из полноэкранного режима

Кроме того, метод replicate создает несохраненную модель, поэтому вы можете объединить в цепочку ваши обычные методы модели. Например, мы можем скопировать модель и добавить » (copy)» в конец заголовка, чтобы было видно, что модель скопирована.

$post = Post::find(123);
$copiedPost = $post->replicate([
    'author_id',
])->fill([
    'title' => $post->title.' (copy)',
]);
$copiedPost->save();
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Использование функции ‘wasRecentlyCreated’ для моделей
$user = User::firstOrCreate(
    ['email' => request('email')],
    ['name' => request('name')],
);

if ($user->wasRecentlyCreated) {
    // Your user was just created...
} else {
    // Your user already exited and was fetched from the database...
}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Перенос логики в методы

Допустим, мы хотим проверить, одобрен ли пользователь. Наш код может выглядеть следующим образом

if ($user->approved === Approval::APPROVED) {
  // Do something...
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь наша модель может выглядеть следующим образом

class User extends Model
{
    public function isApproved(): bool
    {
        return $this->approved === Approval::APPROVED;
    }
}

// now
if ($user->isApproved()) {
    // Do something...
}
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Изменение ключа для привязки модели маршрута

Допустим, у вас есть маршрут, который принимает slug записи блога

Route::get('blog/{slug}', [BlogController::class, 'show']);

// Model
use AppActionsPublishPost;
use AppModelsPost;

class BlogController extends Controller
{
    public function show($slug)
    {
        $post = Post::where('slug', $slug)->firstOrFail();

        return view('blog.show', [
            'post' => $post,
        ]);
    }
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы упростить и очистить этот код, мы можем обновить параметр slug, чтобы вместо него было post:slug

Route::get('blog/{post:slug}', [BlogController::class, 'show']);

// Model
use AppActionsPublishPost;
use AppModelsPost;

class BlogController extends Controller
{
    public function show(Post $post)
    {
        return view('blog.show', [
            'post' => $post,
        ]);
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Надеюсь, вам понравились эти советы.

Оцените статью
Procodings.ru
Добавить комментарий