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:othernamemethod :默认情况下,包含键映射到include{IncludeKey}您可以提供要使用的方法transform()方法应该返回一个数组。include{IncludeKey}(Model)格式定义包含方法 - 它们应该返回collection()或item()when()是一个简单的辅助方法,它接受一个条件,并在 true 时返回给定值,或 false 时返回 null(默认情况下)。在上面的示例中,如果$post对象上没有设置user_id则"user"节点将为null 。 欢迎拉请求。请确保代码符合 PSR 要求。 Github 存储库