Laravel Reponse 응답 클 라 이언 트 예시 상세 설명

머리말
이 글 은 논리 가 비교적 길 어서 생명주기 와 관련 된 필요 한 코드 만 설명 한다.
본문의 주요 내용 순 서 는 다음 과 같다.
1.상기 파이프 에서 then 방법 으로 지정 한 패 킷 을 실행 하고 경로 의 배포
2.공유 기 에서(Router 클래스)요청($request 즉 전역 미들웨어 처리 요청)과 일치 하 는 경로 규칙 을 찾 습 니 다.
3.경로 규칙 의 로드(프레임 으로 이동 하 는 boot 과정)를 설명 합 니 다.이 부분 은 요청 을 처리 하기 전에 완 성 된 것 입 니 다.우리 가 요청 을 처리 하기 시작 하면 모든 경로 가 불 러 와 서 우리 의 요청 이 일치 하도록 해 야 하기 때 문 입 니 다.
4.요청 이 일치 하 는 경로 논리 실행
5.응답 을 생 성하 고 클 라 이언 트 에 게 발송
6.마지막 생명주기 의 끝
7.기본 응답 류 의 사용
앞에서 말 했 듯 이 요청 이 전체 미들웨어 를 순조롭게 통과 하면 파이프 then 방법 에서 들 어 오 는 패 킷 을 호출 합 니 다.

protected function sendRequestThroughRouter($request)
{
 $this->app->instance('request', $request);
 Facade::clearResolvedInstance('request');

 $this->bootstrap();
 
 //     
 return (new Pipeline($this->app))
 ->send($request)
 ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
 //              ,          
 ->then($this->dispatchToRouter());
}

protected function dispatchToRouter()
{
 return function ($request) {
 $this->app->instance('request', $request);
 return $this->router->dispatch($request);
 };
}

Illuminate\\Routing\라 우 터 보기::dispatch 방법

public function dispatch(Request $request)
{ 
 $this->currentRequest = $request;
 //         
 //    dispatchToRoute  
 return $this->dispatchToRoute($request);
}

public function dispatchToRoute(Request $request)
{ 
 //     findRoute  
 return $this->runRoute($request, $this->findRoute($request));
}

//           $request        
protected function findRoute($request)
{ 
 //    Illuminate\Routing\RouteCollection::match  
 $this->current = $route = $this->routes->match($request);
 $this->container->instance(Route::class, $route);
 return $route;
}

Illuminate\\Routing\RouteCollection::match 방법 보기

/**
 * Find the first route matching a given request.
 *
 * @param \Illuminate\Http\Request $request
 * @return \Illuminate\Routing\Route
 *
 * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
 */
public function match(Request $request)
{ 
 //                
 //        $routes
 $routes = $this->get($request->getMethod());
 //                     !!!
 $route = $this->matchAgainstRoutes($routes, $request);
 
 if (! is_null($route)) {
 return $route->bind($request);
 }

 $others = $this->checkForAlternateVerbs($request);

 if (count($others) > 0) {
 return $this->getRouteForMethods($request, $others);
 }

 throw new NotFoundHttpException;
}

다음은 프레임 워 크 가 어떻게 불 러 오 는 경로 규칙 을 설명 합 니 다.
응용 프로그램::boot 방법

//              boot  
array_walk($this->serviceProviders, function ($p) {
 $this->bootProvider($p);
});
App\\Providers\Route ServiceProvider::boot 방법

public function boot()
{
 //     Illuminate\Foundation\Support\Providers\RouteServiceProvider boot  
 parent::boot();
}
Illuminate\\Foundation\Support\\Providers\Route ServiceProvider::boot 방법

public function boot()
{ 
 $this->setRootControllerNamespace();

 if ($this->routesAreCached()) {
 $this->loadCachedRoutes();
 } else {
 //     loadRoutes  
 $this->loadRoutes();

 $this->app->booted(function () {
  // dd(get_class($this->app['router']));
  $this->app['router']->getRoutes()->refreshNameLookups();
  $this->app['router']->getRoutes()->refreshActionLookups();
 });
 }
}

/**
 * Load the application routes.
 *              
 * @return void
 */
protected function loadRoutes()
{ 
 //   App\Providers\RouteServiceProvider map  
 if (method_exists($this, 'map')) {
 $this->app->call([$this, 'map']);
 }
}

App\\Providers\\Route ServiceProvider::map 방법

public function map()
{ 
 //            api  
 // $this->mapApiRoutes();
 
 //                 web.php
 $this->mapWebRoutes();
}

protected function mapWebRoutes()
{ 
 //   Router __call       RouteRegistrar  
 Route::middleware('web')
 ->namespace($this->namespace)
 //   RouteRegistrar namespace     __call    
 
 //              
 // Illuminate\Routing\RouteRegistrar {#239 
 // #router: Illuminate\Routing\Router {#34 ▶}
 // #attributes: array:2 [
 // "middleware" => array:1 [
 // 0 => "web"
 // ]
 // "namespace" => "App\Http\Controllers"
 // ]
 // #passthru: array:7 [▶]
 // #allowedAttributes: array:7 [▶]
 // #aliases: array:1 [▶]
 // }
 
 //   RouteRegistrar group  
 ->group(base_path('routes/web.php'));
}

Router::__call 방법

public function __call($method, $parameters)
{ 
 if (static::hasMacro($method)) {
 return $this->macroCall($method, $parameters);
 }
 
 if ($method === 'middleware') {
 //    RouteRegistrar attribute           
 return (new RouteRegistrar($this))->attribute($method, is_array($parameters[0]) ? $parameters[0] : $parameters);
 }

 return (new RouteRegistrar($this))->attribute($method, $parameters[0]);
}

Illuminate\Routing\RouteRegistrar::__call 방법

public function __call($method, $parameters)
{ 
 if (in_array($method, $this->passthru)) {
  //    get post      
  return $this->registerRoute($method, ...$parameters);
 }

 if (in_array($method, $this->allowedAttributes)) {
  if ($method === 'middleware') {
   return $this->attribute($method, is_array($parameters[0]) ? $parameters[0] : $parameters);
  }
  // dd($method); // namespace
  return $this->attribute($method, $parameters[0]);
 }

 throw new BadMethodCallException(sprintf(
  'Method %s::%s does not exist.', static::class, $method
 ));
}

Illuminate\\Routing\\RouteRegistrar::group 방법

public function group($callback)
{ 
 // dd($this->attributes, $callback);
 // array:2 [
 //  "middleware" => array:1 [
 //   0 => "web"
 //  ]
 //  "namespace" => "App\Http\Controllers"
 // ]
 // "/home/vagrant/code/test1/routes/web.php"
 
 //   Router group  
 $this->router->group($this->attributes, $callback);
}
라 우 터::group 방법

public function group(array $attributes, $routes)
{
 $this->updateGroupStack($attributes);
 
 //   loadRoutes   /home/vagrant/code/test1/routes/web.php
 $this->loadRoutes($routes);

 array_pop($this->groupStack);
}

protected function loadRoutes($routes)
{ 
 if ($routes instanceof Closure) {
  //        laravel             
  $routes($this);
 } else {
  //        /home/vagrant/code/test1/routes/web.php
  (new RouteFileRegistrar($this))->register($routes);
 }
}

Illuminate\\Routing\\RouteFileRegistrar 파일

protected $router;

public function __construct(Router $router)
{ 
 $this->router = $router;
}

public function register($routes)
{
 $router = $this->router;
 //           
 // require("/home/vagrant/code/test1/routes/web.php");
 //             Route::get()    
 //               :    web.php        require    
 //                
 require $routes;
}

이 유 를 알 고 로 딩 절 차 를 알 게 되 었 습 니 다.다음은 간단 한 예 를 들 어 laravel 이 어떻게 길 을 등록 하 는 지 알 아 보 겠 습 니 다.

// web.php 
Route::get('routecontroller', "\App\Http\Controllers\Debug\TestController@index");

//    Router get  
/**
 * Register a new GET route with the router.
 *
 * @param string $uri
 * @param \Closure|array|string|callable|null $action
 * @return \Illuminate\Routing\Route
 */
public function get($uri, $action = null)
{ 
 // dump($uri, $action);
 // $uri = routecontroller
 // $action = \App\Http\Controllers\Debug\TestController@index
 //    addRoute  
 return $this->addRoute(['GET', 'HEAD'], $uri, $action);
}

/**
 * Add a route to the underlying route collection.
 *
 * @param array|string $methods
 * @param string $uri
 * @param \Closure|array|string|callable|null $action
 * @return \Illuminate\Routing\Route
 */
//  ['GET', 'HEAD'], $uri, $action
public function addRoute($methods, $uri, $action)
{ 
 // routes routecollection  
 //    createRoute  
 //    RouteCollection add  
 return $this->routes->add($this->createRoute($methods, $uri, $action));
}

/**
 * Create a new route instance.
 *
 * @param array|string $methods
 * @param string $uri
 * @param mixed $action
 * @return \Illuminate\Routing\Route
 */
//        ['GET', 'HEAD'], $uri, $action
protected function createRoute($methods, $uri, $action)
{
 //    actionReferencesController  
 if ($this->actionReferencesController($action)) {
  $action = $this->convertToControllerAction($action);
  // dump($action);
  // array:2 [
  //  "uses" => "\App\Http\Controllers\Debug\TestController@index"
  //  "controller" => "\App\Http\Controllers\Debug\TestController@index"
  // ]
 }
 
 //            Route        routes(collection) 
 //       addRoute  
 //      Route     
 $route = $this->newRoute(
  // dump($this->prefix);
  // routecontroller
  $methods, $this->prefix($uri), $action
 );

 if ($this->hasGroupStack()) {
  $this->mergeGroupAttributesIntoRoute($route);
 }

 $this->addWhereClausesToRoute($route);

 return $route;
}

/**
 * Determine if the action is routing to a controller.
 *
 * @param array $action
 * @return bool
 */
//             
protected function actionReferencesController($action)
{ 
 //      Route::get           
 if (! $action instanceof Closure) {
  //   true
  return is_string($action) || (isset($action['uses']) && is_string($action['uses']));
 }

 return false;
}

Route Collection 의 add 방법

/**
  * Add a Route instance to the collection.
  *
  * @param \Illuminate\Routing\Route $route
  * @return \Illuminate\Routing\Route
  */
public function add(Route $route)
{ 
 //    
 $this->addToCollections($route);

 $this->addLookups($route);
 
 //        Router get             web.php       
 return $route;
}

/**
 * Add the given route to the arrays of routes.
 *
 * @param \Illuminate\Routing\Route $route
 * @return void
 */
protected function addToCollections($route)
{
 $domainAndUri = $route->getDomain().$route->uri();
 // dump($route->getDomain(), $route->uri()); null routecontroller
 foreach ($route->methods() as $method) {
  //                
  $this->routes[$method][$domainAndUri] = $route;
 }
 //                
 $this->allRoutes[$method.$domainAndUri] = $route;
}

이로써 하나의 경로 가 생 성 되 었 습 니 다.여기 서 api 경로 에 대한 설명 을 하고 웹.php 에 하나의 경로 규칙 만 있 도록 보장 합 니 다.
이상 은 루트 의 불 러 오기 입 니 다.이 부분 은$this->bootstrap()방법 에서 이 루어 졌 습 니 다.루트 배포 와 일치 하 는 단계 에 도달 하지 못 했 습 니 다.루트 규칙 생 성 이 완료 되 어 루트 컬 렉 션 실례 에 저 장 됩 니 다.루트 규칙 마다 루트 대상 이 있 습 니 다.요청 이 일치 하도록
다음은 이 경로 에 따라 일치 하고 결 과 를 되 돌려 줍 니 다.
Illuminate\Routing\RouteCollection::match 방법 으로 돌아 갑 니 다.

public function match(Request $request)
{ 
 //                
 //    Route              route  
 $routes = $this->get($request->getMethod());
 
 //          
 $route = $this->matchAgainstRoutes($routes, $request);
 
 if (! is_null($route)) {
  //        Route    
  return $route->bind($request);
 }
 
 $others = $this->checkForAlternateVerbs($request);

 if (count($others) > 0) {
  return $this->getRouteForMethods($request, $others);
 }

 throw new NotFoundHttpException;
}

//          collect      laravel  
protected function matchAgainstRoutes(array $routes, $request, $includingMethod = true)
{ 
 // dump(get_class_methods(get_class(collect($routes))));
 // dump(collect($routes)->all()); // items   protected  
 // dump(collect($routes)->items); // items       
 
 //              (  Route::fallback  )  $route isFallback    true
 
 // partition                 
 //                
 [$fallbacks, $routes] = collect($routes)->partition(function ($route) {
  return $route->isFallback;
 });
 
 //                 first            
 return $routes->merge($fallbacks)->first(function ($value) use ($request, $includingMethod) {
  return $value->matches($request, $includingMethod);
 });
}

라 우 터 파일

protected function findRoute($request)
{ 
 //     $route        web.php        Route  
 $this->current = $route = $this->routes->match($request);
 //               
 $this->container->instance(Route::class, $route);

 return $route;
}

public function dispatchToRoute(Request $request)
{ 
 //    runRoute  
 return $this->runRoute($request, $this->findRoute($request));
}

protected function runRoute(Request $request, Route $route)
{ 
 //  request     route     $request->route()     route  
 //                       Route   
 // app(Illuminate\Routing\Route::class)
 $request->setRouteResolver(function () use ($route) {
  return $route;
 });
 
 $this->events->dispatch(new RouteMatched($route, $request));
 
 //        
 return $this->prepareResponse($request,
         //    runRouteWithinStack  
         $this->runRouteWithinStack($route, $request)
         );
}

protected function runRouteWithinStack(Route $route, Request $request)
{
 $shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
  $this->container->make('middleware.disable') === true;

 $middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddleware($route);
 
 //      pipeline      $route->run  
 return (new Pipeline($this->container))
  ->send($request)
  ->through($middleware)
  ->then(function ($request) use ($route) {
   return $this->prepareResponse(
    
    $request, $route->run()
   );
  });
}

Route::run 방법 은 이 방법의 반환 값 이 일치 하 는 컨트롤 러 나 패 킷 에서 직접 되 돌아 오 는 것 을 주의 하 십시오.

public function run()
{
 $this->container = $this->container ?: new Container;

 try {
  //             
  //                  
  if ($this->isControllerAction()) {
   //          $route->run()
   //       prepareResponse  
   return $this->runController();
  }
 
  //            ControllerDispatcher
  return $this->runCallable();
 } catch (HttpResponseException $e) {
  return $e->getResponse();
 }
}

/**
 * Run the route action and return the response.
 *
 * @return mixed
 *
 * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
 */
protected function runController()
{
 // 
 return $this->controllerDispatcher()->dispatch(
  $this,
  //                
  $this->getController(),
  //            
  $this->getControllerMethod()
 );
}

Illuminate\\Routing\\Controller 디 스 패 치::디 스 패 치 방법

/**
 * Dispatch a request to a given controller and method.
 *
 * @param \Illuminate\Routing\Route $route
 * @param mixed $controller
 * @param string $method
 * @return mixed
 */
public function dispatch(Route $route, $controller, $method)
{
 $parameters = $this->resolveClassMethodDependencies(
  $route->parametersWithoutNulls(), $controller, $method
 );

 if (method_exists($controller, 'callAction')) {
  //          callAction         
  return $controller->callAction($method, $parameters);
 }
 
 return $controller->{$method}(...array_values($parameters));
}

컨트롤 러 방법 이 라 우 터 로 되 돌아 온 결과:runRoute WithinStack 방법

protected function runRouteWithinStack(Route $route, Request $request)
{
 $shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
  $this->container->make('middleware.disable') === true;

 $middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddleware($route);

 return (new Pipeline($this->container))
  ->send($request)
  ->through($middleware)
  ->then(function ($request) use ($route) {
   return $this->prepareResponse(
    //           prepareResponse  
    $request, $route->run()
   );
  });
}

//       toResponse  
//      $response               
public static function toResponse($request, $response)
{
 if ($response instanceof Responsable) {
  //                     Responsable     
  $response = $response->toResponse($request);
 }

 if ($response instanceof PsrResponseInterface) {
  //   ??? laravel   psr7??              
  $response = (new HttpFoundationFactory)->createResponse($response);
 } elseif ($response instanceof Model && $response->wasRecentlyCreated) {
  //      laravel            
  $response = new JsonResponse($response, 201);
 } elseif (! $response instanceof SymfonyResponse &&
    //   laravel              
    ($response instanceof Arrayable ||
    $response instanceof Jsonable ||
    $response instanceof ArrayObject ||
    $response instanceof JsonSerializable ||
    is_array($response))) {
  $response = new JsonResponse($response);
 } elseif (! $response instanceof SymfonyResponse) {
  //          response      ,null         
  //    laravel Response        
  $response = new Response($response);
 }

 if ($response->getStatusCode() === Response::HTTP_NOT_MODIFIED) {
  $response->setNotModified();
 }
 
 return $response->prepare($request);
}

우선 laravel 응답 Illuminate\Http\\Response 를 직접 생 성 하 는 것 을 살 펴 보 겠 습 니 다.
Symfony\Component\Http Foundation\Response 계승

// Symfony\Component\HttpFoundation\Response
public function __construct($content = '', int $status = 200, array $headers = [])
{ 
 //            
 $this->headers = new ResponseHeaderBag($headers);
 //   Illuminate\Http\Response setContent          
 $this->setContent($content);
 $this->setStatusCode($status);
 $this->setProtocolVersion('1.0');
}

// Illuminate\Http\Response::setContent
public function setContent($content)
{
 $this->original = $content;
 
 // shouldBeJson           response     array response   
 //       
 if ($this->shouldBeJson($content)) {
  $this->header('Content-Type', 'application/json');
 // morphToJson                  json 
  $content = $this->morphToJson($content);
 }
 
 elseif ($content instanceof Renderable) {
  $content = $content->render();
 }
 
 // Symfony\Component\HttpFoundation\Response              null          __toString           ,         
 parent::setContent($content);

 return $this;
}

// Symfony\Component\HttpFoundation\Response::setContent  
public function setContent($content)
{
 if (null !== $content && !\is_string($content) && !is_numeric($content) && !\is_callable([$content, '__toString'])) {
  // php        gettype         
  throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', \gettype($content)));
 }
 // (string)    __toString           
 $this->content = (string) $content;
 return $this;
}

응답 을 받 은 후 return$response->prepare($request)를 실행 합 니 다.

/**
 * Prepares the Response before it is sent to the client.
 *
 * This method tweaks the Response to ensure that it is
 * compliant with RFC 2616. Most of the changes are based on
 * the Request that is "associated" with this Response.
 *
 * @return $this
 */
//                         
public function prepare(Request $request)
{ 
 $headers = $this->headers;
 //    100 204 304                        
 if ($this->isInformational() || $this->isEmpty()) {
  $this->setContent(null);
  $headers->remove('Content-Type');
  $headers->remove('Content-Length');
 } else {
  // Content-type based on the Request
  if (!$headers->has('Content-Type')) {
   $format = $request->getPreferredFormat();
   if (null !== $format && $mimeType = $request->getMimeType($format)) {
    $headers->set('Content-Type', $mimeType);
   }
  }

  // Fix Content-Type
  $charset = $this->charset ?: 'UTF-8';
  if (!$headers->has('Content-Type')) {
   $headers->set('Content-Type', 'text/html; charset='.$charset);
  } elseif (0 === stripos($headers->get('Content-Type'), 'text/') && false === stripos($headers->get('Content-Type'), 'charset')) {
   // add the charset
   $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset);
  }

  // Fix Content-Length
  if ($headers->has('Transfer-Encoding')) {
   $headers->remove('Content-Length');
  }

  if ($request->isMethod('HEAD')) {
   // cf. RFC2616 14.13
   $length = $headers->get('Content-Length');
   $this->setContent(null);
   if ($length) {
    $headers->set('Content-Length', $length);
   }
  }
 }

 // Fix protocol
 if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) {
  $this->setProtocolVersion('1.1');
 }

 // Check if we need to send extra expire info headers
 if ('1.0' == $this->getProtocolVersion() && false !== strpos($headers->get('Cache-Control'), 'no-cache')) {
  $headers->set('pragma', 'no-cache');
  $headers->set('expires', -1);
 }

 $this->ensureIEOverSSLCompatibility($request);

 if ($request->isSecure()) {
  foreach ($headers->getCookies() as $cookie) {
   $cookie->setSecureDefault(true);
  }
 }

 return $this;
}

//                     
//                
//                            
public function handle($request, Closure $next)
{ 
 //      $response                                     
 $response = $next($request);
 // header    ResponseTrait
 $response->header('Server', 'xy');
 return $response;
}

준 비 된 응답 을 받 았 습 니 다.한 단계 씩 호출 스 택 행 층 으로 돌아 갑 니 다.관 계 는 다음 과 같 습 니 다.

     Router::runRoute  
    Router::dispatchToRoute  
    Router::dispatch  
    Illuminate\Foundation\Http::sendRequestThroughRouter   (                    )
     index.php 
 
$response = $kernel->handle(
 $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

send 방법 을 살 펴 보 겠 습 니 다 Symfony\Component\Http Foundation\응답::send

public function send()
{ 
 //       
 $this->sendHeaders();
 //        
 $this->sendContent();

 if (\function_exists('fastcgi_finish_request')) {
  fastcgi_finish_request();
 } elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
  static::closeOutputBuffers(0, true);
 }

 return $this;
}

public function sendHeaders()
{
 // headers have already been sent by the developer
 if (headers_sent()) {
  return $this;
 }

 // headers
 foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) {
  $replace = 0 === strcasecmp($name, 'Content-Type');
  foreach ($values as $value) {
   //              
   header($name.': '.$value, $replace, $this->statusCode);
  }
 }

 // cookies
 foreach ($this->headers->getCookies() as $cookie) {
  //          cookie
  header('Set-Cookie: '.$cookie, false, $this->statusCode);
 }

 // status
 //      status
 header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);

 return $this;
}

//        
public function sendContent()
{ 
 //           
 echo $this->content;

 return $this;
}
//            

$kernel->terminate($request, $response);
Illuminate\\Foundation\Http\\Kernel::terminate 방법

/**
 * Call the terminate method on any terminable middleware.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Illuminate\Http\Response $response
 * @return void
 */
public function terminate($request, $response)
{ 
 //      terminate      
 $this->terminateMiddleware($request, $response);
 //      callback
 $this->app->terminate();
}
laravel 은 컨트롤 러(패 킷 닫 기)가 되 돌아 오 는 데 이 터 를 response 대상 으로 패키지 합 니 다.

public static function toResponse($request, $response)
{
 if ($response instanceof Responsable) {
  $response = $response->toResponse($request);
 }

 if ($response instanceof PsrResponseInterface) {
  $response = (new HttpFoundationFactory)->createResponse($response);
 } elseif ($response instanceof Model && $response->wasRecentlyCreated) {
  $response = new JsonResponse($response, 201);
 } elseif (! $response instanceof SymfonyResponse &&
    ($response instanceof Arrayable ||
    $response instanceof Jsonable ||
    $response instanceof ArrayObject ||
    $response instanceof JsonSerializable ||
    is_array($response))) {
  $response = new JsonResponse($response);
 } elseif (! $response instanceof SymfonyResponse) {
  $response = new Response($response);
 }

 if ($response->getStatusCode() === Response::HTTP_NOT_MODIFIED) {
  $response->setNotModified();
 }

 return $response->prepare($request);
}

위의 코드 를 관찰 한 결과:
1 상기 코드 의 역할 은 노드 에서 돌아 온 데 이 터 를 Response 대상 으로 봉 하여 발송 을 기다 리 는 것 이다
2.위의 코드 에 대량의 인 스 턴 스 of 판단 이 존재 합 니 다.
laravel 이 지정 한 인터페이스의 인 스 턴 스 입 니 다.laravel 은 이러한 응답 을 클 라 이언 트 에 게 어떻게 보 여 줘 야 하 는 지 알 수 있 습 니 다.이 때 는 잘 모 를 수도 있 습 니 다.아래 의 예 를 보십시오)
3.else 분기 가 없습니다.
4.그리고 최종 적 으로 모두 Symfony Response 의 prepare 방법 을 호출 합 니 다.
먼저 Responsable 인터페이스 가 laravel 에서 이 인 터 페 이 스 를 실현 한 대상 은 클 라 이언 트 에 응답 할 수 있 습 니 다.

<?php

namespace Illuminate\Contracts\Support;

interface Responsable
{
 /**
  * Create an HTTP response that represents the object.
  *
  * @param \Illuminate\Http\Request $request
  * @return \Symfony\Component\HttpFoundation\Response
  */
 //   $request  
 //   Response  
 public function toResponse($request);
}


//                      
//       :       id              ,      

1     
Route::get('yylh/{order}', "\App\Http\Controllers\Debug\TestController@checkStatus");

2     
namespace App\Responses;

use App\Models\Order;
use Illuminate\Contracts\Support\Responsable;
use Illuminate\Http\JsonResponse;

class OrderStatusRes implements Responsable
{
 protected $status;

 public function __construct(Order $order)
 {
  $this->status = $order->status;
 }

 public function toResponse($request)
 {
  if ($this->status) {
   //      
   return new JsonResponse('order completed', 200);
  }
  //      
  return view('needToCharge');
 }
}

3      
<?php

namespace App\Http\Controllers\Debug;

use App\Http\Controllers\Controller;
use App\Models\Order;
use App\Responses\OrderStatusRes;

class TestController extends Controller
{
 public function checkStatus(Order $order)
 {
  return new OrderStatusRes($order);
 }
}

//       
// http://homestead.test/yylh/1
// http://homestead.test/yylh/2
//                                              
//               

toResponse 코드 를 보면 우 리 는 laravel 에 규정된 데 이 터 를 되 돌려 줄 방법 을 생각 하기 만 하면 최종 적 으로 laravel response 인 스 턴 스 로 바 뀔 수 있다 는 것 을 알 게 되 었 습 니 다.
Route::get('rawReponse', function () {
​ return new Response(range(1,10));
});
더 많이 보 세 요.
10 편의 수문 을 통 해 클래스 의 자동 로드 부터 laravel 의 생명 주 기 를 나 누 었 다.
처음 블 로 그 를 쓰 는 것 이 너무 부족 하고 코드 를 많이 보지 않 는 도 우 는 이 분 을 볼 수 있 습 니 다형님 의 블 로그코드 가 적 지만 논리 가 명확 합 니 다.오류 발견,지도 환영,감사합니다!!
외국 형 블 로그.
collection 문서
총결산
Laravel Reponse 응답 클 라 이언 트 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Laravel Reponse 응답 클 라 이언 트 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!

좋은 웹페이지 즐겨찾기