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 ดังนั้นคุณจึงสามารถพิมพ์คำใบ้เพื่อฉีดเข้าไปใน Constructor หรือเมธอดของคอนโทรลเลอร์ของคุณได้app('smokescreen')
ดังที่แสดงด้านบนResponsable
คุณจึงสามารถคืน Smokescreen ได้จากวิธีการควบคุมใดก็ได้ ปัจจุบันแพ็คเกจนี้โฮสต์อยู่บนพื้นที่เก็บข้อมูลส่วนตัวของ 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()
สำหรับวิธีการแบบ chainableJsonResponse
ที่รองรับทั้งหมดได้ $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()
เป็นเมธอดตัวช่วยง่ายๆ ที่ยอมรับเงื่อนไขและส่งกลับค่าที่กำหนดเมื่อเป็นจริง หรือค่า null (โดยค่าเริ่มต้น) เมื่อเป็นเท็จ ในตัวอย่างข้างต้น โหนด "user"
จะเป็น null
หากไม่มีการตั้ง user_id
บนวัตถุ $post
ยินดีต้อนรับคำขอดึง โปรดตรวจสอบให้แน่ใจว่าโค้ดเป็นไปตามมาตรฐาน PSR พื้นที่เก็บข้อมูล Github