Laravel Smokescreen عبارة عن حزمة لتحويل نماذج Laravel والكيانات الأخرى.
تدمج هذه الحزمة بإحكام حزمة rexlabs/smokescreen (Vanilla PHP) مع إطار عمل Laravel، لتوفير الراحة والحد الأدنى من النموذج عند العمل مع تطبيقات 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
في حاوية تطبيق Laravel، لذا يمكنك أيضًا التلميح بالكتابة ليتم إدخاله في مُنشئ وحدة التحكم أو أساليبها.app('smokescreen')
كما هو موضح أعلاه.Responsable
، يمكنك ببساطة إرجاع الستار الدخاني من أي طريقة تحكم. هذه الحزمة مستضافة حاليًا على مستودع الحزم الخاص بـ RexSoftware. تأكد أولاً من أنك قمت بتكوين composer.json
الخاص بك لاستخدام هذا المستودع.
تثبيت الحزمة
composer require rexlabs/laravel-smokescreen
سيتم اكتشاف هذه الحزمة تلقائيًا، ولا يلزم إجراء أي تكوين إضافي.
لنشر ملف التكوين إلى مجلد app/config
، قم بتشغيل الأمر التالي:
php artisan vendor:publish --provider= ' RexlabsLaravelSmokescreenProvidersServiceProvider --tag=config '
سيؤدي هذا إلى إنشاء 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()
ولكنه يقبل عنصرًا فقط. $smokescreen->collection(mixed $collection, mixed $transformer = null);
<?php
$ smokescreen -> collection (Post:: all ());
$ smokescreen -> collection (Post:: paginate ());
$ smokescreen -> collection (Post:: paginate (), new SomeOtherTransformer );
transform()
ولكنه يقبل المجموعة فقط. $smokescreen->transformWith(TransformerInterface|callable $transformer);
<?php
$ smokescreen -> transform (Post:: find ( 1 ))
-> transformWith ( new SomeOtherTransformer );
<?php
$ smokescreen -> serializeWith ( new MyCustomSerializer );
DefaultSerializer
كإعداد افتراضي، فهو يُرجع مجموعات متداخلة ضمن عقدة "data"
، ومورد عنصر دون أي تداخل.SerializerInterface
. $smokescreen->loadRelationsVia(RelationsLoaderInterface $loader);
<?php
$ smokescreen -> loadRelationsVia ( new MyRelationsLoader );
RelationsLoader
باعتباره الخيار الافتراضي الذي يقوم بتحميل العلاقات لموارد المجموعة.RelationsLoaderInterface
وتوفير طريقة load()
. $smokescreen->loadTransformersVia(TransformerResolverInterface $loader);
<?php
$ smokescreen -> loadTransformersVia ( new MyTransformerResolver );
smokescreen.transformer_namespace
، ويقوم بإنشاء مثيل لها عبر حاوية التطبيق.TransformersLoaderInterface
وتوفير طريقة resolve(ResourceInterface)
. $response = $smokescreen->response(int $statusCode = 200, array $headers = [], int $options = 0);
<?php
$ smokescreen -> response ()
-> header ( ' X-Custom-Header ' , ' boo ' )
-> setStatusCode ( 405 );
IlluminateHttpJsonResponse
بحيث لا يكون قابلاً للتسلسل.JsonResponse
المدعومة.response()
مباشرة من وحدة التحكم الخاصة بك لأنها كائن JsonResponse
.withResponse($callback)
لتطبيق التغييرات، مع الاستمرار في دعم قابلية التسلسل.response()
بتخزين النتيجة مؤقتًا بحيث لا يتم إعادة إنشاء مجموعة البيانات بأكملها في كل مرة، وهذا يعني أنه سيتم تجاهل تمرير أي معلمات على الاستدعاءات اللاحقة. يمكنك استخدام clearResponse()
أو التعامل مع كائن JsonResponse
مباشرة. $response = $smokescreen->freshResponse(int $statusCode = 200, array $headers = [], int $options = 0);
response()
تقوم هذه الطريقة بإرجاع كائن JsonResponse جديد غير مخزن مؤقتًا (عن طريق استدعاء clearResponse()
أولاً).IlluminateHttpJsonResponse
بحيث لا يكون قابلاً للتسلسل. راجع withResponse()
لمعرفة الطريقة القابلة للتسلسل.JsonResponse
المدعومة. $smokescreen->withResponse(callable $apply);
<?php
$ smokescreen -> withResponse ( function ( JsonResponse $ response ) {
$ response -> header ( ' X-Crypto-Alert ' , ' all your coins are worthless! ' );
});
JsonResponse
ويعالج الاستجابة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
: يتم تمكين هذا التضمين دائمًا بغض النظر عن التضمينات المطلوبةrelation
: تشير إلى أن العلاقة يجب أن تكون محملة بشغف. إذا كان اسم العلاقة مختلفًا، فحدده relation:othername
method
: افتراضيًا، يتم تعيين مفتاح التضمين include{IncludeKey}
ويمكنك توفير الطريقة التي سيتم استخدامها بدلاً من ذلكtransform()
الخاصة بك بإرجاع مصفوفة.include{IncludeKey}(Model)
- يجب أن تُرجع إما collection()
أو item()
when()
هي طريقة مساعدة بسيطة تقبل شرطًا وتعيد إما القيمة المحددة عندما تكون صحيحة، أو فارغة (افتراضيًا) عندما تكون خاطئة. في المثال أعلاه، ستكون عقدة "user"
null
إذا لم يتم تعيين user_id
على كائن $post
. طلبات السحب هي موضع ترحيب. يرجى التأكد من أن الكود متوافق مع PSR. مستودع جيثب