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 );
}
}$includesdefault : 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:othernamemethod : 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