Laravel Smokescreen est un package permettant de transformer vos modèles Laravel et d'autres entités.
Ce package intègre étroitement le package rexlabs/smokescreen (Vanilla PHP) au framework Laravel, pour offrir la commodité et un passe-partout minimal lorsque vous travaillez avec des applications 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
est démarré dans le conteneur d'application de Laravel, vous pouvez donc également le taper pour qu'il soit injecté dans le constructeur ou les méthodes de votre contrôleur.app('smokescreen')
comme indiqué ci-dessus.Responsable
, vous pouvez simplement renvoyer un écran de fumée à partir de n'importe quelle méthode de contrôleur. Ce package est actuellement hébergé sur le référentiel packagiste privé de RexSoftware. Assurez-vous d’abord d’avoir configuré votre composer.json
pour utiliser ce référentiel.
Installer le package
composer require rexlabs/laravel-smokescreen
Ce package sera découvert automatiquement et aucune configuration supplémentaire n’est nécessaire.
Pour publier le fichier de configuration dans votre dossier app/config
, exécutez la commande suivante :
php artisan vendor:publish --provider= ' RexlabsLaravelSmokescreenProvidersServiceProvider --tag=config '
Cela créera 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()
mais n'accepte qu'un élément. $smokescreen->collection(mixed $collection, mixed $transformer = null);
<?php
$ smokescreen -> collection (Post:: all ());
$ smokescreen -> collection (Post:: paginate ());
$ smokescreen -> collection (Post:: paginate (), new SomeOtherTransformer );
transform()
mais n'accepte qu'une collection. $smokescreen->transformWith(TransformerInterface|callable $transformer);
<?php
$ smokescreen -> transform (Post:: find ( 1 ))
-> transformWith ( new SomeOtherTransformer );
<?php
$ smokescreen -> serializeWith ( new MyCustomSerializer );
DefaultSerializer
par défaut, il renvoie des collections imbriquées sous un nœud "data"
et une ressource d'élément sans aucune imbrication.SerializerInterface
. $smokescreen->loadRelationsVia(RelationsLoaderInterface $loader);
<?php
$ smokescreen -> loadRelationsVia ( new MyRelationsLoader );
RelationsLoader
par défaut qui charge avec impatience les relations pour les ressources de collection.RelationsLoaderInterface
et fournir une méthode load()
. $smokescreen->loadTransformersVia(TransformerResolverInterface $loader);
<?php
$ smokescreen -> loadTransformersVia ( new MyTransformerResolver );
smokescreen.transformer_namespace
et l'instancie via le conteneur d'application.TransformersLoaderInterface
et fournir une méthode resolve(ResourceInterface)
. $response = $smokescreen->response(int $statusCode = 200, array $headers = [], int $options = 0);
<?php
$ smokescreen -> response ()
-> header ( ' X-Custom-Header ' , ' boo ' )
-> setStatusCode ( 405 );
IlluminateHttpJsonResponse
il n'est donc pas chaînable.JsonResponse
prises en charge peuvent être appliquées.response()
directement depuis votre contrôleur puisqu'il s'agit d'un objet JsonResponse
.withResponse($callback)
pour appliquer les modifications tout en prenant en charge la chaînabilité.response()
met en cache le résultat afin que l'intégralité de l'ensemble de données ne soit pas régénéré à chaque fois, cela signifie que la transmission de tous les paramètres lors des appels suivants sera ignorée. Vous pouvez utiliser clearResponse()
ou manipuler directement l'objet JsonResponse
. $response = $smokescreen->freshResponse(int $statusCode = 200, array $headers = [], int $options = 0);
response()
cette méthode renvoie un nouvel objet JsonResponse non mis en cache (en appelant d'abord clearResponse()
).IlluminateHttpJsonResponse
il n'est donc pas chaînable. Voir withResponse()
pour une méthode chaînable.JsonResponse
prises en charge peuvent être appliquées. $smokescreen->withResponse(callable $apply);
<?php
$ smokescreen -> withResponse ( function ( JsonResponse $ response ) {
$ response -> header ( ' X-Crypto-Alert ' , ' all your coins are worthless! ' );
});
JsonResponse
et manipule la réponseresponse()
$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
: Cette inclusion est toujours activée quelles que soient les inclusions demandéesrelation
: Indique qu'une relation doit être chargée avec impatience. Si le nom de la relation est différent, spécifiez-le comme relation:othername
method
: Par défaut, la clé d'inclusion est mappée sur include{IncludeKey}
vous pouvez fournir la méthode à utiliser à la placetransform()
doit renvoyer un tableau.include{IncludeKey}(Model)
- elles doivent renvoyer soit une collection()
, soit un item()
when()
est une méthode d'assistance simple qui accepte une condition et renvoie soit la valeur donnée lorsqu'elle est vraie, soit null (par défaut) lorsqu'elle est fausse. Dans l'exemple ci-dessus, le nœud "user"
sera null
si aucun user_id
n'est défini sur l'objet $post
. Les demandes de tirage sont les bienvenues. Veuillez vous assurer que le code est conforme au PSR. Dépôt Github