Я реализую метод автоматического экранирования (htmlentities) данных, полученных пользователем, перед возвратом. На данный момент у меня есть BaseModel, от которой наследуются все остальные модели, реализованные следующим образом:
<?php
class BaseModel extends Eloquent
{
public function getAttribute($key)
{
$value = parent::getAttribute($key);
// Escape required fields when necessary
if (isset($this->escapable) && in_array($key, $this->escapable)) {
$value = e($value);
}
return $value;
}
public function attributesToArray()
{
$array = parent::attributesToArray();
if (isset($this->escapable)) {
array_walk($array, function (&$value, $key) {
if (in_array($key, $this->escapable)) {
$value = e($value);
}
});
}
return $array;
}
}
В самой модели я просто расширяю BassModel вместо Eloquent и устанавливаю массив $escapable
почти так же, как атрибут $fillable
protected $escapable = [
'first_name',
'last_name',
/* etc */
];
Это работает на 100% при извлечении отдельного атрибута - getAttribute($key)
- и при возврате всей коллекции - attributesToArray()
, мой вопрос: есть ли другие ситуации, которые я не учел, которые могут позволить вернуть неэкранированные данные? Я вижу, что в Model.php есть функция getAttributes()
, в каких ситуациях она будет вызываться?