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