Как заставить Laravel возвращать заголовок View 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.

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Если у вас просто есть 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 с правильным набором типов контента.)

Ответ 4

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

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

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

дает:

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

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

Ответ 5

Это сработало для меня return Response::view($landing)->header('X-Frame-Options', 'DENY');