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 的私人 packagist 儲存庫中。首先確保您已配置您的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()
是一個簡單的輔助方法,它接受一個條件,並在 true 時傳回給定值,或 false 時傳回 null(預設)。在上面的範例中,如果$post
物件上沒有設定user_id
則"user"
節點將為null
。 歡迎拉請求。請確保代碼符合 PSR 要求。 Github 儲存庫