Как заставить Laravel вернуть заголовок «Content-Type» в виде «application / javascript»?

Я пытаюсь вывести динамический файл javascript для включения с внешних сайтов с тегом [script src=""] . Поскольку представление использует движок Blade, оно отображается как text/html .

Я хотел бы, чтобы заголовок Content-Type был настроен на application/javascript для этого представления, чтобы избежать того, чтобы Chrome прослушивал меня сообщениями, такими как « Resource interpreted as Script but transferred with MIME type text/html: »

Мой контроллер:

 { // ... return View::make('embedded')->with('foo', $foo); } 

Само представление:

 <?php header('Content-Type: application/javascript; charset=UTF-8', true); ?>(function(jQuery) { // append stylesheets to <head> var file; // ... })(jQuery); 

Я обнаружил, что я могу использовать header() в своем представлении, чтобы добавить пользовательские заголовки, такие как X-Content-Type как ожидалось, однако, когда я пытаюсь переопределить заголовок Content-Type он, похоже, ничего не делает даже с replace параметр установлен как true .

Я, конечно, пропустил что-то очевидное здесь, хотел бы, чтобы вы указали мне это 🙂

Большое спасибо за вашу помощь

Laravel позволяет вам изменять информацию заголовка с помощью класса Response, поэтому вы должны использовать его. Удалите строку header из вашего представления и попробуйте сделать это в своем контроллере:

 $contents = View::make('embedded')->with('foo', $foo); $response = Response::make($contents, $statusCode); $response->header('Content-Type', 'application/javascript'); return $response; 

В Laravel 5.4 вы можете сделать это:

 $contents = view('embedded')->with('foo', $foo); return response($contents)->header('Content-Type', 'application/javascript'); 

BTW, нет необходимости устанавливать заголовок в представлении.

Если у вас просто есть JSON в переменной, и вы хотите отправить его в браузер с соответствующим типом содержимого в заголовке, все, что вам нужно сделать, это:

 return Response::json($json); 

предполагая, очевидно, что $json содержит ваш JSON.

В зависимости от деталей вашей ситуации может возникнуть больше смысла использовать представления (а не создавать JSON путем объединения строк), но это все равно вариант, если вы используете представление для построения строки. Что-то примерно в этом направлении должно работать:

 $json = View::make('some_view_template_that_makes_json') -> with ('some_variable', $some_variable) return Response::json($json); 

(Извините, если я пропустил какую-то часть вопроса, требующую более ручного подхода! По крайней мере, это должно быть полезно для кого-то другого, приезжающего сюда, и задается вопросом, как отправить JSON из Laravel с правильным набором типов контента.)

Response :: json () больше не доступен.

Вместо этого вы можете использовать response-> json ().

 use Illuminate\Contracts\Routing\ResponseFactory; $foobar = ['foo' => 0, 'bar' => 'baz']; return response()->json($foobar); 

дает:

 {"foo":0,"bar":"baz"} 

С соответствующими заголовками.