From 59b2b98537612b4fc6bb8531f16946dd9099fe0e Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Mon, 6 Jul 2020 20:51:08 +0000 Subject: [PATCH] [CONTROLLER] Add Controller base class, which handles rendering templates if requested HTML or json, accordingly --- src/Controller/AdminConfigController.php | 17 +++--- src/Controller/NetworkPublic.php | 13 +++-- src/Controller/UserAdminPanel.php | 20 +++---- src/Core/Controller.php | 67 ++++++++++++++++++++++++ src/Core/Event.php | 4 +- 5 files changed, 95 insertions(+), 26 deletions(-) create mode 100644 src/Core/Controller.php diff --git a/src/Controller/AdminConfigController.php b/src/Controller/AdminConfigController.php index 11c652340a..e1c59d0459 100644 --- a/src/Controller/AdminConfigController.php +++ b/src/Controller/AdminConfigController.php @@ -30,21 +30,19 @@ namespace App\Controller; -// use App\Core\Event; -// use App\Util\Common; +use App\Core\Controller; use App\Core\DB\DB; use App\Core\DB\DefaultSettings; use App\Core\Form; use function App\Core\I18n\_m; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\HttpFoundation\Request; -class AdminConfigController extends AbstractController +class AdminConfigController extends Controller { - public function __invoke(Request $request) + public function handle(Request $request) { $defaults = DefaultSettings::$defaults; $options = []; @@ -78,12 +76,13 @@ class AdminConfigController extends AbstractController 'default' => $default, ]); } else { - // Display error + // TODO Display error } } - return $this->render('config/admin.html.twig', [ - 'form' => $form->createView(), - ]); + return [ + '_template' => 'config/admin.html.twig', + 'form' => $form->createView(), + ]; } } diff --git a/src/Controller/NetworkPublic.php b/src/Controller/NetworkPublic.php index 0f26ca15b8..5cfc568196 100644 --- a/src/Controller/NetworkPublic.php +++ b/src/Controller/NetworkPublic.php @@ -30,18 +30,23 @@ namespace App\Controller; +use App\Core\Controller; use App\Core\Event; use App\Util\Common; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -class NetworkPublic extends AbstractController +class NetworkPublic extends Controller { - public function __invoke() + public function onPost() + { + return ['_template' => 'network/public.html.twig']; + } + + public function handle() { Event::handle('Test', ['foobar']); Common::config('url', 'shortener'); - return $this->render('network/public.html.twig', []); + return ['_template' => 'network/public.html.twig']; } } diff --git a/src/Controller/UserAdminPanel.php b/src/Controller/UserAdminPanel.php index a50cc03b08..918935a6cb 100644 --- a/src/Controller/UserAdminPanel.php +++ b/src/Controller/UserAdminPanel.php @@ -31,31 +31,31 @@ namespace App\Controller; -// use App\Core\Event; -// use App\Util\Common; +use App\Core\Controller; use App\Core\Form; use function App\Core\I18n\_m; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\HttpFoundation\Request; -class UserAdminPanel extends AbstractController +class UserAdminPanel extends Controller { - public function __invoke(Request $request) + public function handle(Request $request) { $prof = Form::create([ [_m('Nickname'), TextType::class], [_m('FullName'), TextType::class], [_m('Homepage'), TextType::class], - [_m('Bio'), TextType::class], + [_m('Bio'), TextType::class], [_m('Location'), TextType::class], - ['save', SubmitType::class, ['label' => _m('Save')]], ]); + ['save', SubmitType::class, ['label' => _m('Save')]], + ]); $prof->handleRequest($request); - return $this->render('settings/profile.html.twig', [ - 'prof' => $prof->createView(), - ]); + return [ + '_template' => 'settings/profile.html.twig', + 'prof' => $prof->createView(), + ]; } } diff --git a/src/Core/Controller.php b/src/Core/Controller.php new file mode 100644 index 0000000000..a8885895d1 --- /dev/null +++ b/src/Core/Controller.php @@ -0,0 +1,67 @@ +. + +// }}} + +/** + * Base class for controllers + * + * @package GNUsocial + * @category Controller + * + * @author Hugo Sales + * @copyright 2020 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ + +namespace App\Core; + +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Request; + +class Controller extends AbstractController +{ + public function __invoke(Request $request) + { + $class = get_called_class(); + $method = 'on' . ucfirst(strtolower($request->getMethod())); + $vars = ['request' => $request]; + Event::handle('StartTwigPopulateVars', [&$vars]); + if (method_exists($class, $method)) { + $vars = array_merge_recursive($vars, $class::$method($request, $vars)); + } else { + $vars = array_merge_recursive($vars, $class::handle($request, $vars)); + } + Event::handle('EndTwigPopulateVars', [&$vars]); + $template = $vars['_template']; + unset($vars['_template'], $vars['request']); + + // Respond in the the most preffered acceptable content type + $format = $request->getFormat($request->getAcceptableContentTypes()[0]); + switch ($format) { + case 'html': + return $this->render($template, $vars); + case 'json': + return new JsonResponse($vars); + default: + throw new BadRequestHttpException('Unsupported format', null, 406); + } + } +} diff --git a/src/Core/Event.php b/src/Core/Event.php index f3ea511657..1c6fba2d2f 100644 --- a/src/Core/Event.php +++ b/src/Core/Event.php @@ -118,9 +118,7 @@ abstract class Event */ public static function handle(string $name, array $args = [], string $ns = 'GNUsocial/'): bool { - return !(self::$dispatcher->dispatch( - new GenericEvent($ns . $name, $args), - $name)->isPropagationStopped()); + return !(self::$dispatcher->dispatch(new GenericEvent($ns . $name, $args), $name)->isPropagationStopped()); } /**