Все доступные в Laravel PHP атрибуты

Источник: «All Laravel PHP Attributes at Your Disposal»
Атрибуты PHP — отличный способ добавить метаданные к классам, методам и свойствам. Laravel предоставляет множество атрибутов из коробки, которые можно использовать в приложениях.

Ищете что-то конкретное? Перейдите к интересующему вас атрибуту:

Определение наблюдателя ObservedBy

Атрибут ObservedBy позволяет определить наблюдателя для модели. Это отличный способ сохранить модель чистой и перенести логику наблюдателя в отдельный класс.

use App\Observers\UserObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;

#[ObservedBy([UserObserver::class])]
class User extends Authenticatable
{
//
}

Определение глобальной области видимости ScopedBy

Атрибут ScopedBy позволяет определить глобальную область видимости для модели. Это удобный способ применения общих ограничений запроса к модели.

namespace App\Models;

use App\Models\Scopes\ActiveScope;
use Illuminate\Database\Eloquent\Attributes\ScopedBy;

#[ScopedBy([ActiveScope::class])]
class User extends Model
{
//
}

Контекстные атрибуты

Laravel предоставляет удобный способ обработки инъекции зависимостей для определённых контекстов, таких как инъекция реализаций драйверов или значений конфигурации. Вместо того чтобы вручную настраивать контекстные привязки в сервис-провайдерах, Laravel предлагает ряд атрибутов контекстной привязки. Эти атрибуты упрощают процесс инъекции контекстно-специфических значений.

Возьмём следующие примеры:

namespace App\Http\Controllers;

use Illuminate\Container\Attributes\Auth;
use Illuminate\Container\Attributes\Cache;
use Illuminate\Container\Attributes\Config;
use Illuminate\Container\Attributes\DB;
use Illuminate\Container\Attributes\Log;
use Illuminate\Container\Attributes\Tag;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Cache\Repository;
use Illuminate\Contracts\Database\Connection;
use Psr\Log\LoggerInterface;

class PhotoController extends Controller
{
public function __construct(
#[Auth('web')] protected Guard $auth,
#[Cache('redis')] protected Repository $cache,
#[Config('app.timezone')] protected string $timezone,
#[DB('mysql')] protected Connection $connection,
#[Log('daily')] protected LoggerInterface $log,
#[Tag('reports')] protected iterable $reports,
)
{
// ...
}
}

Laravel даже позволяет внедрять текущего пользователя CurrentUser в маршрут:

use App\Models\User;
use Illuminate\Container\Attributes\CurrentUser;

Route::get('/user', function (#[CurrentUser] User $user) {
return $user;
})->middleware('auth');

Удаление задания при отсутствии моделей DeleteWhenMissingModels

При внедрении моделей в задания можно использовать атрибут DeleteWhenMissingModels для автоматического удаления задания, если внедрённая модель отсутствует в базе данных.

namespace Acme;

use Illuminate\Queue\Attributes\DeleteWhenMissingModels;

#[DeleteWhenMissingModels]
class ProcessPodcastJob
{
public function __construct(
public Podcast $podcast,
) {}
}

Загрузка модели без отношений WithoutRelations

Атрибут WithoutRelations позволяет загрузить модель без отношений. Это может быть удобно, если нужно избежать загрузки ненужных данных.

class ProcessPodcastJob
{
public function __construct(
#[WithoutRelations]
public Podcast $podcast,
) {}
}

Если я что-то пропустил

Если вы знаете другие PHP атрибуты Laravel, пожалуйста, напишите мне (Christoph Rumpel) об этом в Twitter или отправьте PR на GitHub. Я с удовольствием добавлю их в этот список.

P.S. Можно написать в комментарии.

Комментарии


Дополнительные материалы

Предыдущая Статья

Градиентный текст с тенью

Следующая Статья

Новые значения и функции в CSS