2016-10-07 1 views
1

일반적인 문제인 것처럼 느껴지지만 답변을 찾을 수 없었습니다. 블레이드 템플릿은 {{ $variable }}으로 쉽게 탈출 HTML을 만들지 만, json을 ajax 요청으로 출력하기위한 것이지 그다지 많지 않습니다.json 결과를 반환 할 때 html을 벗어나는 좋은 "Laravel way"가 있습니까?

필자는 사용자가 입력 한 데이터에 대해 많은 ajax 호출을 수행하고 결과를 JSON으로 클라이언트에 전달하여 jQuery DataTable에서 렌더링하는 앱을 사용하고 있습니다. 따라서이 시나리오를 고려하십시오

$contacts = Contact::whereUserId(Auth::id()) 
       ->select('id', 'first_name', 'last_name', 'email', 'age') 
       ->get(); 

return response()->json($contacts); 

내가 같은 이름과 성으로, DataTable을 그들을 렌더링하기 전에 HTML/스크립트 주입을위한 그 이름 필드를 탈출하고 싶다. 내가 생각할 수있는 유일한 방법은 컬렉션의 각 행을 반복하고, 각 필드마다 루프를 돌리고 문자열 인 경우 e()을 사용하는 것입니다.

Laravel 프레임 워크에이 프로세스를 처리 할 수있는 것이 있습니까? 아니면 좋은 패키지? 내가 toJson()이 실행될 때마다 실행하지 않을 것입니다. 실행하고 싶지 않거나, API 호출이고 raw json 데이터를 반환해야하는 경우가있을 수 있습니다.

어떤 조언이 필요합니까? 저는 현재 Laravel 5.2에 있습니다.

레코드의 경우 일부 필드 만 html을 포함합니다.

업데이트 : 의견에서 지적한대로 DataTables를 사용하고 있습니다. 현재는 render 옵션을 사용합니다.이 옵션은 탈출하고 자바 스크립트 기반 스트립 태그/HTML 엔티티 기능을 사용하려는 각 열에서 클로저입니다. 내가 잘못하고있는 것처럼 느껴졌는데, Laravel 프레임 워크에서 블레이드 템플릿을 설정하는 방법이 더 일반적이라는 점을 감안할 때이 기능을 자동으로 수행하는 몇 가지 기능이 있어야한다고 생각했지만 이상적인 솔루션으로 간주됩니까?

+6

이 JSON을 Javascript 클라이언트로 반환하는 경우 Javascript 클라이언트는 그 안에있는 HTML을 올바르게 처리해야 할 필요가 있습니다. Javascript에서는 일반적으로'elem.textContent = someContent'를 사용합니다. 내용을 HTML이 아닌 ** DOM 텍스트 **로 처리하므로 이스케이프 처리는 필요하지 않습니다. 서버에서 탈출하는 것은 잘못된 장소입니다. – deceze

+0

마지막으로, 승리를 위해 @deceze. 이 곳은 도망가는 곳을 이해하지 못하는 사람들로 가득 찬 waaaay입니다. 그 의견을 받아 들일 수 있도록 대답해야합니다. –

+0

허. 나는 그것이 어떻게 든 클라이언트 측에서 벗어나는 것이 안전하지 않을 것이라고 믿었습니다. –

답변

1

jQuery DataTables는 HTML을 이스케이프하지 않으므로 필드에 <b>Text</b>이 포함되어 있으면 테이블에 기본적으로 굵게 표시됩니다.

당신은 아래의 코드를 사용하여 응답 HTML 엔티티를 인코딩 할 수 있습니다 : 당신이 Laravel에 대한 Yajra DataTables를 사용하는 경우

return response()->json(array_map('e', $contacts->toArray())); 

을, 당신이 일부 또는 전부에 HTML 엔티티를 탈출하는 데 사용할 수있는 escapeColumns() 방법이있다 열. 예 :

return Datatables::of($contacts) 
    ->escapeColumns(['first_name', 'last_name') 
    ->make(true); 
관련 문제