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 인터페이스를 구현하므로 모든 컨트롤러 메서드에서 간단히 smokescreen을 반환할 수 있습니다. 이 패키지는 현재 RexSoftware의 개인 packagegist 저장소에서 호스팅됩니다. 먼저 이 저장소를 사용하도록 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 저장소