Laravel Smokescreen ist ein Paket zur Transformation Ihrer Laravel-Modelle und anderer Entitäten.
Dieses Paket integriert das Paket rexlabs/smokescreen (Vanilla PHP) eng in das Laravel-Framework, um Komfort und minimale Grundkenntnisse bei der Arbeit mit Laravel-Anwendungen zu bieten.
<?php
class MyController extends Controller
{
public function index ()
{
return Smokescreen:: transform (Post:: paginate ());
}
public function show ( Post $ post )
{
return Smokescreen:: transform ( $ post );
}
}
laravel-smokescreen
wird in den App-Container von Laravel gebootstrappt, sodass Sie es auch mit einem Tipp eingeben können, um es in den Konstruktor oder die Methoden Ihres Controllers einzufügen.app('smokescreen')
nutzen.Responsable
Schnittstelle implementieren, können Sie Smokescreen einfach von jeder Controller-Methode zurückgeben. Dieses Paket wird derzeit im privaten Packagist-Repository von RexSoftware gehostet. Stellen Sie zunächst sicher, dass Sie Ihre composer.json
für die Verwendung dieses Repositorys konfiguriert haben.
Paket installieren
composer require rexlabs/laravel-smokescreen
Dieses Paket wird automatisch erkannt und es ist keine zusätzliche Konfiguration erforderlich.
Um die Konfigurationsdatei in Ihrem Ordner app/config
zu veröffentlichen, führen Sie den folgenden Befehl aus:
php artisan vendor:publish --provider= ' RexlabsLaravelSmokescreenProvidersServiceProvider --tag=config '
Dadurch wird config/smokescreen.php
erstellt:
<?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()
akzeptiert jedoch nur ein Element. $smokescreen->collection(mixed $collection, mixed $transformer = null);
<?php
$ smokescreen -> collection (Post:: all ());
$ smokescreen -> collection (Post:: paginate ());
$ smokescreen -> collection (Post:: paginate (), new SomeOtherTransformer );
transform()
akzeptiert jedoch nur eine Sammlung. $smokescreen->transformWith(TransformerInterface|callable $transformer);
<?php
$ smokescreen -> transform (Post:: find ( 1 ))
-> transformWith ( new SomeOtherTransformer );
<?php
$ smokescreen -> serializeWith ( new MyCustomSerializer );
DefaultSerializer
als Standard bereit. Es gibt Sammlungen zurück, die unter einem "data"
-Knoten verschachtelt sind, und eine Elementressource ohne jegliche Verschachtelung.SerializerInterface
Schnittstelle implementieren. $smokescreen->loadRelationsVia(RelationsLoaderInterface $loader);
<?php
$ smokescreen -> loadRelationsVia ( new MyRelationsLoader );
RelationsLoader
als Standard bereit, der Beziehungen für Sammlungsressourcen eifrig lädt.RelationsLoaderInterface
-Schnittstelle implementieren und eine load()
Methode bereitstellen. $smokescreen->loadTransformersVia(TransformerResolverInterface $loader);
<?php
$ smokescreen -> loadTransformersVia ( new MyTransformerResolver );
smokescreen.transformer_namespace
path“ definierten Pfads zu finden und instanziiert sie über den App-Container.TransformersLoaderInterface
implementieren und eine Methode resolve(ResourceInterface)
bereitstellen. $response = $smokescreen->response(int $statusCode = 200, array $headers = [], int $options = 0);
<?php
$ smokescreen -> response ()
-> header ( ' X-Custom-Header ' , ' boo ' )
-> setStatusCode ( 405 );
IlluminateHttpJsonResponse
Objekt zurück, sodass es nicht verkettet werden kann.JsonResponse
-Methoden können angewendet werden.response()
weiterhin direkt von Ihrem Controller zurückgeben, da es sich um ein JsonResponse
Objekt handelt.withResponse($callback)
verwenden, um Änderungen anzuwenden und trotzdem die Verkettbarkeit zu unterstützen.response()
wird das Ergebnis zwischengespeichert, sodass nicht jedes Mal der gesamte Datensatz neu generiert wird. Dies bedeutet, dass die Übergabe von Parametern bei nachfolgenden Aufrufen ignoriert wird. Sie können clearResponse()
verwenden oder das JsonResponse
Objekt direkt bearbeiten. $response = $smokescreen->freshResponse(int $statusCode = 200, array $headers = [], int $options = 0);
response()
gibt diese Methode ein neues, nicht zwischengespeichertes JsonResponse-Objekt zurück (indem zuerst clearResponse()
aufgerufen wird).IlluminateHttpJsonResponse
Objekt zurück, sodass es nicht verkettet werden kann. Eine verkettbare Methode finden Sie unter withResponse()
.JsonResponse
-Methoden können angewendet werden. $smokescreen->withResponse(callable $apply);
<?php
$ smokescreen -> withResponse ( function ( JsonResponse $ response ) {
$ response -> header ( ' X-Crypto-Alert ' , ' all your coins are worthless! ' );
});
JsonResponse
-Objekt akzeptiert und die Antwort manipuliertresponse()
verkettbar. $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
: Dieses Include ist immer aktiviert, unabhängig von den angeforderten Includesrelation
: Gibt an, dass eine Relation eifrig geladen werden soll. Wenn der Beziehungsname unterschiedlich ist, geben Sie ihn als relation:othername
method
: Standardmäßig ist der Include-Schlüssel include{IncludeKey}
zugeordnet. Sie können stattdessen die zu verwendende Methode angebentransform()
-Methode sollte ein Array zurückgeben.include{IncludeKey}(Model)
– sie sollten entweder eine collection()
oder ein item()
zurückgeben.when()
ist eine einfache Hilfsmethode, die eine Bedingung akzeptiert und entweder den angegebenen Wert zurückgibt, wenn sie wahr ist, oder null (standardmäßig), wenn sie falsch ist. Im obigen Beispiel ist der Knoten "user"
null
, wenn für das $post
-Objekt keine user_id
festgelegt ist. Pull-Requests sind willkommen. Bitte stellen Sie sicher, dass der Code PSR-kompatibel ist. Github-Repository