Laravel Smokescreen é um pacote para transformar seus modelos Laravel e outras entidades.
Este pacote integra fortemente o pacote rexlabs/smokescreen (Vanilla PHP) com a estrutura Laravel, para fornecer conveniência e padrão mínimo ao trabalhar com aplicativos 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
é inicializado no contêiner do aplicativo Laravel, então você também pode digitar a dica para que ele seja injetado no construtor ou nos métodos do seu controlador.app('smokescreen')
conforme mostrado acima.Responsable
, você pode simplesmente retornar a cortina de fumaça de qualquer método do controlador. Este pacote está atualmente hospedado no repositório empacotador privado da RexSoftware. Primeiro, certifique-se de ter configurado seu composer.json
para usar este repositório.
Instalar pacote
composer require rexlabs/laravel-smokescreen
Este pacote será descoberto automaticamente e nenhuma configuração adicional será necessária.
Para publicar o arquivo de configuração em sua pasta app/config
, execute o seguinte comando:
php artisan vendor:publish --provider= ' RexlabsLaravelSmokescreenProvidersServiceProvider --tag=config '
Isso criará 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()
mas aceita apenas um item. $smokescreen->collection(mixed $collection, mixed $transformer = null);
<?php
$ smokescreen -> collection (Post:: all ());
$ smokescreen -> collection (Post:: paginate ());
$ smokescreen -> collection (Post:: paginate (), new SomeOtherTransformer );
transform()
mas aceita apenas uma coleção. $smokescreen->transformWith(TransformerInterface|callable $transformer);
<?php
$ smokescreen -> transform (Post:: find ( 1 ))
-> transformWith ( new SomeOtherTransformer );
<?php
$ smokescreen -> serializeWith ( new MyCustomSerializer );
DefaultSerializer
como padrão, ele retorna coleções aninhadas em um nó "data"
e um recurso de item sem qualquer aninhamento.SerializerInterface
. $smokescreen->loadRelationsVia(RelationsLoaderInterface $loader);
<?php
$ smokescreen -> loadRelationsVia ( new MyRelationsLoader );
RelationsLoader
como padrão, que carrega relacionamentos para recursos de coleção.RelationsLoaderInterface
e fornecer um método load()
. $smokescreen->loadTransformersVia(TransformerResolverInterface $loader);
<?php
$ smokescreen -> loadTransformersVia ( new MyTransformerResolver );
smokescreen.transformer_namespace
e a instancia por meio do contêiner do aplicativo.TransformersLoaderInterface
e fornecer um 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
portanto não pode ser encadeado.JsonResponse
suportados podem ser aplicados.response()
diretamente do seu controlador, pois é um objeto JsonResponse
.withResponse($callback)
para aplicar alterações e ainda oferecer suporte à capacidade de encadeamento.response()
armazena em cache o resultado para que todo o conjunto de dados não seja gerado novamente todas as vezes, isso significa que a passagem de quaisquer parâmetros nas chamadas subsequentes será ignorada. Você pode usar clearResponse()
ou manipular o objeto JsonResponse
diretamente. $response = $smokescreen->freshResponse(int $statusCode = 200, array $headers = [], int $options = 0);
response()
este método retorna um novo objeto JsonResponse não armazenado em cache (chamando clearResponse()
primeiro).IlluminateHttpJsonResponse
portanto não pode ser encadeado. Veja withResponse()
para um método encadeado.JsonResponse
suportados podem ser aplicados. $smokescreen->withResponse(callable $apply);
<?php
$ smokescreen -> withResponse ( function ( JsonResponse $ response ) {
$ response -> header ( ' X-Crypto-Alert ' , ' all your coins are worthless! ' );
});
JsonResponse
e manipule a respostaresponse()
$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 inclusão está sempre habilitada, independentemente das inclusões solicitadasrelation
: indica que uma relação deve ser carregada antecipadamente. Se o nome da relação for diferente, especifique-o como relation:othername
method
: por padrão, a chave de inclusão é mapeada para include{IncludeKey}
você pode fornecer o método a ser usadotransform()
deve retornar um array.include{IncludeKey}(Model)
- eles devem retornar uma collection()
ou um item()
when()
é um método auxiliar simples que aceita uma condição e retorna o valor fornecido quando verdadeiro ou nulo (por padrão) quando falso. No exemplo acima, o nó "user"
será null
se não houver user_id
definido no objeto $post
. Solicitações pull são bem-vindas. Certifique-se de que o código seja compatível com PSR. Repositório Github