响应可以从页面使用的几乎任何 PHP 方法中返回。这包括所有包含在布局执行生命周期和AJAX 处理程序定义中的 CMS 方法。
从CMS页面、布局或组件方法返回字符串将在此处中止进程并覆盖默认行为,因此此处将显示“Hello World”字符串而不是显示页面。
public function onStart()
{
return 'Hello World';
}从 AJAX 处理器返回一个字符串,将会使用默认键 result 将该字符串添加到响应集合中。请求的分部视图仍将包含在响应中。
public function onDoSomething()
{
return 'Hello World';
// ['result' => 'Hello World']
}从一个路由定义返回字符串将与 CMS 方法的行为相同,并将该字符串作为响应显示。
Route::get('/', function() {
return 'Hello World';
});对于更健壮的解决方案,返回一个 Response 对象,该对象提供多种构建 HTTP 响应的方法。我们将在本文中进一步探讨这个主题。
$contents = 'Page not found';
$statusCode = 404;
return Response::make($contents, $statusCode);请记住,大多数响应方法都是可链式调用的,这允许流畅地构建响应。例如,您可以使用 header 方法将一系列头信息添加到响应中,然后再将其发送给用户:
return Response::make($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');这方面的一个实际示例可以是返回一个XML响应:
return Response::make($xmlString)->header('Content-Type', 'text/xml');该 withCookie 方法允许你轻松地将 Cookie 附加到响应。例如,你可以使用该 withCookie 方法来生成 Cookie 并将其附加到响应实例:
return Response::make($content)->withCookie('name', 'value');该 withCookie 方法接受额外的可选参数 允许您进一步自定义您的 cookie 的属性:
->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)Response 外观可用于方便地生成其他类型的响应实例。
如果你需要访问 Response 类方法,但希望将视图作为响应内容返回,你可以使用 Response::view 方法来方便地实现:
return Response::view('acme.blog::hello')->header('Content-Type', $type);json 方法将自动把 Content-Type 标头设置为 application/json,并使用 json_encode PHP 函数将给定数组转换为 JSON:
return Response::json(['name' => 'Steve', 'state' => 'CA']);如果您想创建 JSONP 响应,您可以除了 setCallback 之外,还使用 json 方法:
return Response::json(['name' => 'Steve', 'state' => 'CA'])
->setCallback(Input::get('callback'));download 方法可用于生成一个响应,该响应会强制用户浏览器下载给定路径的文件(第一个参数)。download 方法可选地接受一个文件名(第二个参数),该文件名将决定用户下载时所看到的文件名,以及一个 HTTP 头部数组(第三个参数)。
return Response::download($pathToFile);
return Response::download($pathToFile, $name, $headers);
return Response::download($pathToFile)->deleteFileAfterSend(true);Symfony HttpFoundation, 管理文件下载的, 要求正在下载的文件具有 ASCII 文件名。
在某些情况下,您可能希望将字符串响应转换为可下载响应,而无需将内容写入磁盘。使用 streamDownload 方法解决此问题,该方法接受一个回调(第一个参数)、文件名(第二个参数)以及一个可选的标头数组(第三个参数)。
return Response::streamDownload(function() {
echo 'CSV Contents...';
}, 'export.csv');file 方法用于在用户的浏览器中直接显示文件,例如图片或 PDF,而不是启动下载。此方法接受文件路径(第一个参数)以及一个头部数组(第二个参数)。
return Response::file($pathToFile);
return Response::file($pathToFile, $headers);重定向响应通常是 Illuminate\Http\RedirectResponse 类的实例,并包含将用户重定向到另一个 URL 所需的正确标头。生成 RedirectResponse 实例的最简单方法是使用 Redirect 外观上的 to 方法。
return Redirect::to('user/login');重定向到新的 URL 并 将数据闪存到会话 通常同时进行。因此,为方便起见,您可以创建一个 RedirectResponse 实例,并通过单个方法链将数据闪存到会话中:
return Redirect::to('user/login')->with('message', 'Login Failed');由于
with方法将数据闪存到会话中,您可以使用典型的Session::get方法来检索数据。
您可能希望将用户重定向到他们之前的位置,例如,在表单提交后。 您可以通过使用 back 方法来实现:
return Redirect::back();
return Redirect::back()->withInput();有时你只想简单地刷新当前页面,你可以使用 refresh 方法来完成:
return Redirect::refresh();如果你想定义一个可供你在各种路由和控制器中重复使用的自定义响应,你可以使用 Response::macro 方法:
Response::macro('caps', function($value) {
return Response::make(strtoupper($value));
});macro 函数接受一个名称作为其第一个参数,以及一个闭包作为其第二个。当在 Response 类上调用宏名称时,该宏的闭包将被执行:
return Response::caps('foo');您可以在 插件注册文件 的 boot 方法中定义宏。或者,插件可以在其插件目录中提供一个名为 init.php 的文件,您可以使用该文件来放置宏注册。
视图是存储基于系统的表示逻辑的好方法,例如 API 或端点使用的标记,或与 CMS 和后端区域共享的标记。视图也被邮件服务用于提供默认模板内容。视图通常存储在插件的 views 目录中。
一个简单的视图可能看起来像这样:
<!-- View stored in plugins/acme/blog/views/greeting.htm -->
<html>
<body>
<h1>Hello, {{ name }}</h1>
</body>
</html>视图也可以通过使用 .php 扩展名,来使用 PHP 模板进行解析:
<!-- View stored in plugins/acme/blog/views/greeting.php -->
<html>
<body>
<h1>Hello, <?= $name ?></h1>
</body>
</html>此视图可以使用 View::make 方法返回到浏览器:
return View::make('acme.blog::greeting', ['name' => 'Charlie']);第一个参数是一个“路径提示”,包含插件名称,用两个冒号 :: 分隔,后跟视图文件名。传递给 View::make 的第二个参数是一个数据数组,应提供给视图。
路径提示区分大小写,并且插件名称应始终为小写。
// Using conventional approach
$view = View::make('acme.blog::greeting')->with('name', 'Steve');
// Using magic methods
$view = View::make('acme.blog::greeting')->withName('steve');在上面的示例中,变量 name 将可以从视图访问,并将包含 Steve。如上所述,如果你想传递一个数据数组,你可以将其作为 make 方法的第二个参数来传递:
$view = View::make('acme.blog::greeting', $data);也可以在所有视图之间共享一份数据:
View::share('name', 'Steve');有时你可能希望将一个视图传递到另一个视图中。例如,给定一个存储在 plugins/acme/blog/views/child/view.php 的子视图,我们可以像这样将其传递给另一个视图:
$view = View::make('acme.blog::greeting')->nest('child', 'acme.blog::child.view');
$view = View::make('acme.blog::greeting')->nest('child', 'acme.blog::child.view', $data);子视图然后可以从父视图渲染:
<html>
<body>
<h1>Hello!</h1>
{{ child|raw }}
</body>
</html>如果您需要检查视图是否存在,请使用 View::exists 方法:
if (View::exists('acme.blog::mail.customer')) {
//
}