Laravel Smokescreen es un paquete para transformar sus modelos Laravel y otras entidades.
Este paquete integra estrechamente el paquete rexlabs/smokescreen (Vanilla PHP) con el marco de trabajo de Laravel, para proporcionar la comodidad y un texto mínimo al trabajar con aplicaciones de 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
se inicia en el contenedor de aplicaciones de Laravel, por lo que también puedes escribir sugerencias para inyectarlo en el constructor o los métodos de tu controlador.app('smokescreen')
como se muestra arriba.Responsable
, simplemente puede devolver la cortina de humo desde cualquier método de controlador. Este paquete está actualmente alojado en el repositorio de empaquetadores privado de RexSoftware. Primero asegúrese de haber configurado su composer.json
para usar este repositorio.
Instalar paquete
composer require rexlabs/laravel-smokescreen
Este paquete se descubrirá automáticamente y no es necesaria ninguna configuración adicional.
Para publicar el archivo de configuración en su carpeta app/config
, ejecute el siguiente comando:
php artisan vendor:publish --provider= ' RexlabsLaravelSmokescreenProvidersServiceProvider --tag=config '
Esto creará 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()
pero solo acepta un elemento. $smokescreen->collection(mixed $collection, mixed $transformer = null);
<?php
$ smokescreen -> collection (Post:: all ());
$ smokescreen -> collection (Post:: paginate ());
$ smokescreen -> collection (Post:: paginate (), new SomeOtherTransformer );
transform()
pero solo acepta una colección. $smokescreen->transformWith(TransformerInterface|callable $transformer);
<?php
$ smokescreen -> transform (Post:: find ( 1 ))
-> transformWith ( new SomeOtherTransformer );
<?php
$ smokescreen -> serializeWith ( new MyCustomSerializer );
DefaultSerializer
como valor predeterminado, devuelve colecciones anidadas en un nodo "data"
y un recurso de elemento sin ningún anidamiento.SerializerInterface
. $smokescreen->loadRelationsVia(RelationsLoaderInterface $loader);
<?php
$ smokescreen -> loadRelationsVia ( new MyRelationsLoader );
RelationsLoader
como valor predeterminado que carga ansiosamente las relaciones para los recursos de recopilación.RelationsLoaderInterface
y proporcionar un método load()
. $smokescreen->loadTransformersVia(TransformerResolverInterface $loader);
<?php
$ smokescreen -> loadTransformersVia ( new MyTransformerResolver );
smokescreen.transformer_namespace
y la crea una instancia a través del contenedor de la aplicación.TransformersLoaderInterface
y proporcionar un método resolve(ResourceInterface)
. $response = $smokescreen->response(int $statusCode = 200, array $headers = [], int $options = 0);
<?php
$ smokescreen -> response ()
-> header ( ' X-Custom-Header ' , ' boo ' )
-> setStatusCode ( 405 );
IlluminateHttpJsonResponse
por lo que no se puede encadenar.JsonResponse
compatibles.response()
directamente desde tu controlador ya que es un objeto JsonResponse
.withResponse($callback)
para aplicar cambios y aún admitir la capacidad de encadenamiento.response()
almacena en caché el resultado para que todo el conjunto de datos no se vuelva a generar cada vez, esto significa que se ignorará cualquier parámetro que se pase en llamadas posteriores. Puede utilizar clearResponse()
o manipular el objeto JsonResponse
directamente. $response = $smokescreen->freshResponse(int $statusCode = 200, array $headers = [], int $options = 0);
response()
este método devuelve un objeto JsonResponse nuevo y no almacenado en caché (llamando primero clearResponse()
).IlluminateHttpJsonResponse
por lo que no se puede encadenar. Consulte withResponse()
para conocer un método encadenable.JsonResponse
compatibles. $smokescreen->withResponse(callable $apply);
<?php
$ smokescreen -> withResponse ( function ( JsonResponse $ response ) {
$ response -> header ( ' X-Crypto-Alert ' , ' all your coins are worthless! ' );
});
JsonResponse
y manipule la respuesta.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
: esta inclusión siempre está habilitada independientemente de las inclusiones solicitadasrelation
: Indica que una relación debe cargarse con entusiasmo. Si el nombre de la relación es diferente, especifíquelo como relation:othername
method
: de forma predeterminada, la clave de inclusión está asignada para include{IncludeKey}
puede proporcionar el método que se utilizará en su lugar.transform()
debería devolver una matriz.include{IncludeKey}(Model)
: deben devolver una collection()
o un item()
when()
es un método auxiliar simple que acepta una condición y devuelve el valor dado cuando es verdadero o nulo (por defecto) cuando es falso. En el ejemplo anterior, el nodo "user"
será null
si no hay user_id
establecido en el objeto $post
. Las solicitudes de extracción son bienvenidas. Asegúrese de que el código sea compatible con PSR. Repositorio Github