Version 5.1 - All the GraphQL #32
@ -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',
|
||||
|
@ -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;
|
||||
|
@ -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') .
|
||||
|
@ -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,
|
||||
|
@ -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('/');
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
namespace Aviat\Ion\View;
|
||||
|
||||
use Aviat\Ion\View\HttpView;
|
||||
use Aviat\Ion\Di\ContainerInterface;
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user