commit
9a5b30c4e3
@ -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')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue