>  기사  >  백엔드 개발  >  Laravel 5.5에서 응답을 만드는 방법은 무엇입니까? 응답 생성 소개(코드)

Laravel 5.5에서 응답을 만드는 방법은 무엇입니까? 응답 생성 소개(코드)

不言
不言원래의
2018-07-25 17:27:451652검색

Laravel 5.5에서 응답을 만드는 방법은 무엇입니까? 많은 사람들이 이에 대해 명확하지 않을 수 있으므로 다음에는 Laravel 5.5에서 http 응답을 생성하는 방법과 다른 응답 유형을 소개하겠습니다.

Create response

String & Array

모든 라우트와 컨트롤러는 비즈니스 로직을 처리한 후 사용자의 브라우저로 전송된 응답을 반환합니다. Laravel은 응답을 반환하는 다양한 방법을 제공하며, 가장 기본적인 응답은 다음과 같습니다. 경로나 컨트롤러에서 반환된 간단한 문자열이며 프레임워크는 이 문자열을 완전한 HTTP 응답으로 자동 변환합니다.

Route::get('/', function () {
    return 'Hello World';
});

경로나 컨트롤러에서 문자열을 반환하는 것 외에도 배열을 반환할 수도 있습니다. 프레임워크는 자동으로 배열을 JSON 응답으로 변환합니다.

Route::get('/', function () {
    return [1, 2, 3];
});

참고: 경로나 컨트롤러에서 Eloquent 컬렉션을 반환할 수도 있으며, 이 컬렉션은 자동으로 JSON 응답으로 변환됩니다.

Response 객체

일반적으로 우리는 단순히 경로에서 문자열이나 배열을 반환하는 것이 아니라 대부분의 경우 완전한 IlluminateHttpResponse 인스턴스 또는 뷰가 반환됩니다.

응답의 HTTP 상태 코드와 헤더 정보를 사용자 정의할 수 있는 완전한 응답 인스턴스를 반환합니다. 응답 인스턴스는 HTTP 응답 생성을 위한 일련의 메서드를 제공하는 SymfonyComponentHttpFoundationResponse 기본 클래스에서 상속됩니다.

Route::get('/', function () {
    return response('Hello World', 200)
        ->header('Content-Type', 'text/plain');
});

응답 헤더 추가

대부분의 응답 메서드는 메서드 체인 형태로 호출될 수 있으므로 응답을 스트리밍 방식으로 구성할 수 있습니다(스트리밍 인터페이스 패턴). 예를 들어, 사용자에게 응답을 보내기 전에 header 메소드를 사용하여 일련의 응답 헤더를 추가할 수 있습니다.

return response($content)
    ->header('Content-Type', $type)
    ->header('X-Header-One', 'Header Value')
    ->header('X-Header-Two', 'Header Value');

또는 withHeaders 메서드를 사용하여 응답에 추가할 헤더 배열을 지정할 수 있습니다.

return response($content)
    ->withHeaders([
        'Content-Type' => $type,
        'X-Header-One' => 'Header Value',
        'X-Header-Two' => 'Header Value',
    ]);

응답에 쿠키 추가

응답 인스턴스의 쿠키 메서드를 사용하여 응답에 쿠키를 쉽게 추가하세요. 예를 들어, 쿠키 메서드를 사용하여 쿠키를 생성하고 이를 응답 인스턴스에 추가할 수 있습니다.

return response($content)
    ->header('Content-Type', $type)
    ->cookie('name', 'value', $minutes);

쿠키 메소드는 덜 자주 사용되는 추가 선택적 매개변수를 더 많이 받을 수도 있습니다. 일반적으로 이러한 매개변수는 PHP에서 기본적으로 제공하는 setcookie 메소드와 비슷한 목적과 의미를 갖습니다.

->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)

또한 Cookie 파사드를 사용하여 "대기열" 형태로 응답에 쿠키를 추가할 수 있습니다. 대기열 메소드는 쿠키 인스턴스 또는 응답이 브라우저로 전송되기 전에 응답에 추가될 쿠키를 생성하는 데 필요한 매개변수를 매개변수로 받습니다.

Route::get('cookie/response', function() {
    Cookie::queue(Cookie::make('site', 'www.baidu.com',1));
    Cookie::queue('author', 'admin', 1);
    
    return response('Hello Laravel', 200)
        ->header('Content-Type', 'text/plain');
});

브라우저에서 http://www.adm.devp/cookie/response를 방문하면 이 두 가지 새로운 쿠키를 볼 수 있습니다.

쿠키 암호화

기본적으로 Laravel 프레임워크에서 생성된 쿠키는 클라이언트 측에서 변조되는 것을 방지하기 위해 암호화되고 서명됩니다. 쿠키의 특정 하위 집합이 생성될 때 암호화되지 않도록 하려면 app/Http/Middleware 디렉터리의 미들웨어 AppHttpMiddlewareEncryptCookies가 제공하는 $just 속성을 통해 이러한 쿠키를 제외할 수 있습니다.

/**
 * 不需要被加密的cookies名称
 *
 * @var array
 */
protected $except = [
    'cookie_name',
];

Redirect

리디렉션 응답은 사용자를 다른 URL로 리디렉션하는 데 필요한 헤더 정보가 포함된 IlluminateHttpRedirectResponse 클래스의 인스턴스입니다. RedirectResponse 인스턴스를 생성하는 방법에는 여러 가지가 있습니다. 도우미 함수 리디렉션.

Route::get('dashboard', function () {
    return redirect('home/dashboard');
});

사용자를 이전 요청 위치로 리디렉션하려는 경우가 있습니다. 예를 들어 양식이 제출되고 확인에 실패한 후 보조 기능을 사용하여 이전 URL로 돌아갈 수 있습니다(이 기능은 세션을 사용하기 때문). , 사용 이 방법을 사용하기 전에 해당 경로가 웹 미들웨어 그룹에 위치하거나 세션 미들웨어가 적용되어 있는지 확인하십시오.

Route::post('user/profile', function () {
    // 验证请求...
    return back()->withInput();
});

이름이 지정된 경로로 리디렉션

매개변수 없이 리디렉션 메서드를 호출하면 IlluminateRoutingRedirector 인스턴스가 반환되고 Redirector 인스턴스의 모든 메서드를 사용할 수 있습니다.

예를 들어 명명된 경로에 대한 RedirectResponse를 생성하려면 경로 메서드를 사용할 수 있습니다.

return redirect()->route('login');

경로에 매개변수가 있는 경우 이를 경로 메소드의 두 번째 매개변수로 전달할 수 있습니다.

// For a route with the following URI: profile/{id}
return redirect()->route('profile', ['id'=>1]);

Eloquent 모델을 통해 경로 매개변수를 채웁니다.

ID 매개변수가 있는 경로로 리디렉션하려는 경우( Eloquent 모델 바인딩), 모델 자체를 전달하면 ID가 자동으로 해결됩니다.

return redirect()->route('profile', [$user]);

이 경로 매개변수에서 기본 매개변수 이름(기본값은 id)을 맞춤설정하려면 모델 인스턴스에서 getRouteKey 메서드를 재정의해야 합니다.

/**
 * Get the value of the model's route key.
 *
 * @return mixed
 */
public function getRouteKey()
{
    return $this->slug;
}

컨트롤러 메서드로 리디렉션

컨트롤러로 리디렉션하는 메서드를 생성할 수도 있습니다. 컨트롤러와 메서드 이름을 작업 메서드에 전달하기만 하면 됩니다. Laravel의 RouteServiceProvider가 자동으로 기본 컨트롤러 네임스페이스를 설정하므로 컨트롤러의 전체 네임스페이스를 지정할 필요가 없다는 점을 기억하세요.

return redirect()->action('HomeController@index');

라우트 메소드와 마찬가지로 컨트롤러 라우트에 매개변수가 필요한 경우 해당 매개변수를 액션 메소드의 두 번째 매개변수로 전달할 수 있습니다.

return redirect()->action('UserController@profile', ['id'=>1]);

일회성 세션 데이터로 리디렉션

새 URL로 리디렉션하고 일회성 세션에 데이터를 저장하는 작업은 일반적으로 동시에 수행되므로 편의상 RedirectResponse 인스턴스를 생성한 다음 사용할 수 있습니다. 동일한 메소드 체인 세션에 데이터를 저장합니다. 이는 작업 후 상태 정보를 저장할 때 특히 편리합니다.

Route::post('user/profile', function () {
    // 更新用户属性...
    return redirect('dashboard')->with('status', 'Profile updated!');
});

用户重定向到新页面之后,你可以从 Session 中取出并显示这些一次性信息,使用 Blade 语法实现如下:

@if (session('status'))
    <p class="alert alert-success">
        {{ session(&#39;status&#39;) }}
    </p>
@endif

注:这个一次性体现在第一次从 Session 取出数据之后,这些数据就会被销毁,不复存在。

其它响应类型

上面我们讲了 Response 和 RedirectResponse 两种响应类型,我们还可以通过辅助函数 response 很方便地生成其他类型的响应实例,当无参数调用 response 时会返回 Illuminate\Contracts\Routing\ResponseFactory 契约的一个实现,该契约提供了一些有用的方法来生成各种响应,如视图响应、JSON 响应、文件下载、流响应等等。

视图响应

如果你需要控制响应状态和响应头,并且还需要返回一个视图作为响应内容,可以使用 view 方法。

return response()
        ->view(&#39;hello&#39;, $data, 200)
        ->header(&#39;Content-Type&#39;, $type);

当然,如果你不需要传递自定义的 HTTP 状态码和头信息,只需要简单使用全局辅助函数 view 即可。

Route::get(&#39;view/response&#39;, function() {
   return view(&#39;hello&#39;);
});

注:视图响应的视图文件必须存在,视图文件位于 resources/views 目录中。

JSON响应

json 方法会自动将 Content-Type 头设置为 application/json,并使用 PHP 函数 json_encode 方法将给定数组转化为 JSON 格式的数据。

return response()->json([
        &#39;name&#39; => &#39;Abigail&#39;, 
        &#39;state&#39; => &#39;CA&#39;
]);

如果你想要创建一个 JSONP 响应,可以在 json 方法之后调用 withCallback 方法。

return response()
        ->json([&#39;name&#39; => &#39;Abigail&#39;, &#39;state&#39; => &#39;CA&#39;])
        ->withCallback($request->input(&#39;callback&#39;));

或者直接使用 jsonp 方法。

return response()
        ->jsonp($request->input(&#39;callback&#39;), [&#39;name&#39; => &#39;Abigail&#39;, &#39;state&#39; => &#39;CA&#39;]);

文件下载

download 方法用于生成强制用户浏览器下载给定路径文件的响应。download 方法接受文件名作为第二个参数,该参数决定用户下载文件的显示名称,你还可以将 HTTP 头信息作为第三个参数传递到该方法。

return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
return response()->download($pathToFile)->deleteFileAfterSend(true);

注:管理文件下载的 Symfony HttpFoundation 类要求被下载文件有一个 ASCII 文件名,这意味着被下载文件名不能是中文。

Route::get(&#39;download/response&#39;, function() {
    return response()->download(storage_path(&#39;app/photo/test.jpg&#39;), &#39;测试图片.jpg&#39;);
});

文件响应

file 方法可用于直接在用户浏览器显示文件,例如图片或 PDF,而不需要下载,该方法接收文件路径作为第一个参数,头信息数组作为第二个参数。

return response()->file($pathToFile);
return response()->file($pathToFile, $headers);

响应宏

如果你想要定义一个自定义的可以在多个路由和控制器中复用的响应,可以使用 Response 门面上的 macro 方法。

例如,在某个服务提供者的 boot 方法中编写代码如下:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Response::macro(&#39;caps&#39;, function ($value) {
            return Response::make(strtoupper($value));
        });
    }
}

macro 方法接收响应名称作为第一个参数,闭包函数作为第二个参数,响应宏的闭包在 ResponseFactory 实现类或辅助函数 response 中调用宏名称的时候被执行。

Route::get(&#39;macro/response&#39;, function() {
    return response()->caps(&#39;test&#39;);
});

在浏览器中访问 http://www.adm.devp/macro/response ,输出入下:

TEST

相关推荐:

如何实现Laravel 5.5可响应接口

Laravel5.2博客实战视频教程

위 내용은 Laravel 5.5에서 응답을 만드는 방법은 무엇입니까? 응답 생성 소개(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.