2017-01-13 2 views
0

API를 만들지 만 API 응답에서 Vue.js에 테이블 등을 동적으로 생성하기 때문에 블레이드 html을 이스케이프 처리 할 수 ​​없습니다.Laravel 5 Global Mutator가 모든 html 문자를 이스케이프 처리합니까?

public function getNameAttribute($value) { 
    return strtolower($value); // example 
} 

그러나 우리는 많은 모델을 통해 편집 할 수 있습니다 많은 필드가 :

는 내 모델에서 나는 뮤 테이터를 사용할 수 있습니다 알고 있습니다. htmlspecialchars()로 모든 값을 자동으로 반환 할 수있는 방법이 있습니까?

또는 모든 필드에서 htmlspecialchars()를 실행하도록 API 응답을 변경하는 유일한 방법은 무엇입니까?

감사합니다.

편집 : Laravel Spark를 사용합니다. 제안 된 대답은 새 모델을 만들어 모델에서 확장하는 것이었지만 Spark 모델에는 이미 확장 클래스 목록이 많이 있습니다.

답변

0

Model 클래스를 확장하고 Model 대신이 클래스를 확장하는 모든 클래스를 만들 수 있습니다. 클래스 오버라이드 getAttributeValue 방법 :

protected function getAttributeValue($key) 
{ 
    $value = $this->getAttributeFromArray($key); 

    if ($this->hasGetMutator($key)) { 
     return $this->mutateAttribute($key, $value); 
    } 

    if ($this->hasCast($key)) { 
     return $this->castAttribute($key, $value); 
    } 

    if (in_array($key, $this->getDates()) && ! is_null($value)) { 
     return $this->asDateTime($value); 
    } 

    return is_string($value) ? htmlspecialchars($value) : $value; 
} 
+0

그건 내 초기 생각 이었어. 돌아가서 질문을 편집 하겠지만 실제로 Laravel Spark를 사용하고 있습니다. 우리의 커스텀 모델은 괜찮습니다.하지만 Spark User 모델은 SparkUser를 확장합니다. 그러면 SparkUser가 Authenticatable 등을 확장합니다. – Lovelock

0

클래스를 확장하는 것 외에. 다른 해결책은 특성을 사용하는 것입니다.

이 필요합니다 모델에 새로운 특성을

namespace App\Traits; 

trait ExtendedModel { 

    public function getNameAttribute($value) 
    { 
     return strtolower($value); // example 
    } 
} 

사용 특성을 만듭니다

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use App\Traits\ExtendedModel; 

class MyTable extends Model 
{ 
    use ExtendedModel; 
} 
0

이 내가 이런 짓을 했을까 방법이다.

나는 특성을 만들고 원하는 모든 모델에이 특성을 첨부 할 것이다.

특성은 자신의 논리로 getAttributeValue($key) 메서드를 재정의합니다. 이와 같이 :

trait CastAttributes { 

    public function getAttributeValue($value) 
    { 
     $value = $this->getAttributeValue($value); 
     return is_string($value) ? strtolower($this->getAttributeValue($value)) : $val; 
    } 
} 

그 사인은 절대적으로 모든 것을 내고 싶지는 않을 것이라고 말했다.

trait CastAttributes { 

    protected $toLower = []; 

    public function getAttributeValue($key) 
    { 
     $value = $this->getAttributeValue($key); 
     return in_array($key, $this->toLower) ? strtolower($value) : $value; 
    } 
} 

을 그리고 당신이 실제로 소문자로 캐스팅 할 모든 속성과 $toLower 배열을 오버라이드 (override) :이 경우에 나는이 작업을 수행 할 것입니다.

관련 문제