Version 5.1 - All the GraphQL #32

Closed
timw4mail wants to merge 1160 commits from develop into master
10 changed files with 74 additions and 57 deletions
Showing only changes of commit dbaadc4c2a - Show all commits

View File

@ -43,17 +43,17 @@ return [
// ---------------------------------------------------------------------
// Anime List Routes
// ---------------------------------------------------------------------
'anime_add_form' => [
'anime.add.get' => [
'path' => '/anime/add',
'action' => 'add_form',
'verb' => 'get'
],
'anime_add' => [
'anime.add.post' => [
'path' => '/anime/add',
'action' => 'add',
'verb' => 'post'
],
'anime_detail' => [
'anime.details' => [
'path' => '/anime/details/{id}',
'action' => 'details',
'tokens' => [
@ -63,16 +63,16 @@ return [
// ---------------------------------------------------------------------
// Manga Routes
// ---------------------------------------------------------------------
'manga_search' => [
'manga.search' => [
'path' => '/manga/search',
'action' => 'search',
],
'manga_add_form' => [
'manga.add.get' => [
'path' => '/manga/add',
'action' => 'add_form',
'verb' => 'get'
],
'manga_add' => [
'manga.add.post' => [
'path' => '/manga/add',
'action' => 'add',
'verb' => 'post'
@ -80,33 +80,33 @@ return [
// ---------------------------------------------------------------------
// Anime Collection Routes
// ---------------------------------------------------------------------
'collection_search' => [
'collection.search' => [
'path' => '/collection/search',
'action' => 'search'
],
'collection_add_form' => [
'collection.add.get' => [
'path' => '/collection/add',
'action' => 'form',
'params' => [],
],
'collection_edit_form' => [
'collection.edit.get' => [
'path' => '/collection/edit/{id}',
'action' => 'form',
'tokens' => [
'id' => '[0-9]+'
]
],
'collection_add' => [
'collection.add.post' => [
'path' => '/collection/add',
'action' => 'add',
'verb' => 'post'
],
'collection_edit' => [
'collection.edit.post' => [
'path' => '/collection/edit',
'action' => 'edit',
'verb' => 'post'
],
'collection' => [
'collection.view' => [
'path' => '/collection/view{/view}',
'action' => 'index',
'params' => [],
@ -117,19 +117,22 @@ return [
// ---------------------------------------------------------------------
// Default / Shared routes
// ---------------------------------------------------------------------
'login_form' => [
'path' => '/{controller}/login',
'login' => [
'path' => '/login',
'action' => 'login',
'controller' => AnimeClient::DEFAULT_CONTROLLER_NAMESPACE,
'verb' => 'get'
],
'login_post' => [
'path' => '/{controller}/login',
'login.post' => [
'path' => '/login',
'action' => 'login_action',
'controller' => AnimeClient::DEFAULT_CONTROLLER_NAMESPACE,
'verb' => 'post'
],
'logout' => [
'path' => '/{controller}/logout',
'action' => 'logout'
'path' => '/logout',
'action' => 'logout',
'controller' => AnimeClient::DEFAULT_CONTROLLER_NAMESPACE,
],
'update' => [
'path' => '/{controller}/update',
@ -139,7 +142,7 @@ return [
'controller' => '[a-z_]+'
]
],
'update_form' => [
'update.post' => [
'path' => '/{controller}/update_form',
'action' => 'form_update',
'verb' => 'post',

View File

@ -16,7 +16,6 @@ use Aviat\Ion\Di\ContainerInterface;
use Aviat\Ion\View\HttpView;
use Aviat\Ion\View\HtmlView;
use Aviat\Ion\View\JsonView;
use Aviat\AnimeClient\AnimeClient;
/**
* Controller base, defines output methods
@ -82,10 +81,12 @@ class Controller {
public function __construct(ContainerInterface $container)
{
$this->setContainer($container);
$auraUrlGenerator = $container->get('aura-router')->getGenerator();
$urlGenerator = $container->get('url-generator');
$this->config = $container->get('config');
$this->request = $container->get('request');
$this->response = $container->get('response');
$this->base_data['url'] = $auraUrlGenerator;
$this->base_data['urlGenerator'] = $urlGenerator;
$this->base_data['auth'] = $container->get('auth');
$this->base_data['config'] = $this->config;

View File

@ -186,7 +186,7 @@ class Anime extends BaseController {
->titleize();
}
$this->set_session_redirect($this->request->server->get('HTTP_REFERRER'));
$this->set_session_redirect();
$this->outputHTML('anime/edit', [
'title' => $this->config->get('whose_list') .

View File

@ -16,8 +16,10 @@ use Aura\Web\Request;
use Aura\Web\Response;
use Aviat\Ion\Di\ContainerInterface;
use Aviat\Ion\Friend;
use Aviat\AnimeClient\AnimeClient;
/**
* Basic routing/ dispatch
*/
@ -113,7 +115,7 @@ class Dispatcher extends RoutingBase {
if ($route)
{
$parsed = $this->process_route($route);
$parsed = $this->process_route(new Friend($route));
$controller_name = $parsed['controller_name'];
$action_method = $parsed['action_method'];
$params = $parsed['params'];
@ -161,20 +163,20 @@ class Dispatcher extends RoutingBase {
? $route->attributes['action']
: AnimeClient::NOT_FOUND_METHOD;
$params = (array_key_exists('params', $route->attributes))
? $route->attributes['params']
: [];
if ( ! empty($route->tokens))
$params = [];
if ( ! empty($route->__get('tokens')))
{
foreach ($route->tokens as $key => $v)
$tokens = array_keys($route->__get('tokens'));
foreach ($tokens as $param)
{
if (array_key_exists($key, $route->attributes))
if (array_key_exists($param, $route->attributes))
{
$params[$key] = $route->attributes[$key];
$params[$param] = $route->attributes[$param];
}
}
}
$logger = $this->container->getLogger('default');
$logger->info(json_encode($params));
return [
'controller_name' => $controller_name,

View File

@ -85,6 +85,7 @@ class RoutingBase {
$request = $this->container->get('request');
$path = $request->getUri()->getPath();
$cleaned_path = $this->string($path)
->replace('%20', '')
->trim()
->trimRight('/')
->ensureLeft('/');

View File

@ -21,14 +21,21 @@ use Aviat\Ion\Type\StringType;
abstract class View {
use Di\ContainerAware;
use \Aviat\Ion\StringWrapper;
use StringWrapper;
/**
* HTTP response Object
*
* @var Zend\Diactoros\Response
*/
protected $response;
public $response;
/**
* Redirect response object
*
* @var Zend\Diactoros\RedirectResponse
*/
protected $redirectResponse;
/**
* Response mime type
@ -61,6 +68,7 @@ abstract class View {
{
$this->setContainer($container);
$this->response = $container->get('response');
$this->redirectResponse = NULL;
}
/**
@ -106,9 +114,7 @@ abstract class View {
*/
public function appendOutput($string)
{
$this->response->getBody()->write($string);
return $this;
return $this->setOutput($string);
}
/**

View File

@ -12,7 +12,6 @@
namespace Aviat\Ion\View;
use Aviat\Ion\View\HttpView;
use Aviat\Ion\Di\ContainerInterface;
/**

View File

@ -31,11 +31,17 @@ class HttpView extends BaseView {
public function redirect($url, $code)
{
ob_start();
$response = new Response();
$message = $response->getReasonPhrase($code);
$message = $this->response->getReasonPhrase($code);
$this->setStatusCode($code);
$this->response->withHeader('Location', $url);
header("HTTP/1.1 ${code} ${message}");
header("Location: {$url}");
// @codeCoverageIgnore start
if (PHP_SAPI !== 'cli')
{
header("HTTP/1.1 ${code} ${message}");
header("Location: {$url}");
}
// @codeCoverageIgnore end
$this->hasRendered = TRUE;
ob_end_clean();

View File

@ -4,6 +4,9 @@ use Aviat\Ion\Friend;
class HttpViewTest extends AnimeClient_TestCase {
protected $view;
protected $friend;
public function setUp()
{
parent::setUp();
@ -13,15 +16,16 @@ class HttpViewTest extends AnimeClient_TestCase {
public function testRedirect()
{
$this->markTestSkipped();
$this->friend->redirect('/foo', 303);
$this->assertEquals('/foo', $this->friend->response->getHeader('Location'));
$this->assertEquals(['/foo'], $this->friend->response->getHeader('Location'));
$this->assertEquals(303, $this->friend->response->getStatusCode());
}
public function testGetOutput()
{
$this->friend->output = 'foo';
$this->assertEquals($this->friend->output, $this->friend->getOutput());
$this->friend->setOutput('foo');
$this->assertEquals('foo', $this->friend->getOutput());
$this->assertFalse($this->friend->hasRendered);
$this->assertEquals($this->friend->getOutput(), $this->friend->__toString());
@ -42,18 +46,9 @@ class HttpViewTest extends AnimeClient_TestCase {
$this->assertEquals('<h1></h1>', $this->view->getOutput());
}
public function testOutput()
{
/*$this->friend->contentType = 'text/html';
$this->friend->__destruct();
$content =& $this->friend->response->content;
$this->assertEquals($content->getType(), $this->friend->contentType);
$this->assertEquals($content->getCharset(), 'utf-8');
$this->assertEquals($content->get(), $this->friend->getOutput());*/
}
public function testSetStatusCode()
{
$this->markTestSkipped();
$this->view->setStatusCode(404);
$this->assertEquals(404, $this->friend->response->getStatusCode());
}

View File

@ -14,7 +14,7 @@ class JsonViewTest extends HttpViewTest {
$this->friend = new Friend($this->view);
}
public function testSetOutput()
public function testSetOutputJSON()
{
// Extend view class to remove destructor which does output
$view = new TestJsonView($this->container);
@ -22,14 +22,18 @@ class JsonViewTest extends HttpViewTest {
// Json encode non-string
$content = ['foo' => 'bar'];
$expected = json_encode($content);
$this->view->setOutput($content);
$view->setOutput($content);
$this->assertEquals($expected, $this->view->getOutput());
}
public function testSetOutput()
{
// Directly set string
$view = new TestJsonView($this->container);
$content = '{}';
$expected = '{}';
$this->view->setOutput($content);
$this->assertEquals($expected, $this->view->getOutput());
$view->setOutput($content);
$this->assertEquals($expected, $view->getOutput());
}
public function testOutput()