Laravel 5模型访问器方法不起作用

时间:2015-05-12 01:05:52

标签: php laravel eloquent laravel-5 accessor

我试图根据我对文档的最佳解释来编写一些访问器方法,但它们似乎并没有起作用。我试图通过在调度的artisan控制台命令中触发的API调用来解密我正在加密的属性。我有一个看起来像这样的模型:

 <?php namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use ET_Client;
use ET_DataExtension;
use ET_DataExtension_Row;
use Crypt;

//child implementation
class MasterPreference extends Model {

////these fields can be mass assigned
    protected $fillable = [
        //
        'SMS_OPT_IN',
        'EMAIL_OPT_IN',
        'CUSTOMER_NAME',
        'CUSTOMER_ID'
    ];

    protected $DE_Names = ['MasterPreferences', 'SubPreferences'];

    protected $results = '';


    //instantiate and replicate
    function __construct()
    {

    }


    /**
     * 
     *
     * @return $getResult
     */
    public function getData()
    {

    }


    /**
     * store to the Db
     */
    public function store($results)
    {

    }


    /**
     * decrypt CUSTOMER_ID
     * @param $value
     * @return mixed
     */
    public function getCustomerIdAttribute($value)
    {

        return Crypt::decrypt($value);
    }

    public function getAccountHolderAttribute($value)
    {
        return $value . 'testing';
    }

    /**
     * ecnrypt Customer ID
     *
     * @param $value
     */
    public function setCustomerIdAttribute($value)
    {
        $this->attributes['CUSTOMER_ID'] = Crypt::encrypt($value);
    }



}

如上所示,我为名为CUSTOMER_ID的属性创建了2个访问器方法,为名为ACCOUNT_HOLDER的attrib创建了另一个访问器方法。当我在MasterPreferencesController的index方法中存储如$ all = MasterPreference :: all()和dd($ all)时,这些属性保持不变。是否有另一个步骤来调用这些访问器方法?他们不应该只是通过Laravel的魔力工作吗?

我感谢任何帮助!我很难过,在文档中找不到这个。

2 个答案:

答案 0 :(得分:2)

我的猜测是Laravel认为你的字段名称是小写的。如果您的字段名称例如为custome_id,则会正确更改其值。

您还可以尝试以下方法:

public function getCustomerIdAttribute($)
{
    return Crypt::decrypt($this->attributes['CUSTOMER_ID']);
}

public function getCustomerIdAttribute($)
{
    return Crypt::decrypt($this->CUSTOMER_ID);
}

然后使用

访问该值
MasterPreference::find($id)->customer_id

不确定是否会起作用。

答案 1 :(得分:2)

让我们看看魔术出错的地方。

基础:

1)您正在扩展班级Illuminate\Database\Eloquent\Model。您在MasterPreference类中声明的函数将覆盖父类的函数,其中名称匹配。

来源:http://php.net/manual/en/keyword.extends.php

问题:

MasterPreference类有一个空的__construct函数。

这会覆盖__construct() Illuminate\Database\Eloquent\Model的{​​{1}}函数,即:

/**
 * Create a new Eloquent model instance.
 *
 * @param  array  $attributes
 * @return void
 */
public function __construct(array $attributes = array())
{
    $this->bootIfNotBooted();

    $this->syncOriginal();

    $this->fill($attributes);
}

你的Accessors&amp; amp;变异器发生在这个代码漩涡中。

解决方案:

因此,MasterPreference的{​​{1}}应如下所示:

__construct