From 93fd4692f6eb753cae16358131c8049d84cfbb41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Thu, 22 Jan 2015 08:30:07 +0100 Subject: symfony is there --- src/Acme/DemoBundle/AcmeDemoBundle.php | 9 ++ src/Acme/DemoBundle/Command/HelloWorldCommand.php | 48 ++++++++++ src/Acme/DemoBundle/Controller/DemoController.php | 56 ++++++++++++ .../DemoBundle/Controller/SecuredController.php | 70 ++++++++++++++ .../DemoBundle/Controller/WelcomeController.php | 19 ++++ .../DependencyInjection/AcmeDemoExtension.php | 22 +++++ .../EventListener/ControllerListener.php | 24 +++++ src/Acme/DemoBundle/Form/ContactType.php | 20 ++++ src/Acme/DemoBundle/Resources/config/routing.yml | 12 +++ src/Acme/DemoBundle/Resources/config/services.xml | 18 ++++ src/Acme/DemoBundle/Resources/public/css/demo.css | 101 +++++++++++++++++++++ .../Resources/public/images/blue-arrow.png | Bin 0 -> 181 bytes .../Resources/public/images/field-background.gif | Bin 0 -> 63 bytes .../DemoBundle/Resources/public/images/logo.gif | Bin 0 -> 1698 bytes .../DemoBundle/Resources/public/images/search.png | Bin 0 -> 737 bytes .../Resources/public/images/welcome-configure.gif | Bin 0 -> 3530 bytes .../Resources/public/images/welcome-demo.gif | Bin 0 -> 4053 bytes .../Resources/public/images/welcome-quick-tour.gif | Bin 0 -> 4770 bytes .../Resources/views/Demo/contact.html.twig | 15 +++ .../Resources/views/Demo/hello.html.twig | 9 ++ .../Resources/views/Demo/index.html.twig | 14 +++ .../Resources/views/Secured/hello.html.twig | 11 +++ .../Resources/views/Secured/helloadmin.html.twig | 9 ++ .../Resources/views/Secured/layout.html.twig | 6 ++ .../Resources/views/Secured/login.html.twig | 35 +++++++ .../Resources/views/Welcome/index.html.twig | 83 +++++++++++++++++ .../DemoBundle/Resources/views/layout.html.twig | 37 ++++++++ .../Tests/Controller/DemoControllerTest.php | 45 +++++++++ .../DemoBundle/Twig/Extension/DemoExtension.php | 81 +++++++++++++++++ src/AppBundle/AppBundle.php | 9 ++ src/AppBundle/Controller/DefaultController.php | 17 ++++ .../Tests/Controller/DefaultControllerTest.php | 18 ++++ .../Controller/DefaultController.php | 17 ++++ .../Tests/Controller/DefaultControllerTest.php | 18 ++++ src/WallabagBundle/WallabagBundle.php | 9 ++ 35 files changed, 832 insertions(+) create mode 100644 src/Acme/DemoBundle/AcmeDemoBundle.php create mode 100644 src/Acme/DemoBundle/Command/HelloWorldCommand.php create mode 100644 src/Acme/DemoBundle/Controller/DemoController.php create mode 100644 src/Acme/DemoBundle/Controller/SecuredController.php create mode 100644 src/Acme/DemoBundle/Controller/WelcomeController.php create mode 100644 src/Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php create mode 100644 src/Acme/DemoBundle/EventListener/ControllerListener.php create mode 100644 src/Acme/DemoBundle/Form/ContactType.php create mode 100644 src/Acme/DemoBundle/Resources/config/routing.yml create mode 100644 src/Acme/DemoBundle/Resources/config/services.xml create mode 100644 src/Acme/DemoBundle/Resources/public/css/demo.css create mode 100644 src/Acme/DemoBundle/Resources/public/images/blue-arrow.png create mode 100644 src/Acme/DemoBundle/Resources/public/images/field-background.gif create mode 100644 src/Acme/DemoBundle/Resources/public/images/logo.gif create mode 100644 src/Acme/DemoBundle/Resources/public/images/search.png create mode 100644 src/Acme/DemoBundle/Resources/public/images/welcome-configure.gif create mode 100644 src/Acme/DemoBundle/Resources/public/images/welcome-demo.gif create mode 100644 src/Acme/DemoBundle/Resources/public/images/welcome-quick-tour.gif create mode 100644 src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/Demo/index.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/Secured/login.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig create mode 100644 src/Acme/DemoBundle/Resources/views/layout.html.twig create mode 100644 src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php create mode 100644 src/Acme/DemoBundle/Twig/Extension/DemoExtension.php create mode 100644 src/AppBundle/AppBundle.php create mode 100644 src/AppBundle/Controller/DefaultController.php create mode 100644 src/AppBundle/Tests/Controller/DefaultControllerTest.php create mode 100644 src/WallabagBundle/Controller/DefaultController.php create mode 100644 src/WallabagBundle/Tests/Controller/DefaultControllerTest.php create mode 100644 src/WallabagBundle/WallabagBundle.php (limited to 'src') diff --git a/src/Acme/DemoBundle/AcmeDemoBundle.php b/src/Acme/DemoBundle/AcmeDemoBundle.php new file mode 100644 index 00000000..269fc1e0 --- /dev/null +++ b/src/Acme/DemoBundle/AcmeDemoBundle.php @@ -0,0 +1,9 @@ +getContainer(). + * + * @author Tobias Schultze + */ +class HelloWorldCommand extends Command +{ + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->setName('acme:hello') + ->setDescription('Hello World example command') + ->addArgument('who', InputArgument::OPTIONAL, 'Who to greet.', 'World') + ->setHelp(<<%command.name% command greets somebody or everybody: + +php %command.full_name% + +The optional argument specifies who to greet: + +php %command.full_name% Fabien +EOF + ); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $output->writeln(sprintf('Hello %s!', $input->getArgument('who'))); + } +} diff --git a/src/Acme/DemoBundle/Controller/DemoController.php b/src/Acme/DemoBundle/Controller/DemoController.php new file mode 100644 index 00000000..a99de891 --- /dev/null +++ b/src/Acme/DemoBundle/Controller/DemoController.php @@ -0,0 +1,56 @@ + $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction(Request $request) + { + $form = $this->createForm(new ContactType()); + $form->handleRequest($request); + + if ($form->isValid()) { + $mailer = $this->get('mailer'); + + // .. setup a message and send it + // http://symfony.com/doc/current/cookbook/email.html + + $request->getSession()->getFlashBag()->set('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + + return array('form' => $form->createView()); + } +} diff --git a/src/Acme/DemoBundle/Controller/SecuredController.php b/src/Acme/DemoBundle/Controller/SecuredController.php new file mode 100644 index 00000000..d1499e39 --- /dev/null +++ b/src/Acme/DemoBundle/Controller/SecuredController.php @@ -0,0 +1,70 @@ +attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { + $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR); + } else { + $error = $request->getSession()->get(SecurityContext::AUTHENTICATION_ERROR); + } + + return array( + 'last_username' => $request->getSession()->get(SecurityContext::LAST_USERNAME), + 'error' => $error, + ); + } + + /** + * @Route("/login_check", name="_demo_security_check") + */ + public function securityCheckAction() + { + // The security layer will intercept this request + } + + /** + * @Route("/logout", name="_demo_logout") + */ + public function logoutAction() + { + // The security layer will intercept this request + } + + /** + * @Route("/hello", defaults={"name"="World"}), + * @Route("/hello/{name}", name="_demo_secured_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/hello/admin/{name}", name="_demo_secured_hello_admin") + * @Security("is_granted('ROLE_ADMIN')") + * @Template() + */ + public function helloadminAction($name) + { + return array('name' => $name); + } +} diff --git a/src/Acme/DemoBundle/Controller/WelcomeController.php b/src/Acme/DemoBundle/Controller/WelcomeController.php new file mode 100644 index 00000000..884f95bb --- /dev/null +++ b/src/Acme/DemoBundle/Controller/WelcomeController.php @@ -0,0 +1,19 @@ +render('AcmeDemoBundle:Welcome:index.html.twig'); + } +} diff --git a/src/Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php b/src/Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php new file mode 100644 index 00000000..6dfcc822 --- /dev/null +++ b/src/Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php @@ -0,0 +1,22 @@ +load('services.xml'); + } + + public function getAlias() + { + return 'acme_demo'; + } +} diff --git a/src/Acme/DemoBundle/EventListener/ControllerListener.php b/src/Acme/DemoBundle/EventListener/ControllerListener.php new file mode 100644 index 00000000..aa117d74 --- /dev/null +++ b/src/Acme/DemoBundle/EventListener/ControllerListener.php @@ -0,0 +1,24 @@ +extension = $extension; + } + + public function onKernelController(FilterControllerEvent $event) + { + if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) { + $this->extension->setController($event->getController()); + } + } +} diff --git a/src/Acme/DemoBundle/Form/ContactType.php b/src/Acme/DemoBundle/Form/ContactType.php new file mode 100644 index 00000000..2c76cdb2 --- /dev/null +++ b/src/Acme/DemoBundle/Form/ContactType.php @@ -0,0 +1,20 @@ +add('email', 'email'); + $builder->add('message', 'textarea'); + } + + public function getName() + { + return 'contact'; + } +} diff --git a/src/Acme/DemoBundle/Resources/config/routing.yml b/src/Acme/DemoBundle/Resources/config/routing.yml new file mode 100644 index 00000000..06291a23 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/config/routing.yml @@ -0,0 +1,12 @@ +_welcome: + path: / + defaults: { _controller: AcmeDemoBundle:Welcome:index } + +_demo_secured: + resource: "@AcmeDemoBundle/Controller/SecuredController.php" + type: annotation + +_demo: + resource: "@AcmeDemoBundle/Controller/DemoController.php" + type: annotation + prefix: /demo diff --git a/src/Acme/DemoBundle/Resources/config/services.xml b/src/Acme/DemoBundle/Resources/config/services.xml new file mode 100644 index 00000000..d6274ce9 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/config/services.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/src/Acme/DemoBundle/Resources/public/css/demo.css b/src/Acme/DemoBundle/Resources/public/css/demo.css new file mode 100644 index 00000000..4dd2f16c --- /dev/null +++ b/src/Acme/DemoBundle/Resources/public/css/demo.css @@ -0,0 +1,101 @@ +body { + font-size: 14px; + font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; +} +h1.title { + font-size: 45px; + padding-bottom: 30px; +} +.sf-reset h2 { + font-weight: bold; + color: #FFFFFF; + /* Font is duplicated of body (sans-serif) */ + font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; + + margin-bottom: 10px; + background-color: #aacd4e; + padding: 2px 4px; + display: inline-block; + text-transform: uppercase; + +} +p { + line-height: 20px; + padding-bottom: 20px; +} +ul#demo-list a { + background: url(../images/blue-arrow.png) no-repeat right 6px; + padding-right: 10px; + margin-right: 30px; +} +#symfony-header { + position: relative; + padding: 30px 30px 20px 30px; +} +.sf-reset .symfony-blocks-welcome { + overflow: hidden; +} +.sf-reset .symfony-blocks-welcome > div { + background-color: whitesmoke; + float: left; + width: 240px; + margin-right: 14px; + text-align: center; + padding: 26px 20px; +} +.sf-reset .symfony-blocks-welcome > div.block-demo { + margin-right: 0; +} +.sf-reset .symfony-blocks-welcome .illustration { + padding-bottom: 20px; +} +.sf-reset .symfony-blocks-help { + overflow: hidden; +} +.sf-reset .symfony-blocks-help { + margin-top: 30px; + padding: 18px; + border: 1px solid #E6E6E6; +} +.sf-reset .symfony-blocks-help > div { + width: 254px; + float: left; +} +.flash-message { + padding: 10px; + margin: 5px; + margin-top: 15px; + background-color: #ffe; +} +.sf-reset .error { + color: red; +} +#login label, #contact_form label { + display: block; + float: left; + width: 90px; +} +.sf-reset ul#menu { + float: right; + margin-bottom: 20px; + padding-left: 0; +} +.sf-reset #menu li { + padding-left: 0; + margin-right: 10px; + display: inline; +} +.sf-reset a, +.sf-reset li a { + color: #08C; + text-decoration: none; +} +.sf-reset a:hover, +.sf-reset li a:hover { + color: #08C; + text-decoration: underline; +} +.sf-reset .symfony-content pre { + white-space: pre; + font-family: monospace; +} diff --git a/src/Acme/DemoBundle/Resources/public/images/blue-arrow.png b/src/Acme/DemoBundle/Resources/public/images/blue-arrow.png new file mode 100644 index 00000000..fa82d4b4 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/blue-arrow.png differ diff --git a/src/Acme/DemoBundle/Resources/public/images/field-background.gif b/src/Acme/DemoBundle/Resources/public/images/field-background.gif new file mode 100644 index 00000000..7c0efc10 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/field-background.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/logo.gif b/src/Acme/DemoBundle/Resources/public/images/logo.gif new file mode 100644 index 00000000..703cf45f Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/logo.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/search.png b/src/Acme/DemoBundle/Resources/public/images/search.png new file mode 100644 index 00000000..3c88b6a4 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/search.png differ diff --git a/src/Acme/DemoBundle/Resources/public/images/welcome-configure.gif b/src/Acme/DemoBundle/Resources/public/images/welcome-configure.gif new file mode 100644 index 00000000..931179a7 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/welcome-configure.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/welcome-demo.gif b/src/Acme/DemoBundle/Resources/public/images/welcome-demo.gif new file mode 100644 index 00000000..0623de54 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/welcome-demo.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/welcome-quick-tour.gif b/src/Acme/DemoBundle/Resources/public/images/welcome-quick-tour.gif new file mode 100644 index 00000000..b9018b11 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/welcome-quick-tour.gif differ diff --git a/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig b/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig new file mode 100644 index 00000000..e5b7523b --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig @@ -0,0 +1,15 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block title "Symfony - Contact form" %} + +{% block content %} +
+ {{ form_errors(form) }} + + {{ form_row(form.email) }} + {{ form_row(form.message) }} + + {{ form_rest(form) }} + +
+{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig b/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig new file mode 100644 index 00000000..3997ff60 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig @@ -0,0 +1,9 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block title "Hello " ~ name %} + +{% block content %} +

Hello {{ name }}!

+{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig b/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig new file mode 100644 index 00000000..454a3203 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig @@ -0,0 +1,14 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block title "Symfony - Demos" %} + +{% block content_header '' %} + +{% block content %} +

Available demos

+ +{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig new file mode 100644 index 00000000..faf95cf8 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig @@ -0,0 +1,11 @@ +{% extends "AcmeDemoBundle:Secured:layout.html.twig" %} + +{% block title "Hello " ~ name %} + +{% block content %} +

Hello {{ name }}!

+ + Hello resource secured for admin only. +{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig new file mode 100644 index 00000000..4e3649f7 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig @@ -0,0 +1,9 @@ +{% extends "AcmeDemoBundle:Secured:layout.html.twig" %} + +{% block title "Hello " ~ name %} + +{% block content %} +

Hello {{ name }} secured for Admins only!

+{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig new file mode 100644 index 00000000..aeea55c5 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig @@ -0,0 +1,6 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block content_header_more %} + {{ parent() }} +
  • logged in as {{ app.user ? app.user.username : 'Anonymous' }} - Logout
  • +{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig new file mode 100644 index 00000000..3e76d1df --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig @@ -0,0 +1,35 @@ +{% extends 'AcmeDemoBundle::layout.html.twig' %} + +{% block content %} +

    Login

    + +

    + Choose between two default users: user/userpass (ROLE_USER) or admin/adminpass (ROLE_ADMIN) +

    + + {% if error %} +
    {{ error.message }}
    + {% endif %} + +
    +
    + + +
    + +
    + + +
    + + +
    +{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig b/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig new file mode 100644 index 00000000..ea3a7299 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig @@ -0,0 +1,83 @@ +{% extends 'AcmeDemoBundle::layout.html.twig' %} + +{% block title %}Symfony - Welcome{% endblock %} + +{% block content_header '' %} + +{% block content %} + {% set version = constant('Symfony\\Component\\HttpKernel\\Kernel::MAJOR_VERSION') ~ '.' ~ constant('Symfony\\Component\\HttpKernel\\Kernel::MINOR_VERSION')%} + +

    Welcome!

    + +

    Congratulations! You have successfully installed a new Symfony application.

    + +
    + + {% if app.environment == 'dev' %} + + {% endif %} + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/layout.html.twig b/src/Acme/DemoBundle/Resources/views/layout.html.twig new file mode 100644 index 00000000..d7e97d56 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/layout.html.twig @@ -0,0 +1,37 @@ +{% extends "TwigBundle::layout.html.twig" %} + +{% block head %} + + +{% endblock %} + +{% block title 'Demo Bundle' %} + +{% block body %} + {% for flashMessage in app.session.flashbag.get('notice') %} +
    + Notice: {{ flashMessage }} +
    + {% endfor %} + + {% block content_header %} + + +
    + {% endblock %} + +
    + {% block content %}{% endblock %} +
    + + {% if code is defined %} +

    Code behind this page

    +
    +
    {{ code|raw }}
    +
    + {% endif %} +{% endblock %} diff --git a/src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php b/src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php new file mode 100644 index 00000000..d2176897 --- /dev/null +++ b/src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php @@ -0,0 +1,45 @@ +request('GET', '/demo/hello/Fabien'); + + $this->assertGreaterThan(0, $crawler->filter('html:contains("Hello Fabien")')->count()); + } + + public function testSecureSection() + { + $client = static::createClient(); + + // goes to the secure page + $crawler = $client->request('GET', '/demo/secured/hello/World'); + + // redirects to the login page + $crawler = $client->followRedirect(); + + // submits the login form + $form = $crawler->selectButton('Login')->form(array('_username' => 'admin', '_password' => 'adminpass')); + $client->submit($form); + + // redirect to the original page (but now authenticated) + $crawler = $client->followRedirect(); + + // check that the page is the right one + $this->assertCount(1, $crawler->filter('h1.title:contains("Hello World!")')); + + // click on the secure link + $link = $crawler->selectLink('Hello resource secured')->link(); + $crawler = $client->click($link); + + // check that the page is the right one + $this->assertCount(1, $crawler->filter('h1.title:contains("secured for Admins only!")')); + } +} diff --git a/src/Acme/DemoBundle/Twig/Extension/DemoExtension.php b/src/Acme/DemoBundle/Twig/Extension/DemoExtension.php new file mode 100644 index 00000000..e6ce94f6 --- /dev/null +++ b/src/Acme/DemoBundle/Twig/Extension/DemoExtension.php @@ -0,0 +1,81 @@ +loader = $loader; + } + + public function setController($controller) + { + $this->controller = $controller; + } + + /** + * {@inheritdoc} + */ + public function getFunctions() + { + return array( + new \Twig_SimpleFunction('code', array($this, 'getCode'), array('is_safe' => array('html'))), + ); + } + + public function getCode($template) + { + // highlight_string highlights php code only if 'getControllerCode(), true); + $controller = str_replace('<?php    ', '    ', $controller); + + $template = htmlspecialchars($this->getTemplateCode($template), ENT_QUOTES, 'UTF-8'); + + // remove the code block + $template = str_replace('{% set code = code(_self) %}', '', $template); + + return <<Controller Code

    +
    $controller
    + +

    Template Code

    +
    $template
    +EOF; + } + + protected function getControllerCode() + { + $class = get_class($this->controller[0]); + if (class_exists('CG\Core\ClassUtils')) { + $class = ClassUtils::getUserClass($class); + } + + $r = new \ReflectionClass($class); + $m = $r->getMethod($this->controller[1]); + + $code = file($r->getFilename()); + + return ' '.$m->getDocComment()."\n".implode('', array_slice($code, $m->getStartline() - 1, $m->getEndLine() - $m->getStartline() + 1)); + } + + protected function getTemplateCode($template) + { + return $this->loader->getSource($template->getTemplateName()); + } + + /** + * Returns the name of the extension. + * + * @return string The extension name + */ + public function getName() + { + return 'demo'; + } +} diff --git a/src/AppBundle/AppBundle.php b/src/AppBundle/AppBundle.php new file mode 100644 index 00000000..05123b67 --- /dev/null +++ b/src/AppBundle/AppBundle.php @@ -0,0 +1,9 @@ +render('default/index.html.twig'); + } +} diff --git a/src/AppBundle/Tests/Controller/DefaultControllerTest.php b/src/AppBundle/Tests/Controller/DefaultControllerTest.php new file mode 100644 index 00000000..f35af752 --- /dev/null +++ b/src/AppBundle/Tests/Controller/DefaultControllerTest.php @@ -0,0 +1,18 @@ +request('GET', '/app/example'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + $this->assertTrue($crawler->filter('html:contains("Homepage")')->count() > 0); + } +} diff --git a/src/WallabagBundle/Controller/DefaultController.php b/src/WallabagBundle/Controller/DefaultController.php new file mode 100644 index 00000000..1030b7a6 --- /dev/null +++ b/src/WallabagBundle/Controller/DefaultController.php @@ -0,0 +1,17 @@ +render('default/index.html.twig'); + } +} diff --git a/src/WallabagBundle/Tests/Controller/DefaultControllerTest.php b/src/WallabagBundle/Tests/Controller/DefaultControllerTest.php new file mode 100644 index 00000000..e9022438 --- /dev/null +++ b/src/WallabagBundle/Tests/Controller/DefaultControllerTest.php @@ -0,0 +1,18 @@ +request('GET', '/app/index'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + $this->assertTrue($crawler->filter('html:contains("Homepage")')->count() > 0); + } +} diff --git a/src/WallabagBundle/WallabagBundle.php b/src/WallabagBundle/WallabagBundle.php new file mode 100644 index 00000000..ddfb13f9 --- /dev/null +++ b/src/WallabagBundle/WallabagBundle.php @@ -0,0 +1,9 @@ +