如何将访问器方法从模型移动到特征?

问题描述 投票:0回答:1

我的模型中有一些访问器,我想将它们移动到一个特征,但我收到了一个不知道如何修复的错误。请帮助我如何处理。顺便说一句,我是 Laravel 的新手!

这是我的商家模型:

<?php

namespace App\Models\Merchant;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use App\Models\Merchant\BankAccount;
use App\Traits\LabelAccessor;

class Merchant extends Model
{
    use HasFactory, SoftDeletes, LabelAccessor;

    protected $connection = 'mysql2';
    protected $guarded = ['email_verified_at', 'telephone_verified_at', 'rejcted_at', 
    'profile_verified_at', 'shaparak_verified_at'];

    public function bankAccounts()
    {
        return $this->hasMany('App\Models\Merchant\BankAccount');
    }

}

这是我的特点:

<?php

namespace App\Traits;


trait LabelAccessor 
{
protected $appends = [
    'gender_label', 'merchant_type_label', 'residency_type_label', 'vital_status_label', 
    'birth_crtfct_series_letter_label'
];
public function getGenderLabelAttribute()
{
    $label = '';
    switch ($this->gender) {
        case '0':
            $label = 'زن';
            break;
        case '1':
            $label = 'مرد';
            break;
    }
    return $label;
}

public function getMerchantTypeLabelAttribute()
{
    $label = '';
    switch ($this->merchant_type) {
        case '0':
            $label = 'حقیقی';
            break;
        case '1':
            $label = 'حقوقی';
            break;
    }
    return $label;
}

public function getResidencyTypeLabelAttribute()
{
    $label = '';
    switch ($this->residency_type) {
        case '0':
            $label = 'ایرانی';
            break;
        case '1':
            $label = 'غیر ایرانی';
            break;
    }
    return $label;
}

public function getVitalStatusLabelAttribute()
{
    $label = '';
    switch ($this->vital_status) {
        case '0':
            $label = 'در قید حیات';
            break;
        case '1':
            $label = 'فوت شده';
            break;
    }
    return $label;
}

public function getBirthCrtfctSeriesLetterLabelAttribute()
{
    $label = '';
    switch ($this->birth_crtfct_series_letter) {
            case '0':
                $label = 'الف';
                break;
            case '1':
                $label = 'ب';
                break;
            case '2':
                $label = 'ل';
                break;
            case '3':
                $label = 'د';
                break;
            case '4':
                $label = 'ر';
                break;
            case '5':
                $label = '1';
                break;
            case '6':
                $label = '2';
                break;
            case '7':
                $label = '3';
                break;
            case '8':
                $label = '4';
                break;
            case '9':
                $label = '9';
                break;
            case '10':
                $label = '10';
                break;
             case '11':
                $label = '11';
                break;
             case '12':
                $label = 'ش';
                break;
        }
        return $label;
    }
}

我收到此错误: Symfony\Component\ErrorHandler\Error\FatalError:Illuminate\Database\Eloquent\Model 和 App\Traits\LabelAccessor 在 App\Models\Merchant\Merchant 的组合中定义相同的属性 ($appends)。然而,定义不同并且被认为是不兼容的。类由文件 C:\xampp\htdocs\milyoona-admin pp\Models\Merchant\Merchant.php 第 11 行组成

php laravel eloquent traits operator-precedence
1个回答
3
投票

发生错误是因为您的

LabelAccessor
特征和 Laravel 的
HasAttributes
特征(默认情况下在
Eloquent
类中使用)都包含
$prepends
属性。这违背了 PHP 特性的本质:

如果一个特征定义了一个属性,那么类不能定义具有相同名称的属性,除非它是兼容的(相同的可见性和初始值),否则会发出致命错误。在 PHP 7.0.0 之前,在类中定义具有与特征中相同的可见性和初始值的属性时,会引发 E_STRICT 通知。

Laracasts 上的 JarekTkaczyk 建议的一种解决方法是在您的特质中使用 getArrayableAppends

 方法:

protected function getArrayableAppends() { $this->appends = array_unique(array_merge($this->appends, [ 'gender_label', 'merchant_type_label', 'residency_type_label', 'vital_status_label', 'birth_crtfct_series_letter_label' ])); return parent::getArrayableAppends(); }
    
© www.soinside.com 2019 - 2024. All rights reserved.