use Illuminate\Queue\Attributes\Queue;#[Queue('emails')]class SendWelcomeEmail implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function handle(): void { // ... }}
从 v13.2.0 起,除了字符串也可以传入 enum。
enum QueueName: string{ case Emails = 'emails'; case Orders = 'orders'; case Notifications = 'notifications';}#[Queue(QueueName::Emails)]class SendWelcomeEmail implements ShouldQueue{ // ...}
use Illuminate\Queue\Attributes\Connection;#[Connection('sqs')]class ProcessPayment implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function handle(): void { // ... }}
同样也支持 enum。
enum QueueConnection: string{ case Redis = 'redis'; case Sqs = 'sqs'; case Database = 'database';}#[Connection(QueueConnection::Sqs)]class ProcessPayment implements ShouldQueue{ // ...}
use Illuminate\Queue\Attributes\DeleteWhenMissingModels;#[DeleteWhenMissingModels]class SendOrderConfirmation implements ShouldQueue{ public function __construct( protected Order $order, ) {} public function handle(): void { // 当 $order 不存在时,该 Job 会被删除 }}
use Illuminate\Queue\Attributes\WithoutRelations;#[WithoutRelations]class ExportUser implements ShouldQueue{ public function __construct( protected User $user, ) {}}
use Illuminate\Queue\Attributes\Backoff;use Illuminate\Queue\Attributes\Connection;use Illuminate\Queue\Attributes\DeleteWhenMissingModels;use Illuminate\Queue\Attributes\FailOnTimeout;use Illuminate\Queue\Attributes\MaxExceptions;use Illuminate\Queue\Attributes\Queue;use Illuminate\Queue\Attributes\Timeout;use Illuminate\Queue\Attributes\Tries;#[Queue('payments')]#[Connection('redis')]#[Tries(3)]#[Backoff(30, 60, 120)]#[Timeout(60)]#[MaxExceptions(2)]#[DeleteWhenMissingModels]class ProcessPayment implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function __construct( protected Order $order, ) {} public function handle(PaymentService $payment): void { $payment->charge($this->order); }}
use Illuminate\Database\Eloquent\Attributes\ScopedBy;#[ScopedBy(ActiveScope::class)]class User extends Model{ // 无需在 booted() 中注册作用域}
要绑定多个作用域时,可重复使用属性或以数组形式传入。
// 重复指定(IS_REPEATABLE)#[ScopedBy(ActiveScope::class)]#[ScopedBy(VerifiedScope::class)]class User extends Model{}// 用数组一次指定#[ScopedBy([ActiveScope::class, VerifiedScope::class])]class User extends Model{}
与传统的 booted() 方法对比。
// 传统写法class User extends Model{ protected static function booted(): void { static::addGlobalScope(new ActiveScope); static::addGlobalScope(new VerifiedScope); }}
use Illuminate\Database\Eloquent\Attributes\Scope;class User extends Model{ #[Scope] public function active(Builder $query): void { $query->where('active', true); } #[Scope] public function verified(Builder $query): void { $query->whereNotNull('email_verified_at'); }}
// 传统写法方法名需带「scope」前缀// public function scopeActive(Builder $query): void// 使用属性后方法名直接作为作用域名User::query()->active()->verified()->get();
// 队列名的 enum 定义enum Queue: string{ case Default = 'default'; case High = 'high'; case Low = 'low'; case Emails = 'emails'; case Orders = 'orders';}// 连接的 enum 定义enum Connection: string{ case Redis = 'redis'; case Sqs = 'sqs'; case Database = 'database'; case Sync = 'sync';}