@ -0,0 +1,13 @@ | |||||
# Gear - Directus PHP Client | |||||
Small Libary to request Directus API. | |||||
## ItemCollection | |||||
**URL** | |||||
**Token** | |||||
```PHP | |||||
$itemCollection = new ItemCollection($url, $token); | |||||
$articles = $itemCollection->find('articles', ['status' => 'published']); | |||||
``` |
@ -0,0 +1,19 @@ | |||||
{ | |||||
"name": "super-gear/directus", | |||||
"version": "0.1.0", | |||||
"type": "library", | |||||
"license": "MIT", | |||||
"authors": [ | |||||
{ "name": "Björn Hase", "email": "me@tentakelfabrik.de" } | |||||
], | |||||
"require": { | |||||
"php": "^7.0", | |||||
"mikecao/flight": "^1.3", | |||||
"erusev/parsedown": "^1.7" | |||||
}, | |||||
"autoload": { | |||||
"psr-4": { | |||||
"SuperGear\\": "src/" | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,114 @@ | |||||
<?php | |||||
namespace SuperGear\Directus\Collections; | |||||
/** | |||||
* send request with curl to directus instance | |||||
* | |||||
* | |||||
* @author Björn Hase | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||||
* | |||||
*/ | |||||
class AbstractCollection | |||||
{ | |||||
/** url */ | |||||
private $url = NULL; | |||||
/** token */ | |||||
private $token = NULL; | |||||
/** curl */ | |||||
private $curl = NULL; | |||||
/** endpoint */ | |||||
protected $endpoint = NULL; | |||||
/** | |||||
* | |||||
* @param string $url | |||||
* @param string $token | |||||
*/ | |||||
public function __construct($url, $token) | |||||
{ | |||||
$this->url = $url; | |||||
$this->token = $token; | |||||
} | |||||
/** | |||||
* | |||||
* | |||||
* @param string $name | |||||
* @param array $parameters | |||||
* @return mixed | |||||
*/ | |||||
public function findOne($name, $parameters = []) | |||||
{ | |||||
// adding single to parameters | |||||
$parameters['single'] = true; | |||||
$response = $this->request($name, $this->endpoint, $parameters); | |||||
return $response; | |||||
} | |||||
/** | |||||
* | |||||
* | |||||
* @param string $name | |||||
* @param array $parameters | |||||
* @return mixed | |||||
* | |||||
*/ | |||||
public function find($name, $parameters = []) | |||||
{ | |||||
return $this->request($name, $this->endpoint, $parameters); | |||||
} | |||||
/** | |||||
* request $endpoint | |||||
* | |||||
* @param string $name | |||||
* @param string $endpoint | |||||
* @param array $parameters | |||||
* @return mixed | |||||
* | |||||
*/ | |||||
protected function request($name, $endpoint, $parameters = []) | |||||
{ | |||||
// init curl and setup token | |||||
$curl = curl_init(); | |||||
curl_setopt($curl, CURLOPT_HTTPHEADER, [ | |||||
'Accept: application/json', | |||||
'Content-Type: application/json', | |||||
'Authorization: Bearer '.$this->token | |||||
]); | |||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | |||||
$response = []; | |||||
if (count($parameters) > 0) { | |||||
$query = http_build_query($parameters); | |||||
} | |||||
$url = $this->url.$endpoint.'/'.$name; | |||||
// query parameters are set, add them to url | |||||
if (isset($query)) { | |||||
$url = $url.'?'.$query; | |||||
} | |||||
curl_setopt($curl, CURLOPT_URL, $url); | |||||
$response = curl_exec($curl); | |||||
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); | |||||
$info = curl_getinfo($curl); | |||||
curl_close($curl); | |||||
$response = json_decode($response, true); | |||||
return $response; | |||||
} | |||||
} |
@ -0,0 +1,28 @@ | |||||
<?php | |||||
namespace SuperGear\Directus\Collections; | |||||
/** | |||||
* endpoint "items" for directus | |||||
* | |||||
* | |||||
* @author Björn Hase | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||||
* | |||||
*/ | |||||
class ItemCollection extends AbstractCollection | |||||
{ | |||||
/** | |||||
* | |||||
* @param string $url | |||||
* @param string $token | |||||
*/ | |||||
public function __construct($url, $token) | |||||
{ | |||||
// adding endpoint for items | |||||
$this->endpoint = '/items'; | |||||
parent::__construct($url, $token); | |||||
} | |||||
} |
@ -0,0 +1,69 @@ | |||||
<?php | |||||
namespace SuperGear\Directus\Controllers; | |||||
use SuperGear\FlightAbstract; | |||||
use Exception; | |||||
/** | |||||
* abstract controller to handle views and response from directus | |||||
* | |||||
* | |||||
* @author Björn Hase | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||||
* | |||||
*/ | |||||
abstract class ControllerAbstract extends FlightAbstract | |||||
{ | |||||
protected $defaultView = NULL; | |||||
/** | |||||
* if item not found | |||||
* | |||||
* @param string $page | |||||
* @return boolean | |||||
*/ | |||||
protected function notFound($item) | |||||
{ | |||||
return (!$item || ($item && isset($item['error']) && $item['error']['code'] === 203)); | |||||
} | |||||
/** | |||||
* | |||||
* @param string $view | |||||
* @return boolean | |||||
*/ | |||||
protected function viewExists($view) | |||||
{ | |||||
return file_exists($this->app->get('flight.views.path').'/'.$view.'.blade.php'); | |||||
} | |||||
/** | |||||
* | |||||
* @param [type] $page [description] | |||||
* @param array $data [description] | |||||
* @return [type] [description] | |||||
*/ | |||||
protected function render($item, $data = []) | |||||
{ | |||||
$view = $this->defaultView; | |||||
// if view isset in page and file exists | |||||
if (isset($item['data']['view'])) { | |||||
if ($this->viewExists($item['data']['view'])) { | |||||
$view = $item['data']['view']; | |||||
} else { | |||||
throw new Exception('View '.$item['data']['view'].' not exists'); | |||||
} | |||||
} else if (!$this->viewExists($view)) { | |||||
throw new Exception('View '.$view.' not exists'); | |||||
} | |||||
$this->app->render($view, array_merge([ | |||||
'page' => $item | |||||
], | |||||
$data | |||||
)); | |||||
} | |||||
} |
@ -0,0 +1,27 @@ | |||||
<?php | |||||
namespace SuperGear\Directus; | |||||
use Flight; | |||||
/** | |||||
* abstract FlightAbstract get instance of flight engine | |||||
* | |||||
* @author Björn Hase | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://gitlab.tentakelfabrik.de/super-gear/super-gear-directus GitHub Repository | |||||
*/ | |||||
abstract class FlightAbstract | |||||
{ | |||||
/** object of flight */ | |||||
protected $app; | |||||
/** | |||||
* getting object of flight | |||||
* | |||||
*/ | |||||
public function __construct() | |||||
{ | |||||
$this->app = Flight::app(); | |||||
} | |||||
} |
@ -0,0 +1,12 @@ | |||||
<?php | |||||
/** | |||||
* fake function for blade @inject | |||||
* | |||||
* @param string $class | |||||
* @return object | |||||
*/ | |||||
function app($class) | |||||
{ | |||||
return new $class(); | |||||
} |
@ -0,0 +1,47 @@ | |||||
<?php | |||||
namespace SuperGear\Directus\Helpers; | |||||
use Parsedown; | |||||
/** | |||||
* Helper to extend Parsedown | |||||
* | |||||
* @author Björn Hase | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||||
*/ | |||||
class MarkdownHelper extends Parsedown | |||||
{ | |||||
/** | |||||
* | |||||
* @var string | |||||
*/ | |||||
const EXTERNAL_LINK = "/^(http|https):\/\//"; | |||||
const INNER_BRACKETS = "/\){(.*?)\}/"; | |||||
const TARGET_BLANK = "_blank"; | |||||
const DIVIDER_METHOD = ':'; | |||||
const DIVIDER_SIZES = 'x'; | |||||
/** | |||||
* extend default function, if a link has http|https in url, | |||||
* then handle this link as external and set target to _blank | |||||
* | |||||
* @param array $excerpt | |||||
* @return array | |||||
*/ | |||||
protected function inlineLink($excerpt) | |||||
{ | |||||
$result = parent::inlineLink($excerpt); | |||||
if (is_array($result)) { | |||||
if (isset($result['element']['attributes'])) { | |||||
if (preg_match(self::EXTERNAL_LINK, $result['element']['attributes']['href'])) { | |||||
$result['element']['attributes']['target'] = self::TARGET_BLANK; | |||||
} | |||||
} | |||||
return $result; | |||||
} | |||||
} | |||||
} |
@ -0,0 +1,49 @@ | |||||
<?php | |||||
namespace SuperGear\Directus\Repositories; | |||||
use Exception; | |||||
/** | |||||
* Manager Class to create Repository Objects that | |||||
* are located in App\Repositories\ | |||||
* | |||||
* | |||||
* @author Björn Hase | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://gitlab.tentakelfabrik.de/super-gear/super-gear-directus GitHub Repository | |||||
*/ | |||||
class Manager | |||||
{ | |||||
/** | |||||
* naming of Repository | |||||
* @var string | |||||
*/ | |||||
const NAMESPACE = 'App\Repositories\\'; | |||||
/** | |||||
* naming of Repository | |||||
* @var string | |||||
*/ | |||||
const REPOSITORY_SUFFIX = 'Repository'; | |||||
/** | |||||
* getting repository object | |||||
* | |||||
* @param string $repositoryClass | |||||
* @return AbstractRepository | |||||
*/ | |||||
public static function get($repositoryName) | |||||
{ | |||||
$repositoryClass = self::NAMESPACE.$repositoryName.self::REPOSITORY_SUFFIX; | |||||
if (!class_exists($repositoryClass)) { | |||||
throw new Exception('Repository Class '.$repositoryClass.' not exists!'); | |||||
} | |||||
// create respository object | |||||
$repository = new $repositoryClass(); | |||||
return $repository; | |||||
} | |||||
} |
@ -0,0 +1,38 @@ | |||||
<?php | |||||
namespace SuperGear\Repositories; | |||||
use SuperGear\DirectusClient\Collections\ItemCollection; | |||||
/** | |||||
* Abstract Repository to wrap ItemCollection | |||||
* | |||||
* | |||||
* @author Björn Hase | |||||
* @license http://opensource.org/licenses/MIT The MIT License | |||||
* @link https://gitlab.tentakelfabrik.de/super-gear/super-gear-directus GitHub Repository | |||||
*/ | |||||
abstract class RepositoryAbstract | |||||
{ | |||||
/** name of the collection */ | |||||
protected $name; | |||||
/** client for itemCollection */ | |||||
protected $itemCollection; | |||||
/** | |||||
* | |||||
* | |||||
*/ | |||||
public function __construct() | |||||
{ | |||||
if (!$this->name) { | |||||
throw new \Exception('$name is not set!'); | |||||
}; | |||||
$this->itemCollection = new ItemCollection( | |||||
env('DIRECTUS_API_URL'), | |||||
env('DIRECTUS_API_TOKEN') | |||||
); | |||||
} | |||||
} |