From 8b8b64a068cc33b3c323607804cd47e131f2ed64 Mon Sep 17 00:00:00 2001 From: DCzajkowski Date: Thu, 5 Jan 2017 21:13:04 +0100 Subject: [PATCH 01/11] Fractal response (#69) * Remove phpunit.xml from VCS * Move from Fractalistic\Fractal to Fractal\Fractal * Added a response test * Add a respond method * Attach the status code to responses * Attach headers to responses * Added an ability to attach status code in a closure * Moved from a function to an object instantiation * Allow headers in the closure * Refactor a foreach loop to use built-in phpunit method * Allow chaining * Add a default status code * Make sure (in the test) you can pass multiple headers in a respond() function * Make sure the default status code is 200 * Make sure headers() method works * Clean-up tests * Add docblocks * Updated README to include new responses. * Compliment StyleCI * Allow for the code to be passed as a first argument and a callback as a second. * "Don't exclude phpunit.xml from VCS" This reverts commit 559ccfe52da8a01ad7e33bdad691d0c47040fe00. --- README.md | 45 ++++++++++++- src/Fractal.php | 46 +++++++++++++ src/FractalServiceProvider.php | 1 - src/Response.php | 77 ++++++++++++++++++++++ src/helpers.php | 4 +- tests/ResponseTest.php | 114 +++++++++++++++++++++++++++++++++ 6 files changed, 281 insertions(+), 6 deletions(-) create mode 100644 src/Fractal.php create mode 100644 src/Response.php create mode 100644 tests/ResponseTest.php diff --git a/README.md b/README.md index accdf57..c22ba5f 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ use League\Fractal\Manager; use League\Fractal\Resource\Collection; $books = [ - ['id'=>1, 'title'=>'Hogfather', 'characters' => [...]], + ['id'=>1, 'title'=>'Hogfather', 'characters' => [...]], ['id'=>2, 'title'=>'Game Of Kill Everyone', 'characters' => [...]] ]; @@ -52,7 +52,7 @@ There's also a very short syntax available to quickly transform data: fractal($books, new BookTransformer())->toArray(); ``` -Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all +Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects [on our website](https://spatie.be/opensource). ## Postcardware @@ -91,7 +91,7 @@ If you want to make use of the facade you must install it as well: ]; ``` -If you want to [change the default serializer](https://github.com/spatie/laravel-fractal#changing-the-default-serializer), +If you want to [change the default serializer](https://github.com/spatie/laravel-fractal#changing-the-default-serializer), you must publish the config file: ```bash @@ -125,6 +125,45 @@ Refer to [the documentation of `spatie/fractalistic`](https://github.com/spatie/ In all code examples you may use `fractal()` instead of `Fractal::create()`. +## Attaching a status code and headers + +Now you can easily create fractal responses with status codes and headers. + +Previously what you might have done is this ugly JSON response just to attach a response code or headers: +```php +return response()->json( + fractal() + ->item('These credentials do not match our records.') + ->transformWith(new ErrorTransformer) + ->serializeWith(new ArraySerializer) + ->toArray() +, 433, $headers); +``` +now, you can easily chain on the status code inside the `respond()` method: +```php +return fractal() + ->item('These credentials do not match our records.') + ->transformWith(new ErrorTransformer) + ->serializeWith(new ArraySerializer) + ->respond(433, $headers); +``` + +If you have some complicated headers' or status code's connected logic, you can do it in a callback like so: +```php +return fractal() + ->item('These credentials do not match our records.') + ->transformWith(new ErrorTransformer) + ->serializeWith(new ArraySerializer) + ->respond(function ($response) { + $response->code(433) + ->header('test-header', 'test-value') + ->headers([ + 'test2-header' => 'test2-value', + ]); + }); +``` + + ## Quickly creating a transformer You can run the `make:transformer` command to quickly generate a dummy transformer. By default it will be stored in the `app\Transformers` directory. diff --git a/src/Fractal.php b/src/Fractal.php new file mode 100644 index 0000000..61eeb8e --- /dev/null +++ b/src/Fractal.php @@ -0,0 +1,46 @@ +response = new Response; + } + + /** + * Return a new JSON response. + * + * @param callable|int $callbackOrStatusCode + * @param array $headers + * + * @return \Illuminate\Http\JsonResponse + */ + public function respond($callbackOrStatusCode = 200, $callbackOrHeaders = []) + { + if (is_callable($callbackOrStatusCode)) { + $callbackOrStatusCode($this->response); + } else { + $this->response->code($callbackOrStatusCode); + + if (is_callable($callbackOrHeaders)) { + $callbackOrHeaders($this->response); + } else { + $this->response->headers($callbackOrHeaders); + } + } + + return new JsonResponse($this->createData()->toArray(), $this->response->statusCode(), $this->response->getHeaders()); + } +} diff --git a/src/FractalServiceProvider.php b/src/FractalServiceProvider.php index aafb456..96abefe 100644 --- a/src/FractalServiceProvider.php +++ b/src/FractalServiceProvider.php @@ -2,7 +2,6 @@ namespace Spatie\Fractal; -use Spatie\Fractalistic\Fractal; use Illuminate\Support\ServiceProvider; use League\Fractal\Serializer\SerializerAbstract; use Spatie\Fractal\Console\Commands\TransformerMakeCommand; diff --git a/src/Response.php b/src/Response.php new file mode 100644 index 0000000..9a22ca6 --- /dev/null +++ b/src/Response.php @@ -0,0 +1,77 @@ +statusCode; + } + + /** + * Set the status code. + * + * @param int $statusCode + * + * @return self + */ + public function code($statusCode) + { + $this->statusCode = $statusCode; + + return $this; + } + + /** + * Return HTTP headers. + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Set one HTTP header. + * + * @param string $key + * @param string $value + * + * @return self + */ + public function header($key, $value) + { + $this->headers[$key] = $value; + + return $this; + } + + /** + * Set multiple headers at once. + * + * @param array $headers + * + * @return self + */ + public function headers($headers) + { + foreach ($headers as $key => $value) { + $this->header($key, $value); + } + + return $this; + } +} diff --git a/src/helpers.php b/src/helpers.php index f30882b..2edb310 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -1,6 +1,6 @@ collection(['item', 'item2']) + ->transformWith(function ($item) { + return $item.'-transformed'; + }); + } + + /** @test */ + public function it_makes_a_json_response() + { + $response = $this->fractal()->respond(); + + $this->assertInstanceOf(JsonResponse::class, $response); + $this->assertEquals('{"data":["item-transformed","item2-transformed"]}', json_encode($response->getData())); + $this->assertEquals(200, $response->status()); + } + + /** @test */ + public function it_sets_a_status_code_provided_as_a_parameter() + { + $response = $this->fractal()->respond(404); + + $this->assertEquals(404, $response->status()); + } + + /** @test */ + public function it_sets_headers_provided_as_a_parameter() + { + $response = $this->fractal() + ->respond(404, ['test' => 'test-value', 'test2' => 'test2-value']); + + $this->assertArraySubset([ + 'test' => ['test-value'], + 'test2' => ['test2-value'], + ], $response->headers->all()); + } + + /** @test */ + public function status_code_can_be_provided_in_the_closure() + { + $response = $this->fractal() + ->respond(function ($response) { + $response->code(404); + }); + + $this->assertEquals(404, $response->status()); + } + + /** @test */ + public function headers_can_be_provided_in_the_closure() + { + $response = $this->fractal() + ->respond(function ($response) { + $response->header('test', 'test-value'); + $response->headers(['test2' => 'test2-value']); + }); + + $this->assertArraySubset([ + 'test' => ['test-value'], + 'test2' => ['test2-value'], + ], $response->headers->all()); + } + + /** @test */ + public function the_code_can_be_allowed_along_with_the_callback() + { + $response = $this->fractal() + ->respond(404, function ($response) { + $response->header('test', 'test-value'); + }); + + $this->assertEquals(404, $response->status()); + $this->assertArraySubset([ + 'test' => ['test-value'], + ], $response->headers->all()); + } + + /** @test */ + public function callback_allows_chaining() + { + $response = $this->fractal() + ->respond(function ($response) { + $response + ->header('test', 'test-value') + ->code(404) + ->headers([ + 'test3' => 'test3-value', + 'test4' => 'test4-value', + ]) + ->header('test2', 'test2-value'); + }); + + $this->assertArraySubset([ + 'test' => ['test-value'], + 'test2' => ['test2-value'], + 'test3' => ['test3-value'], + 'test4' => ['test4-value'], + ], $response->headers->all()); + + $this->assertEquals(404, $response->status()); + } +} From 35b87de27c9dfcf6856b0ba5375a31a575877139 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 21:19:11 +0100 Subject: [PATCH 02/11] set up fractal property in setup --- tests/ResponseTest.php | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index a2ca94a..2bf234b 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -7,10 +7,14 @@ class ResponseTest extends TestCase { - /** Set-up a new Fractal instance using fractal() helper method */ - public function fractal() + /** @var \Spatie\Fractal\Fractal */ + protected $fractal; + + public function setUp($defaultSerializer = '') { - return fractal() + parent::setUp(); + + $this->fractal = fractal() ->collection(['item', 'item2']) ->transformWith(function ($item) { return $item.'-transformed'; @@ -20,7 +24,7 @@ public function fractal() /** @test */ public function it_makes_a_json_response() { - $response = $this->fractal()->respond(); + $response = $this->fractal->respond(); $this->assertInstanceOf(JsonResponse::class, $response); $this->assertEquals('{"data":["item-transformed","item2-transformed"]}', json_encode($response->getData())); @@ -30,7 +34,7 @@ public function it_makes_a_json_response() /** @test */ public function it_sets_a_status_code_provided_as_a_parameter() { - $response = $this->fractal()->respond(404); + $response = $this->fractal->respond(404); $this->assertEquals(404, $response->status()); } @@ -38,7 +42,7 @@ public function it_sets_a_status_code_provided_as_a_parameter() /** @test */ public function it_sets_headers_provided_as_a_parameter() { - $response = $this->fractal() + $response = $this->fractal ->respond(404, ['test' => 'test-value', 'test2' => 'test2-value']); $this->assertArraySubset([ @@ -50,7 +54,7 @@ public function it_sets_headers_provided_as_a_parameter() /** @test */ public function status_code_can_be_provided_in_the_closure() { - $response = $this->fractal() + $response = $this->fractal ->respond(function ($response) { $response->code(404); }); @@ -61,7 +65,7 @@ public function status_code_can_be_provided_in_the_closure() /** @test */ public function headers_can_be_provided_in_the_closure() { - $response = $this->fractal() + $response = $this->fractal ->respond(function ($response) { $response->header('test', 'test-value'); $response->headers(['test2' => 'test2-value']); @@ -76,7 +80,7 @@ public function headers_can_be_provided_in_the_closure() /** @test */ public function the_code_can_be_allowed_along_with_the_callback() { - $response = $this->fractal() + $response = $this->fractal ->respond(404, function ($response) { $response->header('test', 'test-value'); }); @@ -90,7 +94,7 @@ public function the_code_can_be_allowed_along_with_the_callback() /** @test */ public function callback_allows_chaining() { - $response = $this->fractal() + $response = $this->fractal ->respond(function ($response) { $response ->header('test', 'test-value') From d3d1ab9da6901765a2b6d234a8211b0903343312 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 21:55:18 +0100 Subject: [PATCH 03/11] rename tests --- tests/ResponseTest.php | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index 2bf234b..1542041 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -2,8 +2,8 @@ namespace Spatie\Fractal\Test; -use Spatie\Fractal\Fractal; use Illuminate\Http\JsonResponse; +use Spatie\Fractal\Response; class ResponseTest extends TestCase { @@ -22,7 +22,7 @@ public function setUp($defaultSerializer = '') } /** @test */ - public function it_makes_a_json_response() + public function it_can_return_a_json_response() { $response = $this->fractal->respond(); @@ -32,7 +32,7 @@ public function it_makes_a_json_response() } /** @test */ - public function it_sets_a_status_code_provided_as_a_parameter() + public function it_uses_the_given_response_code() { $response = $this->fractal->respond(404); @@ -40,10 +40,13 @@ public function it_sets_a_status_code_provided_as_a_parameter() } /** @test */ - public function it_sets_headers_provided_as_a_parameter() + public function it_uses_the_given_headers() { $response = $this->fractal - ->respond(404, ['test' => 'test-value', 'test2' => 'test2-value']); + ->respond(404, [ + 'test' => 'test-value', + 'test2' => 'test2-value' + ]); $this->assertArraySubset([ 'test' => ['test-value'], @@ -52,7 +55,7 @@ public function it_sets_headers_provided_as_a_parameter() } /** @test */ - public function status_code_can_be_provided_in_the_closure() + public function it_accepts_a_status_code_in_the_given_closure() { $response = $this->fractal ->respond(function ($response) { @@ -63,7 +66,7 @@ public function status_code_can_be_provided_in_the_closure() } /** @test */ - public function headers_can_be_provided_in_the_closure() + public function it_accepts_a_headers_in_the_given_closure() { $response = $this->fractal ->respond(function ($response) { @@ -78,7 +81,7 @@ public function headers_can_be_provided_in_the_closure() } /** @test */ - public function the_code_can_be_allowed_along_with_the_callback() + public function it_accept_a_response_code_and_a_callback() { $response = $this->fractal ->respond(404, function ($response) { @@ -92,7 +95,7 @@ public function the_code_can_be_allowed_along_with_the_callback() } /** @test */ - public function callback_allows_chaining() + public function all_allowed_methods_in_the_callback_are_chainable() { $response = $this->fractal ->respond(function ($response) { @@ -115,4 +118,14 @@ public function callback_allows_chaining() $this->assertEquals(404, $response->status()); } + + /** @test */ + public function the_status_code_set_in_the_closure_will_be_used_event_when_passing_a_status_code_to_the_respond_method() + { + $response = $this->fractal->respond(200, function(Response $response) { + $response->code(300); + }); + + $this->assertEquals(200, $response->getStatusCode()); + } } From c0db5a12271aff10fddac81c47d1dacf8bd3ecd5 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 21:56:10 +0100 Subject: [PATCH 04/11] fix tests --- tests/ResponseTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index 1542041..9c03eef 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -126,6 +126,6 @@ public function the_status_code_set_in_the_closure_will_be_used_event_when_passi $response->code(300); }); - $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals(300, $response->getStatusCode()); } } From bedd3faaeb3b23c9240744668ec50f634c4e8516 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 22:51:15 +0100 Subject: [PATCH 05/11] refactor respond method --- src/Fractal.php | 45 ++++++++++++++++++++++++++------------------- src/Response.php | 21 ++++----------------- 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/src/Fractal.php b/src/Fractal.php index 61eeb8e..388553c 100644 --- a/src/Fractal.php +++ b/src/Fractal.php @@ -8,39 +8,46 @@ class Fractal extends Fractalistic { - /** @var \Spatie\Fractal\Response */ - protected $response; - /** @param \League\Fractal\Manager $manager */ public function __construct(Manager $manager) { parent::__construct($manager); - - $this->response = new Response; } /** * Return a new JSON response. * - * @param callable|int $callbackOrStatusCode - * @param array $headers + * @param callable|int $statusCode + * @param callabel|array $headers * * @return \Illuminate\Http\JsonResponse */ - public function respond($callbackOrStatusCode = 200, $callbackOrHeaders = []) + public function respond($statusCode = 200, $headers = []) { - if (is_callable($callbackOrStatusCode)) { - $callbackOrStatusCode($this->response); - } else { - $this->response->code($callbackOrStatusCode); - - if (is_callable($callbackOrHeaders)) { - $callbackOrHeaders($this->response); - } else { - $this->response->headers($callbackOrHeaders); - } + $response = new Response(); + + $response->setData($this->createData()->toArray()); + + if (is_int($statusCode)) { + $statusCode = function(Response $response) use ($statusCode) { + return $response->setStatusCode($statusCode); + }; + } + + if (is_array($headers)) { + $headers = function(Response $response) use ($headers) { + return $response->headers($headers); + }; + } + + if (is_callable($statusCode)) { + $statusCode($response); + } + + if (is_callable($headers)) { + $headers($response); } - return new JsonResponse($this->createData()->toArray(), $this->response->statusCode(), $this->response->getHeaders()); + return $response; } } diff --git a/src/Response.php b/src/Response.php index 9a22ca6..ee59e04 100644 --- a/src/Response.php +++ b/src/Response.php @@ -2,13 +2,15 @@ namespace Spatie\Fractal; -class Response +use Illuminate\Http\JsonResponse; + +class Response extends JsonResponse { /** @var int */ protected $statusCode = 200; /** @var array */ - protected $headers = []; + public $headers = []; /** * Get the status code. @@ -44,21 +46,6 @@ public function getHeaders() return $this->headers; } - /** - * Set one HTTP header. - * - * @param string $key - * @param string $value - * - * @return self - */ - public function header($key, $value) - { - $this->headers[$key] = $value; - - return $this; - } - /** * Set multiple headers at once. * From cc30e245230c64ac9806e696311f013f574b6a74 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 22:53:46 +0100 Subject: [PATCH 06/11] remove custom methods --- src/Response.php | 24 ------------------------ tests/ResponseTest.php | 6 +++--- 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/src/Response.php b/src/Response.php index ee59e04..81fe214 100644 --- a/src/Response.php +++ b/src/Response.php @@ -12,30 +12,6 @@ class Response extends JsonResponse /** @var array */ public $headers = []; - /** - * Get the status code. - * - * @return int - */ - public function statusCode() - { - return $this->statusCode; - } - - /** - * Set the status code. - * - * @param int $statusCode - * - * @return self - */ - public function code($statusCode) - { - $this->statusCode = $statusCode; - - return $this; - } - /** * Return HTTP headers. * diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index 9c03eef..a914539 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -59,7 +59,7 @@ public function it_accepts_a_status_code_in_the_given_closure() { $response = $this->fractal ->respond(function ($response) { - $response->code(404); + $response->setStatusCode(404); }); $this->assertEquals(404, $response->status()); @@ -101,7 +101,7 @@ public function all_allowed_methods_in_the_callback_are_chainable() ->respond(function ($response) { $response ->header('test', 'test-value') - ->code(404) + ->setStatusCode(404) ->headers([ 'test3' => 'test3-value', 'test4' => 'test4-value', @@ -123,7 +123,7 @@ public function all_allowed_methods_in_the_callback_are_chainable() public function the_status_code_set_in_the_closure_will_be_used_event_when_passing_a_status_code_to_the_respond_method() { $response = $this->fractal->respond(200, function(Response $response) { - $response->code(300); + $response->setStatusCode(300); }); $this->assertEquals(300, $response->getStatusCode()); From 5ec81fe1640d415d05a513dd42a0ea1d9cf4e706 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 22:56:54 +0100 Subject: [PATCH 07/11] only keep headers method in response --- src/Response.php | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/Response.php b/src/Response.php index 81fe214..e8c2691 100644 --- a/src/Response.php +++ b/src/Response.php @@ -6,22 +6,6 @@ class Response extends JsonResponse { - /** @var int */ - protected $statusCode = 200; - - /** @var array */ - public $headers = []; - - /** - * Return HTTP headers. - * - * @return array - */ - public function getHeaders() - { - return $this->headers; - } - /** * Set multiple headers at once. * From 08ca7ce762a4c4f90d7b26307933071e7d617c99 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 22:58:44 +0100 Subject: [PATCH 08/11] set closure typehints --- tests/ResponseTest.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index a914539..b95af50 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -16,7 +16,7 @@ public function setUp($defaultSerializer = '') $this->fractal = fractal() ->collection(['item', 'item2']) - ->transformWith(function ($item) { + ->transformWith(function (string $item) { return $item.'-transformed'; }); } @@ -58,7 +58,7 @@ public function it_uses_the_given_headers() public function it_accepts_a_status_code_in_the_given_closure() { $response = $this->fractal - ->respond(function ($response) { + ->respond(function (Response $response) { $response->setStatusCode(404); }); @@ -69,7 +69,7 @@ public function it_accepts_a_status_code_in_the_given_closure() public function it_accepts_a_headers_in_the_given_closure() { $response = $this->fractal - ->respond(function ($response) { + ->respond(function (Response $response) { $response->header('test', 'test-value'); $response->headers(['test2' => 'test2-value']); }); @@ -84,7 +84,7 @@ public function it_accepts_a_headers_in_the_given_closure() public function it_accept_a_response_code_and_a_callback() { $response = $this->fractal - ->respond(404, function ($response) { + ->respond(404, function (Response $response) { $response->header('test', 'test-value'); }); @@ -98,7 +98,7 @@ public function it_accept_a_response_code_and_a_callback() public function all_allowed_methods_in_the_callback_are_chainable() { $response = $this->fractal - ->respond(function ($response) { + ->respond(function (Response $response) { $response ->header('test', 'test-value') ->setStatusCode(404) From 5237147cdb80e5586c6380e0b57e04ae18e5fae7 Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 23:14:40 +0100 Subject: [PATCH 09/11] edit readme --- README.md | 57 +++++++++++++++++++++++----------------------- tests/TestCase.php | 1 - 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index c22ba5f..c5658c2 100644 --- a/README.md +++ b/README.md @@ -125,44 +125,45 @@ Refer to [the documentation of `spatie/fractalistic`](https://github.com/spatie/ In all code examples you may use `fractal()` instead of `Fractal::create()`. -## Attaching a status code and headers +## Send a response with transformed data -Now you can easily create fractal responses with status codes and headers. +To return a response with json data you can to this in a Laravel app. -Previously what you might have done is this ugly JSON response just to attach a response code or headers: ```php -return response()->json( - fractal() - ->item('These credentials do not match our records.') - ->transformWith(new ErrorTransformer) - ->serializeWith(new ArraySerializer) - ->toArray() -, 433, $headers); + +$books = fractal($books, new BookTransformer())->toArray(); + +return response()->json($books); ``` -now, you can easily chain on the status code inside the `respond()` method: + +The `response()` method on the Fractal class can make this process a bit more streamlined. + ```php -return fractal() - ->item('These credentials do not match our records.') - ->transformWith(new ErrorTransformer) - ->serializeWith(new ArraySerializer) - ->respond(433, $headers); +return fractal($books, new BookTransformer())->respond(); ``` -If you have some complicated headers' or status code's connected logic, you can do it in a callback like so: +You can pass a response code as the first parameter and optional some headers as the second + ```php -return fractal() - ->item('These credentials do not match our records.') - ->transformWith(new ErrorTransformer) - ->serializeWith(new ArraySerializer) - ->respond(function ($response) { - $response->code(433) - ->header('test-header', 'test-value') - ->headers([ - 'test2-header' => 'test2-value', - ]); - }); +return fractal($books, new BookTransformer())->respond(403, [ + 'a-header' => 'a value', + 'another-header => 'another value', +]); ``` +You can also set the status code and the headers useing a callback: + +```php +return fractal($books, new BookTransformer())->respond(function(Reponse $response) { + $response + ->setStatusCode(433) + ->header('a-header', 'a value') + ->headers([ + 'another-header => 'another value', + 'yet-another-header => 'yet another value', + ]); +}); +``` ## Quickly creating a transformer diff --git a/tests/TestCase.php b/tests/TestCase.php index c436b78..dacdd74 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,7 +2,6 @@ namespace Spatie\Fractal\Test; -use Spatie\Fractal\Fractal; use Spatie\Fractal\FractalServiceProvider; use Orchestra\Testbench\TestCase as Orchestra; From a8733057d8c83ea17046ea5f0f8f585137366a1f Mon Sep 17 00:00:00 2001 From: freek Date: Thu, 5 Jan 2017 23:23:01 +0100 Subject: [PATCH 10/11] remove scalar type hint --- tests/ResponseTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index b95af50..5ed7fb6 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -16,7 +16,7 @@ public function setUp($defaultSerializer = '') $this->fractal = fractal() ->collection(['item', 'item2']) - ->transformWith(function (string $item) { + ->transformWith(function ($item) { return $item.'-transformed'; }); } From 87d98f4355c75eb46154715d80f8b5da246477f2 Mon Sep 17 00:00:00 2001 From: Freek Van der Herten Date: Thu, 5 Jan 2017 23:23:18 +0100 Subject: [PATCH 11/11] Apply fixes from StyleCI (#74) --- src/Fractal.php | 5 ++--- tests/ResponseTest.php | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Fractal.php b/src/Fractal.php index 388553c..135d6b2 100644 --- a/src/Fractal.php +++ b/src/Fractal.php @@ -3,7 +3,6 @@ namespace Spatie\Fractal; use League\Fractal\Manager; -use Illuminate\Http\JsonResponse; use Spatie\Fractalistic\Fractal as Fractalistic; class Fractal extends Fractalistic @@ -29,13 +28,13 @@ public function respond($statusCode = 200, $headers = []) $response->setData($this->createData()->toArray()); if (is_int($statusCode)) { - $statusCode = function(Response $response) use ($statusCode) { + $statusCode = function (Response $response) use ($statusCode) { return $response->setStatusCode($statusCode); }; } if (is_array($headers)) { - $headers = function(Response $response) use ($headers) { + $headers = function (Response $response) use ($headers) { return $response->headers($headers); }; } diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index 5ed7fb6..81606be 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -2,8 +2,8 @@ namespace Spatie\Fractal\Test; -use Illuminate\Http\JsonResponse; use Spatie\Fractal\Response; +use Illuminate\Http\JsonResponse; class ResponseTest extends TestCase { @@ -45,7 +45,7 @@ public function it_uses_the_given_headers() $response = $this->fractal ->respond(404, [ 'test' => 'test-value', - 'test2' => 'test2-value' + 'test2' => 'test2-value', ]); $this->assertArraySubset([ @@ -122,7 +122,7 @@ public function all_allowed_methods_in_the_callback_are_chainable() /** @test */ public function the_status_code_set_in_the_closure_will_be_used_event_when_passing_a_status_code_to_the_respond_method() { - $response = $this->fractal->respond(200, function(Response $response) { + $response = $this->fractal->respond(200, function (Response $response) { $response->setStatusCode(300); });