bauer01/unimapper-nette

Official Nette extension for UniMapper

v1.2.1 2015-12-02 14:02 UTC

This package is auto-updated.

Last update: 2024-11-14 10:48:25 UTC


README

Build Status

Official Unimapper extension for Nette framework.

Install

$ composer require unimapper/nette:@dev

Nette 2.1 and higher

Register extension in config.neon.

extensions:
    unimapper: UniMapper\Nette\Extension

Nette 2.0

Register extension in app/bootstrap.php.

UniMapper\Nette\Extension::register($configurator);

return $configurator->createContainer();

Configuration

unimapper:
    adapters:
        Mongo: @service
        MySQL: @anotherService
        ...
    cache: true
    namingConvention:
        entity: 'YourApp\Model\*'
        repository: 'YourApp\Repository\*Repository'
    api:
        enabled: false
        module: "Api"
        route: true
    panel:
        enabled: true
        ajax: true # log queries in AJAX requests
    profiler: true
    customQueries:
        - CustomQueryClass
        - ...

API

Creating new API for your application is very easy, all you need is presenter for every entity you have.

Remember that every API presenter should always extend UniMapper\Nette\Api\Presenter.

namespace YourApp\ApiModule\Presenter;

class EntityPresenter extends \UniMapper\Nette\Api\Presenter
{
    ...
}

Now you can call standard API methods like:

GET

  • associate - common parameter used to tell which association should be included in response. Syntax should be like ?associate[]=property1&associate[]=property2 or ?associate=property1,property2.

** Response**

{
    "body": {..}
}

/api/entity/id

Get a single record.

/api/entity

Get all records.

  • count - optional parameter, if ?count=true set then items count number will be returned in response body instead data.
  • limit - maximum limit is set to 10. You can change it by overriding property $maxLimit in your API presenter descendant.
  • offset
  • where

PUT

/api/entity

Update all records with JSON data stored in request body. Filtering can be set and response body contains number of affected records.

** Response**

{
    "body": 3,
    "success": true
}

/api/entity/id

Update single record with JSON data stored in request body.

** Response**

{
    "success": true
}

POST

Create new record with JSON data stored in request body and primary value of new entity returned in response body.

/api/entity

** Response**

{
    "success": true,
    "link": "url to created entity",
    "body": "id of created entity"
}

DELETE

/api/entity

Delete all records returned body contains number of deleted records.

** Response**

{
    "body": {..}
    "success": true
}

/api/entity/id

Delete single record.

** Response**

{
    "success": true
}

Custom API methods

You can even define your custom method.

namespace YourApp\ApiModule\Presenter;

class EntityPresenter extends \UniMapper\Nette\Api\Presenter
{
    public function actionYourCustomMethod($id)
    {
        ...
    }
}

Then you can make a requests like /api/entity/1?action=yourCustomMehod.

Filtering data

Filter can be set as a GET parameter where in URL. It should be here a valid JSON format as described here.

Error response

If some bad request detected or an error occurred the returned response can be like this:

{
    "success": false
    "code": 405,
    "messages": []
}

Generating links

In your templates just use standard Nette link macro.

  • {link :Api:Entity:get}
  • {link :Api:Entity:get 1}
  • {link :Api:Entity:put 1}
  • {link :Api:Entity:post}
  • {link :Api:Entity:action}

Usage

You can even build another applications using this API, just register an official API adapter class UniMapper\Nette\Api\Adapter in your config.neon.

Custom request factory

For easier API queries you can register factory interface as a dynamic service in your config.neon.

services:
    - UniMapper\Nette\Api\ICustomRequestFactory

Usage in your reopistory can look like this:

class SomeRepository extends \UniMapper\Repository
{
    private $requestFactory;

    public function __construct(
        \UniMapper\Connection $connection,
        \UniMapper\Nette\Api\ICustomRequestFactory $requestFactory
    ) {
        parent::__construct($connection);
        $this->requestFactory;
    }

    public function getSomethingFromApi()
    {
        $this->requestFactory()->setResource("apiResource")->setAction("custom")->send();
    }
}