Commit 5166024bcab8626a5d773971fa2db5f874837bf4

Authored by Alex Savenko
1 parent 8a4792e4

extended classes

app/library/App/Mvc/ExtendedApiCollection.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: Alex Savenko
  5 + * Date: 14.02.2017
  6 + * Time: 16:32
  7 + */
  8 +
  9 +namespace App\Mvc;
  10 +
  11 +
  12 +use PhalconApi\Constants\HttpMethods;
  13 +use PhalconRest\Api\ApiCollection;
  14 +
  15 +class ExtendedApiCollection extends ApiCollection {
  16 +
  17 + public function endpoint(ExtendedApiEndpoint $endpoint)
  18 + {
  19 + $this->endpointsByName[$endpoint->getName()] = $endpoint;
  20 +
  21 + switch ($endpoint->getHttpMethod()) {
  22 +
  23 + case HttpMethods::GET:
  24 +
  25 + $this->get($endpoint->getPath(), $endpoint->getHandlerMethod(), $this->createRouteName($endpoint));
  26 + break;
  27 +
  28 + case HttpMethods::POST:
  29 +
  30 + $this->post($endpoint->getPath(), $endpoint->getHandlerMethod(), $this->createRouteName($endpoint));
  31 + break;
  32 +
  33 + case HttpMethods::PUT:
  34 +
  35 + $this->put($endpoint->getPath(), $endpoint->getHandlerMethod(), $this->createRouteName($endpoint));
  36 + break;
  37 +
  38 + case HttpMethods::DELETE:
  39 +
  40 + $this->delete($endpoint->getPath(), $endpoint->getHandlerMethod(), $this->createRouteName($endpoint));
  41 + break;
  42 + }
  43 +
  44 + return $this;
  45 + }
  46 +
  47 +}
0 48 \ No newline at end of file
... ...
app/library/App/Mvc/ExtendedApiEndpoint.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: Alex Savenko
  5 + * Date: 14.02.2017
  6 + * Time: 16:15
  7 + */
  8 +
  9 +namespace App\Mvc;
  10 +
  11 +
  12 +use PhalconRest\Api\ApiEndpoint;
  13 +
  14 +class ExtendedApiEndpoint extends ApiEndpoint {
  15 +
  16 + protected $exampleRequest;
  17 +
  18 + /**
  19 + * @param string $exampleRequest Example of the request of the endpoint
  20 + *
  21 + * @return $this
  22 + */
  23 + public function exampleRequest($exampleRequest)
  24 + {
  25 + $this->exampleRequest = $exampleRequest;
  26 + return $this;
  27 + }
  28 +
  29 + /**
  30 + * @return string Example of the request of the endpoint
  31 + */
  32 + public function getExampleRequest()
  33 + {
  34 + return $this->exampleRequest;
  35 + }
  36 +
  37 +}
0 38 \ No newline at end of file
... ...
app/library/App/Mvc/ExtendedApiResource.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace App\Mvc;
  4 +
  5 +use App\Mvc\ExtendedApiCollection;
  6 +use App\Mvc\ExtendedApiEndpoint;
  7 +use Phalcon\Di;
  8 +use Phalcon\Mvc\Micro\CollectionInterface;
  9 +use PhalconApi\Acl\MountableInterface;
  10 +use PhalconRest\Constants\Services;
  11 +use PhalconRest\Mvc\Controllers\CrudResourceController;
  12 +use PhalconRest\Transformers\ModelTransformer;
  13 +
  14 +class ExtendedApiResource extends ExtendedApiCollection implements MountableInterface, CollectionInterface
  15 +{
  16 + protected $model;
  17 + protected $transformer;
  18 +
  19 + protected $itemKey;
  20 + protected $collectionKey;
  21 +
  22 + protected $_modelPrimaryKey;
  23 +
  24 + /**
  25 + * Returns resource with default values & all, find, create, update and delete endpoints pre-configured
  26 + *
  27 + * @param string $prefix Prefix for the resource (e.g. /user)
  28 + * @param string $name Name for the resource (e.g. users) (optional)
  29 + *
  30 + * @return static
  31 + */
  32 + public static function crud($prefix, $name = null)
  33 + {
  34 + return self::factory($prefix, $name)
  35 + ->endpoint(ExtendedApiEndpoint::all())
  36 + ->endpoint(ExtendedApiEndpoint::find())
  37 + ->endpoint(ExtendedApiEndpoint::create())
  38 + ->endpoint(ExtendedApiEndpoint::update())
  39 + ->endpoint(ExtendedApiEndpoint::remove());
  40 + }
  41 +
  42 + /**
  43 + * Returns resource with default values
  44 + *
  45 + * @param string $prefix Prefix for the resource (e.g. /user)
  46 + * @param string $name Name for the resource (e.g. users) (optional)
  47 + *
  48 + * @return static
  49 + */
  50 + public static function factory($prefix, $name = null)
  51 + {
  52 + $calledClass = get_called_class();
  53 +
  54 + /** @var ExtendedApiResource $resource */
  55 + $resource = new $calledClass($prefix);
  56 +
  57 + if (!$resource->getItemKey()) {
  58 + $resource->itemKey('items');
  59 + }
  60 +
  61 + if (!$resource->getCollectionKey()) {
  62 + $resource->collectionKey('items');
  63 + }
  64 +
  65 + if (!$resource->getTransformer()) {
  66 + $resource->transformer(ModelTransformer::class);
  67 + }
  68 +
  69 + if (!$resource->getHandler()) {
  70 + $resource->setHandler(CrudResourceController::class);
  71 + }
  72 +
  73 + if (!$resource->getName() && $name) {
  74 + $resource->name($name);
  75 + }
  76 +
  77 + if ($name) {
  78 + $resource->name($name);
  79 + }
  80 +
  81 + return $resource;
  82 + }
  83 +
  84 + /**
  85 + * @param string $model Classname of the model
  86 + *
  87 + * @return static
  88 + */
  89 + public function model($model)
  90 + {
  91 + $this->model = $model;
  92 + return $this;
  93 + }
  94 +
  95 + /**
  96 + * @return string|null Classname of the model
  97 + */
  98 + public function getModel()
  99 + {
  100 + return $this->model;
  101 + }
  102 +
  103 + /**
  104 + * @return string|null Primary key of the model
  105 + */
  106 + public function getModelPrimaryKey()
  107 + {
  108 + if (!$this->model) {
  109 + return null;
  110 + }
  111 +
  112 + if (!$this->_modelPrimaryKey) {
  113 +
  114 + /** @var \Phalcon\Mvc\Model\MetaData $modelsMetaData */
  115 + $modelsMetaData = Di::getDefault()->get(Services::MODELS_METADATA);
  116 +
  117 + $modelClass = $this->model;
  118 +
  119 + $this->_modelPrimaryKey = $modelsMetaData->getIdentityField(new $modelClass);
  120 + }
  121 +
  122 + return $this->_modelPrimaryKey;
  123 + }
  124 +
  125 + /**
  126 + * @param string $transformer Classname of the transformer
  127 + *
  128 + * @return static
  129 + */
  130 + public function transformer($transformer)
  131 + {
  132 + $this->transformer = $transformer;
  133 + return $this;
  134 + }
  135 +
  136 + /**
  137 + * @return string|null Classname of the transformer
  138 + */
  139 + public function getTransformer()
  140 + {
  141 + return $this->transformer;
  142 + }
  143 +
  144 + /**
  145 + * @param string $singleKey Response key for single item
  146 + *
  147 + * @return static
  148 + *
  149 + * @deprecated Use itemKey() instead
  150 + */
  151 + public function singleKey($singleKey)
  152 + {
  153 + return $this->itemKey($singleKey);
  154 + }
  155 +
  156 + /**
  157 + * @param string $itemKey Response key for single item
  158 + *
  159 + * @return static
  160 + */
  161 + public function itemKey($itemKey)
  162 + {
  163 + $this->itemKey = $itemKey;
  164 + return $this;
  165 + }
  166 +
  167 + /**
  168 + * @return string Response key for single item
  169 + *
  170 + * @deprecated Use getItemKey() instead
  171 + */
  172 + public function getSingleKey()
  173 + {
  174 + return $this->getItemKey();
  175 + }
  176 +
  177 + /**
  178 + * @return string Response key for single item
  179 + */
  180 + public function getItemKey()
  181 + {
  182 + return ($this->itemKey ?: $this->name) ?: 'item';
  183 + }
  184 +
  185 + /**
  186 + * @param string $multipleKey Response key for multiple items
  187 + *
  188 + * @return static
  189 + *
  190 + * @deprecated Use collectionKey() instead
  191 + */
  192 + public function multipleKey($multipleKey)
  193 + {
  194 + return $this->collectionKey($multipleKey);
  195 + }
  196 +
  197 + /**
  198 + * @param string $collectionKey Response key for multiple items
  199 + *
  200 + * @return static
  201 + */
  202 + public function collectionKey($collectionKey)
  203 + {
  204 + $this->collectionKey = $collectionKey;
  205 + return $this;
  206 + }
  207 +
  208 + /**
  209 + * @return string Response key for multiple items
  210 + *
  211 + * @deprecated Use getCollectionKey() instead
  212 + */
  213 + public function getMultipleKey()
  214 + {
  215 + return $this->getCollectionKey();
  216 + }
  217 +
  218 + /**
  219 + * @return string Response key for multiple items
  220 + */
  221 + public function getCollectionKey()
  222 + {
  223 + return ($this->collectionKey ?: $this->name) ?: 'items';
  224 + }
  225 +}
... ...
app/library/App/Resources/GaResource.php
... ... @@ -11,10 +11,12 @@ namespace App\Resources;
11 11  
12 12 use App\Constants\AclRoles;
13 13 use App\Controllers\GaController;
  14 +use App\Mvc\ExtendedApiResource;
14 15 use PhalconRest\Api\ApiEndpoint;
  16 +use App\Mvc\ExtendedApiEndpoint;
15 17 use PhalconRest\Api\ApiResource;
16 18  
17   -class GaResource extends ApiResource {
  19 +class GaResource extends ExtendedApiResource {
18 20  
19 21 public function initialize() {
20 22  
... ... @@ -27,7 +29,7 @@ class GaResource extends ApiResource {
27 29 ->deny(AclRoles::UNAUTHORIZED)
28 30 ->handler(GaController::class)
29 31  
30   - ->endpoint(ApiEndpoint::get('', 'getAction')
  32 + ->endpoint(ExtendedApiEndpoint::get('', 'getAction')
31 33 ->allow(AclRoles::USER)
32 34 ->description('Returns data from Google Analytics Api')
33 35 ->exampleResponse([
... ... @@ -41,6 +43,7 @@ class GaResource extends ApiResource {
41 43 ],
42 44 'full_docs' => 'https://developers.google.com/analytics/devguides/reporting/core/dimsmets',
43 45 ])
  46 + ->exampleRequest(['123' => '321'])
44 47 )
45 48 ;
46 49  
... ...