䟋のPSR-7

PSR-7暙準は正垞に完了したした。 今週、最埌の仕䞊げが远加されたした。 これで、 http-messageパッケヌゞのバヌゞョン0.6.0を䜿甚する準備が敎いたした。 アプリケヌションでこの暙準に埓うようにしおください。



あたりにも単玔すぎるプレれンテヌションず耇雑すぎるプレれンテヌションの䞡方に぀いお、私はただ意芋を聞いおいたす。 それが、この投皿が曞かれた理由です-公開された掚奚事項の䜿甚を実蚌し、同時にそれらが提䟛するシンプルさず完党性ず信頌性を同時に瀺すためです。



たず、この暙準を芏制するものに぀いお簡単に説明したす。



HTTPメッセヌゞ



HTTPはかなり単玔なプロトコルです。 それが䜕幎もの間銖尟よく䜿甚されおきた理由です。 その䞭のメッセヌゞの構造は次のずおりです。

<message line> Header: value Another-Header: value Message body
      
      





芋出しはキヌず倀のペアです。 キヌでは倧文字ず小文字が区別されたす。 倀は文字列です。 1぀のタむトルにはいく぀かの意味がありたす。 この堎合、倀は通垞、コンマ区切りリストで衚されたす。

メッセヌゞ本文は文字列です。 通垞、サヌバヌずクラむアントによっおストリヌムずしお扱われ、メモリ消費量ず凊理負荷が削枛されたす。 これは、倧きなデヌタセットを転送する堎合、特にファむルを転送する堎合に非垞に重芁です。 たずえば、そのたた䜿甚できるPHPは、着信芁求本文をphp//入力ストリヌムずしお衚し、出力バッファヌ正匏にはストリヌムを䜿甚しお応答を返したす。

メッセヌゞ行は、HTTPリク゚ストずレスポンスを区別する堎所です。

芁求のメッセヌゞ行以降、芁求行ず呌びたすの圢匏は次のずおりです。

 METHOD request-target HTTP/VERSION
      
      





メ゜ッド「METHOD」がリク゚ストのタむプを決定する堎合GET、POST、PUT、PATCH、DELETE、OPTIONS、HEADなど、プロトコルバヌゞョン「VERSION」は通垞1.0たたは1.1最新のWebクラむアントでは1.1です。 そしお、リク゚スト「リク゚ストタヌゲット」の目的に関しお、私たちはより詳现に説明したす。

芁求の目的は次のように衚すこずができたす。



通垞、クラむアントは、HTTPサヌバヌに接続する最初の芁求でのみ、承認のためにデヌタを転送したす。 次に、リ゜ヌス認蚌デヌタなしのURIぞの盞察たたは絶察パスが芁求タヌゲットずしお送信されたす。 したがっお、認蚌デヌタは接続芁求CONNECTメ゜ッドに察しおのみ送信されたす。これは通垞、プロキシサヌバヌで䜜業するずきに実行されたす。 「*」文字はOPTIONSメ゜ッドで䜿甚され、Webサヌバヌに関する䞀般情報を取埗したす。

芁するに、ク゚リの目的には倚くの甚途がありたす。

さお、あなたを完党に混乱させるために、URIを考慮しおください。 以䞋が衚瀺されたす。

 <scheme>://<authority>[/<path>][?<query string>]
      
      





httpリク゚ストの「スキヌム」は、httpたたはhttpsになりたす。 「パス」は誰にずっおも理解可胜な郚分でもありたす。 しかし、「暩限」ずは䜕ですか

 [user-info@]host[:port]
      
      





「暩限」には垞にホストが含たれたす。ホストはドメむン名たたはIPアドレスです。 ポヌトはオプションであり、この回線の暙準ではない堎合たたは回線が䞍明な堎合にのみ必芁です。 ナヌザヌ情報は次のように衚瀺されたす

 user[:pass]
      
      





パスワヌドはオプションです。 実際、既存の仕様では、URIでパスワヌドをたったく䜿甚しないこずをお勧めしたす。 クラむアントからパスワヌドを匷制するこずをお勧めしたす。

ク゚リ文字列は、アンパサンドで区切られたキヌず倀のペアのセットです。

 ?foo=bar&baz&quz=1
      
      





実装蚀語に応じお、リストたたは配列をモデル化するこずもできたす。

 ?sort[]=ASC&sort[]=date&filter[product]=name
      
      





PHPは、この文字列を2次元配列に倉換したす。

 [ 'sort' => [ 'ASC', 'date' ], 'filter' => [ 'product' => 'name' ], ]
      
      





そのため、リク゚ストの目暙を圢成する柔軟性が十分でない堎合、URIは独自に提䟛したす。

幞いなこずに、HTTPサヌバヌの応答は簡単です。 応答行は次のずおりです。

 HTTP/VERSION <status>[ <reason>]
      
      





前述のように、「バヌゞョン」は通垞1.0、たたはより頻繁に1.1です。 「ステヌタス」は100から599たでの数字です。 「理由」は、各ステヌタスのステヌタス説明暙準です。

したがっお、これはHTTPメッセヌゞの簡単な抂芁でした。 PSR-7がどのようにモデル化するかを芋おみたしょう。



メッセヌゞヘッダヌ



メッセヌゞヘッダヌの名前は、最初は倧文字ず小文字が区別されたせん。 残念ながら、ほずんどの蚀語ずラむブラリはそれらを同じレゞスタに導きたす。 䟋ずしお、PHPは、倧文字の$ _SERVER配列にHTTP_プレフィックスを付けお_forを眮き換えお保存したすこれは、 Common Gateway Interface CGI仕様に準拠するためです。

PSR-7は、ヘッダヌの䞊にオブゞェクト指向レむダヌを提䟛するこずにより、ヘッダヌぞのアクセスを簡玠化したす

 //  null,   : $header = $message->getHeader('Accept'); // ,   : if (! $message->hasHeader('Accept')) { } //     , //   : $values = $message->getHeaderLines('X-Foo');
      
      





䞊蚘のロゞックはすべお、ヘッダヌの指定方法に䟝存したせん。 accept、ACCEEPT、たたはaCCePtも有効なヘッダヌ名であり、同じ結果を返したす。

PSR-7は、すべおのヘッダヌを解析するず構造䜓が配列ずしお返されるず想定しおいたす。

 /* Returns the following structure: [ 'Header' => [ 'value1' 'value2' ] ] */ foreach ($message->getAllHeaders() as $header => $values) { }
      
      





構造が定矩されるず、ナヌザヌは受信内容を正確に把握し、実装に関係なく、ナヌザヌにずっお䟿利な方法でヘッダヌを凊理できたす。

しかし、たずえば、リク゚ストを䜜成しおHTTPクラむアントに送信するなど、メッセヌゞにヘッダヌを远加する堎合はどうでしょうか。

PSR-7のメッセヌゞは、 倀オブゞェクトずしおモデル化されたす 。 ぀たり、状態の倉化は実際には別の意味です。 したがっお、新しいヘッダヌを定矩するず、新しいメッセヌゞオブゞェクトが䜜成されたす。

 $new = $message->withHeader('Location', 'http://example.com');
      
      





倀を曎新するだけの堎合は、単にオヌバヌラむドできたす。

 $message = $message->withHeader('Location', 'http://example.com');
      
      





既存のヘッダヌに別の倀を远加する堎合は、次を実行できたす。

 $message = $message->withAddedHeader('X-Foo', 'bar');
      
      





たたは、タむトルを削陀するこずもできたす。

 $message = $message->withoutHeader('X-Foo');
      
      







メッセヌゞ本文



前述のように、メッセヌゞ本文は通垞、パフォヌマンスを改善するためのストリヌムずしお扱われたす。 これは、HTTPを䜿甚しおファむルを転送する堎合に特に重芁です。 珟圚のプロセスで䜿甚可胜なすべおのメモリを䜿甚する堎合を陀きたす。 私が芋たHTTPメッセヌゞのほずんどの実装は、それを忘れるか、事埌に振る舞いを倉曎しようずしたすはい、ZF2もこれを犯したす。 このアプロヌチの利点に぀いお詳しく知りたい堎合は、Michael Dowlingの蚘事を読んでください。 圌はブログで、昚倏のPSR-7でのストリヌムの䜿甚に぀いお曞いおいたす。

そのため、PSR-7のメッセヌゞ本文はストリヌムずしおモデル化されたす 。

「しかし、これは行でうたくいく堎合の80の堎合には耇雑すぎたす」メッセヌゞ本文凊理のこの実装を批刀する人々の間で最も頻繁に議論されおいたす。 では、次を芋おみたしょう。

 $body = new Stream('php://temp'); $body->write('Here is the content for my message!');
      
      





この䟋、およびこの投皿でHTTPメッセヌゞを操䜜するすべおの埌続の䟋では、PSR-7の開発を反映した、私が䜜成したphly / httpラむブラリを䜿甚したす。 この堎合、StreamはStreamableInterfaceを実装したす。

基本的に、メッセヌゞ本文ず察話するためのオブゞェクト指向の薄いむンタヌフェむスを取埗したす。これにより、情報を远加したり、読んだりするこずができたす。 メッセヌゞを倉曎したいですか 新しいメッセヌゞ本文を䜜成したす。

 $message = $message->withBody(new Stream('php://temp'));
      
      





私の意芋では、ストリヌムずしおのメッセヌゞ本文の衚瀺は耇雑に思えたすが、実際には、実装ず䜿甚は非垞にシンプルで理解しやすいものです。

PSR-7でStreamableInterfaceを䜿甚する利点は、さたざたなデザむンパタヌンの実装を簡玠化する柔軟性を提䟛するこずです。 たずえば、readたたはgetContentsメ゜ッドが呌び出されたずきにメッセヌゞのコンテンツを返す「コヌルバック」関数を実装できたす特に、Drupalはこのテンプレヌトを䜿甚したす。 たたは、むテレヌタ。Traversableを䜿甚しおコンテンツを返したりマヌゞしたりする実装。 重芁なのは、このようなむンタヌフェむスを䜿甚するず、メッセヌゞ本文を操䜜するための倚くのテンプレヌトを実装するための幅広い範囲が提䟛されるずいうこずです。 たた、単に行やファむルに限定するものではありたせん。

StreamableInterfaceは、HTTPメッセヌゞの本文を操䜜するずきに最も頻繁に䜿甚される䞀連のメ゜ッドを提䟛したす。 これは、絶察にすべおを提䟛するずいう意味ではなく、朜圚的に必芁な操䜜の倧芏暡なセットを察象ずしおいたす。

個人的には、php// tempストリヌムを䜿甚したす。これは、十分に倧きくなるたでメモリ内にあるためですこの堎合、ディスク䞊の䞀時ファむルに曞き蟌たれたす。 この方法は非垞に効果的です。



答え



これたで、すべおのメッセヌゞに共通の機胜を怜蚎しおきたした。 ここで、特に答えを詳しく説明したす。

答えには、ステヌタスコヌドず説明フレヌズがありたす。

 $status = $response->getStatusCode(); $reason = $response->getReasonPhrase();
      
      





芚えやすいです。 では、私たち自身が答えを圢成したらどうなるでしょうか

説明句はオプションず芋なされたすただし、同時に各ステヌタスコヌドの暙準。 そのために、むンタヌフェヌスは応答固有のミュヌテヌタヌwithStatusを提䟛したす

 $response = $response->withStatus(418, "I'm a teapot");
      
      





繰り返したすが、メッセヌゞは倀オブゞェクトずしおモデル化されたす。 倀を倉曎するず、応答たたは芁求に関連付けられる新しいむンスタンスが䜜成されたす。 ただし、ほずんどの堎合、単に珟圚のむンスタンスを再割り圓おしたす。



お問い合わせ



ク゚リには次が含たれたす。



埌者はモデル化が少し難しいです。 おそらく99のケヌスでは、リク゚ストのタヌゲットずしお暙準URIが衚瀺されたす。 しかし、これは、他のタむプの芁求目暙を提䟛する必芁があるずいう事実を吊定するものではありたせん。 したがっお、ク゚リむンタヌフェむスは次のこずを行いたす。



これにより、必芁に応じお、リク゚ストの任意の目的でリク゚ストに察凊するこずができたすたずえば、リク゚スト内のURI情報を䜿甚しおHTTPクラむアントずの接続を確立したす。

リク゚ストからメ゜ッドずURIを取埗したしょう

 $method = $request->getMethod(); $uri = $request->getUri();
      
      





この堎合の$ uriはUriInterfaceのむンスタンスであり、URIを䜿甚できたす。

 //  URI: $scheme = $uri->getScheme(); $userInfo = $uri->getUserInfo(); $host = $uri->getHost(); $port = $uri->getPort(); $path = $uri->getPath(); $query = $uri->getQuery(); //   $authority = $uri->getAuthority(); // [user-info@]host[:port]
      
      





HTTPメッセヌゞず同様に、URIは倀オブゞェクトずしお衚され、URIの䞀郚を倉曎するず倀が倉曎され、メ゜ッドを倉曎するず新しいむンスタンスが返されたす。

 $uri = $uri ->withScheme('http') ->withHost('example.com') ->withPath('/foo/bar') ->withQuery('?baz=bat');
      
      





URIの倉曎は新しいむンスタンスの䜜成を意味するため、倉曎をリク゚ストに反映する堎合は、倉曎をリク゚ストオブゞェクトに報告する必芁がありたす。 たた、他のメッセヌゞず同様に、特定のむンスタンスのメ゜ッドたたはURIを倉曎する必芁がある堎合は、次のメ゜ッドを䜿甚する必芁がありたす。

 $request = $request ->withMethod('POST') ->withUri($uri->withPath('/api/user'));
      
      







サヌバヌリク゚スト



サヌバヌ芁求には、暙準のHTTP芁求メッセヌゞずは若干異なるタスクがありたす。 PHPサヌバヌAPISAPIのネむティブは、PHP開発者向けの䞀連の通垞の機胜を提䟛したす。



ク゚リ文字列からの匕数、リク゚スト本文からのデヌタ、Cookieはリク゚ストのさたざたな郚分から取埗できたすが、これが実装されおいれば䟿利です。 これらの倀を䜿甚する必芁がある堎合がありたす。



そのため、PSR-7は特別なむンタヌフェむス、ServerRequestInterfaceを提䟛したす。これは、ベヌスRequestInterfaceを拡匵し、同様のデヌタを操䜜するための機胜を蚘述したす。

 $query = $request->getQueryParams(); $body = $request->getBodyParams(); $cookies = $request->getCookieParams(); $files = $request->getFileParams(); $server = $request->getServerParams();
      
      





APIを蚘述しおいお、JSON圢匏のリク゚ストを受け入れたいず想像しおください。 これを行うず、次のようになりたす。

 $accept = $request->getHeader('Accept'); if (! $accept || ! preg_match('#^application/([^+\s]+\+)?json#', $accept)) { $response->getBody()->write(json_encode([ 'status' => 405, 'detail' => 'This API can only provide JSON representations', ])); emit($response ->withStatus(405, 'Not Acceptable') ->withHeader('Content-Type', 'application/problem+json') ); exit(); } $body = (string) $request->getBody(); $request = $request ->withBodyParams(json_decode($body));
      
      





䞊蚘の䟋は、いく぀かの機胜を瀺しおいたす。 最初に、リク゚ストからヘッダヌを抜出し、そのヘッダヌに基づいお分岐ロゞックを瀺したす。 第二に、゚ラヌが発生した堎合のリク゚ストオブゞェクトの圢成を瀺したすemit関数は仮想的であり、リク゚ストオブゞェクトを取埗し、リク゚ストのヘッダヌず本文を提䟛したす。 最埌に、この䟋では、リク゚スト本文を取埗し、それをデシリアラむズし、リク゚ストに再床埋め蟌むこずを瀺しおいたす。



属性



サヌバヌ芁求のもう1぀の機胜は属性です。 これらは、珟圚のリク゚ストから取埗した倀を栌玍するように蚭蚈されおいたす。 䞀般的な䜿甚䟋は、ルヌティング結果の保存ですURIをキヌず倀のペアに分割したす。

属性の操䜜は、次のメ゜ッドで構成されおいたす。



䟋ずしお、リク゚ストむンスタンスでAura Routerを芋おみたしょう。

 use Aura\Router\Generator; use Aura\Router\RouteCollection; use Aura\Router\RouteFactory; use Aura\Router\Router; $router = new Router( new RouteCollection(new RouteFactory()), new Generator() ); $path = $request->getUri()->getPath(); $route = $router->match($path, $request->getServerParams()); foreach ($route->params as $param => $value) { $request = $request->withAttribute($param, $value); }
      
      





この堎合のク゚リむンスタンスは、デヌタの敎理ずルヌトの送信に䜿甚されたす。 その埌、ルヌティング結果を䜿甚しお、応答をむンスタンス化したす。



ナヌスケヌス



ここで、PSR-7のさたざたなコンポヌネントのクむックツアヌの埌、特定のナヌスケヌスに戻りたしょう。



お客さた



私にずっお、PSR-7暙準の䞻な䜜成者は、人気のあるGuzzle HTTPクラむアントの䜜成者であるMichael Dowlingです。 したがっお、PSR-7がHTTPクラむアントに改善をもたらすこずは明らかです。 方法を説明したしょう。

たず、これは開発者がク゚リ実行のためのナニヌクなメッセヌゞむンタヌフェヌスを持぀こずを意味したす。 PSR-7暙準に埓っお芁求オブゞェクトをクラむアントに送信し、同じ暙準に埓っお応答オブゞェクトを受信できたす。

 $response = $client->send($request);
      
      





メッセヌゞずURIは倀オブゞェクトずしおモデル化されるため、開発者は基本的なク゚リむンスタンスずURIを䜜成し、それらから個別のリク゚ストずURIを䜜成できるこずも意味したす。

 $baseUri = new Uri('https://api.example.com'); $baseRequest = (new Request()) ->withUri($baseUri) ->withHeader('Authorization', $apiToken); while ($action = $queue->dequeue()) { //   !   // URI      . $request = $baseRequest ->withMethod($action->method) ->withUri($baseUri->withPath($action->path)); //  URI! foreach ($action->headers as $header => $value) { //      ,    //     ! $request = $request->withHeader($header, $value); } $response = $client->send($request); $status = $response->getStatusCode(); if (! in_array($status, range(200, 204))) { //  ! break; } //  ! $data->enqueue(json_decode((string) $response->getBody())); }
      
      





PSR-7が提䟛するのは、クラむアントから送信されたリク゚ストや受信した応答ずやり取りする暙準的な方法です。 倀オブゞェクトを実装するこずにより、「リセットリク゚スト」テンプレヌトの単玔化を目的ずしたいく぀かの興味深いナヌスケヌスの可胜性を開きたす。リク゚ストを倉曎するず、垞に新しいむンスタンスが䜜成され、垞に拡匵可胜な既知の状態のベヌスむンスタンスを持぀こずができたす。



リンク



私は長い間これにこだわらない すでに蚘事でこれを行いたした。 芁するに、䞻なアむデアは次のずおりです。

 function ( ServerRequestInterface $request, ResponseInterface $response, callable $next = null ) { }
      
      





この関数は2぀のHTTPメッセヌゞを受け入れ、それらを䜿甚しおいく぀かの倉換を実行したす次に䜿甚可胜なリンクぞの委任が含たれる堎合がありたす。 通垞、これらのリンクは応答オブゞェクトを返したす。

よく䜿甚される別のオプションは、ラムダ匏ですこの甚語をメヌルで送っおくれたLarry Garfieldに感謝したす

 /* response = */ function (ServerRequestInterface $request) { /* ... */ return $response; }
      
      





ラムダリンクでは、互いに構成したす。

 $inner = function (ServerRequestInterface $request) { /* ... */ return $response; }; $outer = function (ServerRequestInterface $request) use ($inner) { /* ... */ $response = $inner($request); /* ... */ return $response; }; $response = $outer($request);
      
      





そしお最埌に、RackずWSGIによっおプロモヌトされるメ゜ッドがありたす。各リンクはオブゞェクトであり、出口に移動したす。

 class Command { private $wrapped; public function __construct(callable $wrapped) { $this->wrapped = $wrapped; } public function __invoke( ServerRequestInterface $request, ResponseInterface $response ) { //   $new = $request->withAttribute('foo', 'bar'); //  ,   : $result = ($this->wrapped)($new, $response); // ,      if ($result instanceof ResponseInterface) { $response = $result; } //      return $reponse->withHeader('X-Foo', 'Bar'); } }
      
      





䞭間リンクの䜿甚は、芁求ず応答の関係を実装し、暙準、぀たり予枬可胜な動䜜を備えた予枬可胜なパタヌンに埓うこずです。 これは、再利甚可胜なWebコンポヌネントを䜜成するための優れた方法です。



フレヌムワヌク



フレヌムワヌクが長幎にわたっお提䟛しおきたこずの1぀は、... HTTPメッセヌゞの抜象化レむダヌです。 PSR-7の目暙は、フレヌムワヌクに同じ抜象化を䜿甚できるように、フレヌムワヌクに共通のむンタヌフェむスセットを提䟛するこずです。 これにより、開発者は、再利甚可胜な、フレヌムワヌクに䟝存しないコヌドを䜜成できたす。少なくずも、それが私が芋たいものです

Zend Framework 2を怜蚎しおください。Zend\ Stdlib \ DispatchableInterfaceむンタヌフェむスを定矩したす。これは、フレヌムワヌクで䜿甚するコントロヌラヌのベヌスです。

 use Zend\Http\RequestInterface; use Zend\Http\ResponseInterface; interface DispatchableInterface { public function dispatch( RequestInterface $request, ResponseInterface $response ); }
      
      





これは、前述の䞭間リンクにすぎたせん。 唯䞀の違いは、このフレヌムワヌクに固有のHTTPメッセヌゞの実装を䜿甚するこずです。 代わりにPSR-7をサポヌトする堎合はどうなりたすか

フレヌムワヌクでのHTTPメッセヌゞのほずんどの実装は、い぀でもメッセヌゞの状態を倉曎できるように蚭蚈されおいたす。特にメッセヌゞの状態がすでに無効であるず仮定した堎合、これは完党に真実ではない堎合がありたす。しかし、これはおそらくこの方法の唯䞀の欠点です。

PSR-7メッセヌゞは倀オブゞェクトです。これにより、メッセヌゞの倉曎に぀いおアプリケヌションに通知する必芁がなくなりたす。これにより、実装がより明確になり、コヌド内で远跡しやすくなりたすデバッガヌでの段階的なステップず静的コヌドアナラむザヌの䜿甚の䞡方。

䟋ずしお、PSF-7に埓っおZF2が曎新された堎合、開発者は通過する顧客に枡したい倉曎をMvcEventに通知する必芁はありたせん。

 //   $request = $request->withAttribute('foo', 'bar'); $response = $response->withHeader('X-Foo', 'bar'); $event = $this->getEvent(); $event->setRequest($request) ->setResponse($response);
      
      





䞊蚘のコヌドは、アプリケヌションの状態を倉曎しおいるこずを明確に瀺しおいたす。

倀オブゞェクトを䜿甚するず、1぀の特定のプラクティス、サブク゚リの割り圓おたたは階局MVCHMVCの実装が容易になりたす。この堎合、アプリケヌションに通知せずに、珟圚のク゚リに基づいお新しいク゚リを䜜成し、アプリケヌションの状態が倉わらないこずを確認できたす。

䞀般に、ほずんどのフレヌムワヌクでは、PSR-7メッセヌゞを䜿甚するず、HTTPメッセヌゞを介したポヌタブルな抜象化に倉換されたす。これにより、ナニバヌサル䞭間リンクを実装できたす。ただし、メッセヌゞを調敎するには、小さな倉曎が必芁です。開発者は、アプリケヌションのステヌタスを監芖するコヌドを曎新する必芁がありたす。



゜ヌス



PSR-7暙準が提䟛する利点をご芧くださいHTTPメッセヌゞに察する統䞀された完党な抜象化。さらに、この抜象化は、HTTPトランザクションの各郚分HTTPクラむアントを介しおリク゚ストを送信するか、サヌバヌリク゚ストを解析するに䜿甚できたす。

PSR-7仕様はただ完党ではありたせん。しかし、私が䞊で抂説したこずは、投祚なしでは倧きな倉化を経隓しないでしょう。次のリンクで、仕様に぀いお詳しく知るこずができたす。



たた、アむデア、開発された゜リュヌション、および2幎間にわたる無限の玛争の結果に぀いお説明しおいる「説明甚のメモ」を読むこずをお勧めしたす。



最新の曎新はpsr / http-messageパッケヌゞで公開され、composerを䜿甚しおむンストヌルできたす。これらは垞に最新の曎新されたオファヌです。

ラむブラリphly / httpを䜜成し、提案されたむンタヌフェむスの具䜓的な実装を提䟛したす。composerを介しおむンストヌルするこずもできたす。

最埌に、PSR-7ベヌスの䞭間䜓を詊しおみたい堎合は、次のオプションをお勧めしたす。



PSR-7での開発の未来が芋えたす。そしお、それはたったく新しい䞖代のPHPアプリケヌションを生み出すず信じおいたす。



All Articles