2015-05-12 3 views
0

Я пытаюсь написать некоторые методы доступа в соответствии с моей лучшей интерпретацией документации, и они, похоже, не работают. Я пытаюсь расшифровать атрибут, который я шифрую, когда он входит в базу данных, через вызов API, который запускается в запланированной команде консольного мастера. У меня есть модель, которая выглядит следующим образом:Laravel 5 Model Accessor Методы не работают

<?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. Когда я храню, как $ all = MasterPreference :: all() и dd ($ all) в моем методе индекса в MasterPreferencesController, эти атрибуты не изменяются. Есть ли еще один способ вызова этих методов доступа? Разве они не должны работать по волшебству Ларавеля?

Я ценю любую помощь! Я довольно тупой и не могу найти это в документах.

ответ

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 функцию.

Это отменяет __construct() функция Illuminate\Database\Eloquent\Model которая:

/** 
* 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 «s __construct должно быть следующим:

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

Вы, ребята, оба правы в какой-то степени. Вчера вечером я понял, что волшебство происходит, если вы назначаете атрибут напрямую, а не вытягиваете все из модели.Например: '// искать их $ all = MasterPreference :: all(); $ idArray = array(); // значения получают дешифрование с помощью accessor foreach ($ all as $ k => $ val) { $ idArray [] = $ val-> customer_id; } 'НО также был пустым конструктором. – funkenstein

+0

Да, они специально называются «аксессурами». Вы должны получить к ним доступ, чтобы произошло волшебство. Даже если вы вызываете 'toArray()' или 'toJson()', будут применены функции доступа. – Mysteryos

+0

Спасибо! Вы, ребята, оба были очень полезны! – funkenstein

Смежные вопросы