Laravel Smokescreen adalah paket untuk mengubah model Laravel Anda, dan entitas lainnya.
Paket ini mengintegrasikan paket rexlabs/smokescreen (Vanilla PHP) dengan framework Laravel, untuk memberikan kenyamanan dan boilerplate minimal saat bekerja dengan aplikasi 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
di-bootstrap ke dalam wadah aplikasi Laravel, sehingga Anda juga dapat mengetikkan petunjuk untuk dimasukkan ke dalam konstruktor atau metode pengontrol Anda.app('smokescreen')
seperti gambar di atas.Responsable
, Anda cukup mengembalikan tabir asap dari metode pengontrol apa pun. Paket ini saat ini dihosting di repositori paket pribadi RexSoftware. Pertama, pastikan Anda telah mengonfigurasi composer.json
untuk menggunakan repositori ini.
Instal paket
composer require rexlabs/laravel-smokescreen
Paket ini akan ditemukan secara otomatis, dan tidak diperlukan konfigurasi tambahan.
Untuk mempublikasikan file konfigurasi ke folder app/config
Anda, jalankan perintah berikut:
php artisan vendor:publish --provider= ' RexlabsLaravelSmokescreenProvidersServiceProvider --tag=config '
Ini akan membuat 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()
tetapi hanya menerima item. $smokescreen->collection(mixed $collection, mixed $transformer = null);
<?php
$ smokescreen -> collection (Post:: all ());
$ smokescreen -> collection (Post:: paginate ());
$ smokescreen -> collection (Post:: paginate (), new SomeOtherTransformer );
transform()
tetapi hanya menerima koleksi. $smokescreen->transformWith(TransformerInterface|callable $transformer);
<?php
$ smokescreen -> transform (Post:: find ( 1 ))
-> transformWith ( new SomeOtherTransformer );
<?php
$ smokescreen -> serializeWith ( new MyCustomSerializer );
DefaultSerializer
sebagai default, ia mengembalikan koleksi yang bersarang di bawah node "data"
, dan sumber daya item tanpa sarang apa pun.SerializerInterface
. $smokescreen->loadRelationsVia(RelationsLoaderInterface $loader);
<?php
$ smokescreen -> loadRelationsVia ( new MyRelationsLoader );
RelationsLoader
sebagai default yang memuat hubungan dengan penuh semangat untuk pengumpulan sumber daya.RelationsLoaderInterface
dan menyediakan metode load()
. $smokescreen->loadTransformersVia(TransformerResolverInterface $loader);
<?php
$ smokescreen -> loadTransformersVia ( new MyTransformerResolver );
smokescreen.transformer_namespace
, dan membuat instance melalui wadah aplikasi.TransformersLoaderInterface
dan menyediakan metode resolve(ResourceInterface)
. $response = $smokescreen->response(int $statusCode = 200, array $headers = [], int $options = 0);
<?php
$ smokescreen -> response ()
-> header ( ' X-Custom-Header ' , ' boo ' )
-> setStatusCode ( 405 );
IlluminateHttpJsonResponse
sehingga tidak dapat dirantai.JsonResponse
yang didukung dapat diterapkan.response()
langsung dari pengontrol Anda karena ini adalah objek JsonResponse
.withResponse($callback)
untuk menerapkan perubahan, dan tetap mendukung kemampuan rantai.response()
menyimpan hasil dalam cache sehingga seluruh kumpulan data tidak dibuat ulang setiap saat, ini berarti meneruskan parameter apa pun pada panggilan berikutnya akan diabaikan. Anda dapat menggunakan clearResponse()
atau memanipulasi objek JsonResponse
secara langsung. $response = $smokescreen->freshResponse(int $statusCode = 200, array $headers = [], int $options = 0);
response()
metode ini mengembalikan objek JsonResponse baru yang tidak di-cache (dengan memanggil clearResponse()
terlebih dahulu).IlluminateHttpJsonResponse
sehingga tidak dapat dirantai. Lihat withResponse()
untuk metode yang dapat dirantai.JsonResponse
yang didukung dapat diterapkan. $smokescreen->withResponse(callable $apply);
<?php
$ smokescreen -> withResponse ( function ( JsonResponse $ response ) {
$ response -> header ( ' X-Crypto-Alert ' , ' all your coins are worthless! ' );
});
JsonResponse
dan memanipulasi responsnyaresponse()
$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
: Penyertaan ini selalu diaktifkan terlepas dari penyertaan yang dimintarelation
: Menunjukkan bahwa suatu relasi harus dimuat dengan cepat. Jika nama relasinya berbeda, tentukan sebagai relation:othername
method
: Secara default kunci penyertaan dipetakan ke include{IncludeKey}
Anda dapat memberikan metode yang akan digunakantransform()
Anda harus mengembalikan array.include{IncludeKey}(Model)
- metode tersebut harus mengembalikan collection()
atau item()
when()
adalah metode pembantu sederhana yang menerima kondisi dan mengembalikan nilai yang diberikan jika benar, atau nol (secara default) jika salah. Dalam contoh di atas, node "user"
akan menjadi null
jika tidak ada user_id
yang disetel pada objek $post
. Permintaan tarik dipersilakan. Harap pastikan kode sesuai dengan PSR. Repositori Github