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 응답 클 라 이언 트 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 저 희 를 많이 사랑 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.