У меня есть модель приложения CakePHP, в которой мне нужно расшифровать два поля. Для этой цели я использую обратный вызов afterFind. Это работает хорошо, но когда я добавляю второе поле в мой $ encryptedFields, расшифровывается только одно поле.
Мой код обратного вызова выглядит следующим образом:
public $encryptedFields = array('name', 'details');
public function beforeSave($options = array()) {
foreach($this->encryptedFields as $fieldName){
if(!empty($this->data[$this->alias][$fieldName])){
$k = 'wt1U5MACWJFTXGenFoZoiLwQGrLgdbHA';
$this->data[$this->alias][$fieldName] = Security::encrypt($this->data[$this->alias][$fieldName], $k);
}
}
return true;
}
public function afterFind($results, $primary = false) {
foreach($this->encryptedFields as $fieldName){
foreach ($results as $key => $val) {
if (isset($val[$this->alias][$fieldName])) {
$k = 'wt1U5MACWJFTXGenFoZoiLwQGrLgdbHA';
$results[$key][$this->alias][$fieldName] = Security::decrypt($val[$this->alias][$fieldName], $k);
}
}
return $results;
}
}
Я включил функцию шифрования в beforeSave для иллюстративных целей, но это работает хорошо и шифрует два поля, как уже говорилось, прежде чем моя проблема, похоже, связана с результатами afterFind $, но у меня нет идей. Может кто-нибудь мне помочь?
Проблема в том, что вы return
от твоего foreach
цикл, прежде чем перебирать каждый элемент в $encryptedFields
массив. Переехать return $results;
вне foreach
цикл, и вы должны быть в состоянии расшифровать оба поля.
public function afterFind($results, $primary = false) {
foreach($this->encryptedFields as $fieldName){
foreach ($results as $key => $val) {
if (isset($val[$this->alias][$fieldName])) {
$k = 'wt1U5MACWJFTXGenFoZoiLwQGrLgdbHA';
$results[$key][$this->alias][$fieldName] = Security::decrypt($val[$this->alias][$fieldName], $k);
}
}
}
return $results; // move this here
}
Других решений пока нет …