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 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()
— это простой вспомогательный метод, который принимает условие и возвращает либо заданное значение, если оно истинно, либо значение null (по умолчанию), если оно ложно. В приведенном выше примере узел "user"
будет null
если для объекта $post
не установлен user_id
. Pull-запросы приветствуются. Убедитесь, что код соответствует PSR. Репозиторий на Гитхабе