2015-05-12 78 views
0

我試圖根據我對文檔的最佳解釋來編寫一些訪問器方法,但他們似乎沒有工作。我試圖解密一個屬性,當它通過調用artisan console命令觸發的API調用進入數據庫時​​,我正在進行加密。我有一個模型,看起來像這樣:Laravel 5模型訪問器方法不起作用

<?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); 
    } 



} 

正如你可以看到上面我已經創建了2種存取方法一個名爲CUSTOMER_ID的屬性,另外一個名爲ATTRIB ACCOUNT_HOLDER。當我在MasterPreferencesController的索引方法中存儲$ all = MasterPreference :: all()和dd($ all)時,這些屬性保持不變。是否有另一個步驟來調用這些訪問器方法?難道他們不應該靠Laravel的魔力來工作嗎?

我感謝任何幫助!我相當難過,無法在文檔中找到它。

回答

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 

不知道和會工作。

2

讓我們來看看魔法出錯的地方。

基礎:

1)你是在擴展類Illuminate\Database\Eloquent\Model。在MasterPreference類中聲明的函數將覆蓋名稱匹配的父類的函數。

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

問題:

MasterPreference類有一個空的__construct功能。

這將覆蓋的Illuminate\Database\Eloquent\Model__construct()功能是:

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

    $this->syncOriginal(); 

    $this->fill($attributes); 
} 

你的訪問者&存取器的魔力發生在這漩渦的代碼。

解決方案:

因此,MasterPreference__construct應該如下:

public function __construct(array $attributes = array()) 
{ 
    parent::__construct($attributes); 
} 
+0

你們都在一定程度上都是正確的。我昨天晚上意識到,如果直接分配屬性而不是將所有東西都拉出模型,那麼魔法的確會發生。像:'//查看它們 $ all = MasterPreference :: all(); $ idArray = array(); //值被訪問者解密 foreach($ all爲$ k => $ val){ $ idArray [] = $ val-> customer_id; '但是也是空白的構造函數是一個問題。 – funkenstein

+0

是的,他們故意被稱爲'accessor'。你必須訪問它們才能發生魔法。即使你調用'toArray()'或'toJson()',訪問函數也會被應用。 – Mysteryos

+0

謝謝!你們都非常有幫助! – funkenstein