static function entity(\PDO $db, $id) { return Resource::create(self::defaults())->allowedMethods(['GET', 'PUT', 'DELETE'])->isProcessable(self::validator())->canPutToMissing(false)->isNew(false)->isRespondWithEntity(function (Context $context) { return $context->getRequest()->isMethod('PUT'); })->exists(function ($context) use($db, $id) { return Todo::exists($db, $id); })->put(function ($context) use($db, $id) { Todo::update($db, $id, $context->entity); })->delete(function ($context) use($db, $id) { Todo::delete($db, $id); })->handleOk(function (Context $context) use($db, $id) { return Todo::fetchOne($db, $id); }); }
function testTypicalCollectionResource() { $entities = []; $resource = Resource::create()->allowedMethods(['GET', 'POST'])->availableMediaTypes(['application/json'])->isMalformed([self::class, 'validateJson'])->isProcessable(function (Context $context) { return $context->getRequest()->isMethod('GET') || isset($context->entity->title); })->post(function (Context $context) use(&$entities) { $entity = (array) $context->entity; $entity['id'] = count($entities) + 1; $entities[] = $entity; $context->newEntity = $entity; })->handleOk(function (Context $context) use(&$entities) { return $entities; })->handleCreated(function (Context $context) { return $context->newEntity; }); $this->assertEquals('[]', $this->GET($resource)->getContent()); $this->assertStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY, $this->POST($resource, json_encode([]))); $response = $this->POST($resource, json_encode(['title' => 'testing post'])); $this->assertStatusCode(Response::HTTP_CREATED, $response); $this->assertEquals(['id' => 1, 'title' => 'testing post'], (array) json_decode($response->getContent())); $this->assertStatusCode(Response::HTTP_CREATED, $this->POST($resource, json_encode(['title' => 'lorem ipsum']))); $this->assertEquals([(object) ['id' => 1, 'title' => 'testing post'], (object) ['id' => 2, 'title' => 'lorem ipsum']], json_decode($this->GET($resource)->getContent())); }
<?php require_once 'vendor/autoload.php'; use RestMachine\Resource; use RestMachine\Context; use RestMachine\WebMachine; $defaults = Resource::create()->availableMediaTypes(['application/json', 'application/php']); $resource = Resource::create($defaults)->allowedMethods(['GET', 'POST'])->lastModified(new \DateTime('2015-06-28', new \DateTimeZone('Europe/Vienna')))->etag('aXs3f')->isMalformed(function (Context $context) { if ($context->getRequest()->getContent()) { json_decode($context->getRequest()->getContent()); return json_last_error(); } return false; })->handleOk(function (Context $context) { return ['hi there']; })->post(function (Context $context) { $context->newEntity = ['foo']; })->handleCreated(function (Context $context) { return $context->newEntity; }); $request = PHP_SAPI != 'cli' ? \Symfony\Component\HttpFoundation\Request::createFromGlobals() : \Symfony\Component\HttpFoundation\Request::create('http://example.com/foo'); $webMachine = new WebMachine(); //$webMachine->enableTrace(); $response = $webMachine->run($resource, $request); if (PHP_SAPI != 'cli') { $response->send(); } else { echo $response, PHP_EOL; }