1. Go to this page and download the library: Download gointegro/hateoas library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
gointegro / hateoas example snippets
namespace HateoasInc\Entity;
use GoIntegro\Hateoas\JsonApi\ResourceEntityInterface
class User implements ResourceEntityInterface {}
namespace GoIntegro\Bundle\ExampleBundle\Rest2\Resource;
// Symfony 2.
use Symfony\Component\DependencyInjection\ContainerAwareInterface,
Symfony\Component\DependencyInjection\ContainerAwareTrait;
// HATEOAS.
use GoIntegro\Hateoas\JsonApi\EntityResource;
class UserResource extends EntityResource implements ContainerAwareInterface
{
use ContainerAwareTrait;
/**
* @var array
*/
public static $fieldWhitelist = ['name', 'surname', 'email'];
/**
* You wouldn't ever use both a blacklist and a whitelist.
* @var array
*/
public static $fieldBlacklist = ['password'];
/**
* @var array
*/
public static $relationshipBlacklist = ['groups'];
/**
* These appear as top-level links but not in the resource object.
* @var array
*/
public static $linkOnlyRelationships = ['followers'];
/**
* By injecting a field we can have both the JSON-API reserved key "type" and our own "user-type" attribute in the resource object.
* @return string
* @see http://jsonapi.org/format/#document-structure-resource-object-attributes
*/
public function injectUserType()
{
return $this->entity->getType();
}
/**
* We can use services if we implement the ContainerAwareInterface.
* @return string
*/
public function injectSomethingExtraordinary()
{
return $this->container->get('mystery_machine')->amaze();
}
}
class Team
{
/**
* @var ArrayCollection
* @OneToMany(
* targetEntity="User",
* mappedBy="team",
* cascade={"persist", "remove"}
* )
*/
private $members;
/**
* @param User $member
* @return self
*/
public function addMember(User $member)
{
$this->members->add($member);
$member->setTeam($this); // This is what you need.
return $this;
}
}
use GoIntegro\Hateoas\Controller\Controller,
Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class UsersController extends Controller
{
/**
* @Route("/users/{user}", name="api_get_user", methods="GET")
* @return \GoIntegro\Hateoas\Http\JsonResponse
*/
public function getUserAction(User $user)
{
$resourceManager = $serviceContainer->get('hateoas.resource_manager');
$resource = $resourceManager->createResourceFactory()
->setEntity($user)
->create();
$json = $resourceManager->createSerializerFactory()
->setDocumentResources($resource)
->create()
->serialize();
return $this->createETagResponse($json);
}
namespace GoIntegro\Bundle\SomeBundle\Rest2\Ghost;
// Entidades.
use GoIntegro\Bundle\SomeBundle\Entity\Star;
// JSON-API.
use GoIntegro\Hateoas\JsonApi\GhostResourceEntity,
GoIntegro\Hateoas\Metadata\Resource\ResourceRelationship,
GoIntegro\Hateoas\Metadata\Resource\ResourceRelationships;
// Colecciones.
use Doctrine\Common\Collections\ArrayCollection;
class StarCluster implements GhostResourceEntity
{
/**
* @var string
*/
private $id;
/**
* @var Star
*/
private $brightestStar;
/**
* @var ArrayCollection
*/
private $stars;
/**
* @param string $id
*/
public function __construct($id)
{
$this->id = $id;
$this->stars = new ArrayCollection;
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @param Star $star
* @return self
*/
public function setBrightestStar(Star $star)
{
$this->brightestStar = $star;
return $this;
}
/**
* @return Star
*/
public function getBrightestStar()
{
return $this->brightestStar;
}
/**
* @return ArrayCollection
*/
public function getStars()
{
return $this->stars;
}
/**
* @param \GoIntegro\Bundle\SomeBundle\Entity\Star $star
* @return self
*/
public function addStar(Star $star)
{
$this->stars[] = $star;
return $this;
}
/**
* @return ResourceRelationships
*/
public static function getRelationships()
{
$relationships = new ResourceRelationships;
$relationships->toMany['stars'] = new ResourceRelationship(
'GoIntegro\Bundle\SomeBundle\Entity\Star',
'stars', // resource type
'stars', // resource sub-type
'toMany', // relationship kind
'stars', // relationship name
'stars' // mapping field
);
$relationships->toOne['brightest-star'] = new ResourceRelationship(
'GoIntegro\Bundle\SomeBundle\Entity\Star',
'stars',
'stars',
'toOne',
'brightest-star',
'brightestStar'
);
return $relationships;
}
}
namespace GoIntegro\Entity\Suite;
// Testing.
use GoIntegro\Test\PHPUnit\ApiTestCase;
// Fixtures.
use GoIntegro\DataFixtures\ORM\Standard\SomeDataFixture;
class SomeResourceTest extends ApiTestCase
{
const RESOURCE_PATH = '/api/v2/some-resource',
RESOURCE_JSON_SCHEMA = '/schemas/some-resource.json';
/**
* Doctrine 2 data fixtures to load *before the test case*.
* @return array <FixtureInterface>
*/
protected static function getFixtures()
{
return array(new SomeDataFixture);
}
public function testGettingMany200()
{
/* Given... (Fixture) */
$url = $this->getRootUrl() . self::RESOURCE_PATH;
$client = $this->createHttpClient($url);
/* When... (Action) */
$transfer = $client->exec();
/* Then... (Assertions) */
$this->assertResponseOK($client);
$this->assertJsonApiSchema($transfer);
$schema = __DIR__ . self::RESOURCE_JSON_SCHEMA;
$this->assertJsonSchema($schema, $transfer);
}
public function testGettingSortedBySomeCustomField400()
{
/* Given... (Fixture) */
$url = $this->getRootUrl()
. self::RESOURCE_PATH
. '?sort=some-custom-field';
$client = $this->createHttpClient($url);
/* When... (Action) */
$transfer = $client->exec();
/* Then... (Assertions) */
$this->assertResponseBadRequest($client);
}
}
POST /users/1/links/user-groups
PUT /users/1/links/user-groups
DELETE /users/1/links/user-groups
DELETE /users/1/links/user-groups/1
DELETE /users/1/links/user-groups/1,2,3
GET /articles/1?meta=i18n
Accept-Language: en_GB
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.