Laravel Smokescreen は、Laravel モデルやその他のエンティティを変換するためのパッケージです。
このパッケージは、rexlabs/smokescreen (Vanilla PHP) パッケージを Laravel フレームワークと緊密に統合し、Laravel アプリケーションを操作する際の利便性と最小限の定型文を提供します。
<?php
class MyController extends Controller
{
public function index ()
{
return Smokescreen:: transform (Post:: paginate ());
}
public function show ( Post $ post )
{
return Smokescreen:: transform ( $ post );
}
}
laravel-smokescreen
は Laravel のアプリコンテナーにブートストラップされるため、タイプヒントを使用してコントローラーのコンストラクターまたはメソッドに注入することもできます。app('smokescreen')
を介してコンテナから直接使用することもできます。Responsable
インターフェイスを実装しているため、任意のコントローラー メソッドから簡単にスモークスクリーンを返すことができます。 このパッケージは現在、RexSoftware のプライベート packageist リポジトリでホストされています。まず、このリポジトリを使用するようにcomposer.json
が設定されていることを確認してください。
パッケージをインストールする
composer require rexlabs/laravel-smokescreen
このパッケージは自動検出されるため、追加の構成は必要ありません。
構成ファイルをapp/config
フォルダーに公開するには、次のコマンドを実行します。
php artisan vendor:publish --provider= ' RexlabsLaravelSmokescreenProvidersServiceProvider --tag=config '
これにより、 config/smokescreen.php
が作成されます。
<?php
return [
// Set the default namespace for resolving transformers when
// they are not explicitly provided.
' transformer_namespace ' => ' AppTransformers ' ,
// Override the default serializer to be used.
// If not specified - the Smokescreen DefaultSerializer will be used.
' default_serializer ' => null ,
// Set the default request parameter key which is parsed for
// the list of includes.
' include_key ' => ' include ' ,
];
$smokescreen->transform(mixed $resource, mixed $transformer = null);
<?php
$ smokescreen -> transform (Post:: find ( 1 ));
$ smokescreen -> transform (Post:: all ());
$ smokescreen -> transform (Post:: paginate ());
$ smokescreen -> transform (Post:: find ( 1 ), new SomeOtherTransformer );
$smokescreen->item(mixed $item, mixed $transformer = null);
<?php
$ smokescreen -> item (Post:: find ( 1 ));
$ smokescreen -> item (Post:: find ( 1 ), new SomeOtherTransformer );
transform()
に似ていますが、項目のみを受け入れます。 $smokescreen->collection(mixed $collection, mixed $transformer = null);
<?php
$ smokescreen -> collection (Post:: all ());
$ smokescreen -> collection (Post:: paginate ());
$ smokescreen -> collection (Post:: paginate (), new SomeOtherTransformer );
transform()
に似ていますが、コレクションのみを受け入れます。$smokescreen->transformWith(TransformerInterface|callable $transformer);
<?php
$ smokescreen -> transform (Post:: find ( 1 ))
-> transformWith ( new SomeOtherTransformer );
<?php
$ smokescreen -> serializeWith ( new MyCustomSerializer );
DefaultSerializer
デフォルトとして提供します。これは、 "data"
ノードの下にネストされたコレクションと、ネストのない項目リソースを返します。SerializerInterface
インターフェイスを実装する必要があります。 $smokescreen->loadRelationsVia(RelationsLoaderInterface $loader);
<?php
$ smokescreen -> loadRelationsVia ( new MyRelationsLoader );
RelationsLoader
デフォルトとして提供します。RelationsLoaderInterface
インターフェイスを実装し、 load()
メソッドを提供する必要があります。 $smokescreen->loadTransformersVia(TransformerResolverInterface $loader);
<?php
$ smokescreen -> loadTransformersVia ( new MyTransformerResolver );
smokescreen.transformer_namespace
パスで定義されたパス内で一致するトランスフォーマー クラスを見つけようとし、アプリ コンテナーを介してそれをインスタンス化します。TransformersLoaderInterface
インターフェイスを実装し、 resolve(ResourceInterface)
メソッドを提供する必要があります。 $response = $smokescreen->response(int $statusCode = 200, array $headers = [], int $options = 0);
<?php
$ smokescreen -> response ()
-> header ( ' X-Custom-Header ' , ' boo ' )
-> setStatusCode ( 405 );
IlluminateHttpJsonResponse
オブジェクトを返すため、チェーン可能ではありません。JsonResponse
メソッドを適用できます。JsonResponse
オブジェクトであるため、コントローラーから直接response()
を返すこともできます。withResponse($callback)
使用して変更を適用し、チェーン可能性をサポートすることもできます。response()
への最初の呼び出しでは、データセット全体が毎回再生成されないように結果がキャッシュされます。これは、後続の呼び出しで渡されたパラメーターが無視されることを意味します。 clearResponse()
を使用することも、 JsonResponse
オブジェクトを直接操作することもできます。 $response = $smokescreen->freshResponse(int $statusCode = 200, array $headers = [], int $options = 0);
response()
とは異なり、このメソッドは、キャッシュされていない新しい JsonResponse オブジェクトを返します (最初にclearResponse()
を呼び出すことによって)。IlluminateHttpJsonResponse
オブジェクトを返すため、チェーン可能ではありません。チェーン可能なメソッドについては、 withResponse()
参照してください。JsonResponse
メソッドを適用できます。 $smokescreen->withResponse(callable $apply);
<?php
$ smokescreen -> withResponse ( function ( JsonResponse $ response ) {
$ response -> header ( ' X-Crypto-Alert ' , ' all your coins are worthless! ' );
});
JsonResponse
オブジェクトを受け入れ、応答を操作するコールバックを提供します。response()
とは異なりチェーン可能です。$smokescreen->clearResponse();
<?php
$ smokescreen -> response (); // Data is generated, response object is built and cached
$ smokescreen -> response ( 500 ); // NOPE - Cached, wont be changed!
$ smokescreen -> clearResponse ();
$ smokescreen -> response ( 500 ); // Response is re-generated
<?php
class PostTransformer extends AbstractTransformer
{
protected $ includes = [
' user ' => ' default|relation:user|method:includeTheDamnUser ' ,
' comments ' => ' relation ' ,
];
public function transform ( Post $ post ): array
{
return [
' id ' => $ post -> id ,
' user ' => $ this -> when ( $ post -> user_id , [
' id ' => $ post -> user_id ,
]),
' title ' => $ post -> title ,
' summary ' => $ post -> summary ,
' body ' => $ post -> body ,
' created_at ' => utc_datetime ( $ post -> created_at ),
' updated_at ' => utc_datetime ( $ post -> updated_at ),
];
}
public function includeTheDamnUser ( Post $ post )
{
return $ this -> item ( $ post -> user ); // Infer Transformer
}
public function includeComments ( Post $ post )
{
return $ this -> collection ( $ post -> comments , new CommentTransformer );
}
}
$includes
配列を介して利用可能なインクルードを宣言します。default
: このインクルードは、要求されたインクルードに関係なく常に有効になります。relation
: リレーションを積極的にロードする必要があることを示します。関係名が異なる場合はrelation:othername
として指定します。method
: デフォルトでは、インクルード キーはinclude{IncludeKey}
にマップされます。代わりに使用するメソッドを指定できます。transform()
メソッドは配列を返す必要があります。include{IncludeKey}(Model)
形式でインクルード メソッドを定義します。これらのメソッドはcollection()
またはitem()
を返す必要があります。when()
条件を受け入れ、true の場合は指定された値を返し、false の場合は null (デフォルト) を返す単純なヘルパー メソッドです。上記の例では、 $post
オブジェクトにuser_id
が設定されていない場合、 "user"
ノードはnull
になります。 プルリクエストは大歓迎です。コードが PSR に準拠していることを確認してください。 Githubリポジトリ