SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

56
PhpStorm + Symfony SymfonyCon 2016 - Daniel Espendiller - @BigHaehnchen

Transcript of SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Page 1: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

PhpStorm + Symfony

SymfonyCon 2016 - Daniel Espendiller - @BigHaehnchen

Page 2: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Symfony Plugin

PHP Annotations

Shopware Plugin

Drupal Symfony Bridge

Laravel Plugin

OXID Plugin

PHP Toolbox

Plugins

Daniel Espendiller

E-Mail: [email protected]

Twitter: @BigHaehnchen

GitHub: //github.com/Haehnchen

Page 3: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Roadmap

● Problems / Statistics / Infrastructure– Key Facets, Statistics, Travis, JetBrains API

● Features– Symfony Installer, Service and Container, Form,

Events, Doctrine, Code Generator, Twig Doc, Twig Namespaces, Translations, Profiler, Remote Container, PHP-Toolbox

Page 4: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

First commits(2013/04)

Page 5: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Key Facets (since 2013/04)

● 7 Plugins● ~2,5 Mio Downloads● ~1.000 Issues● ~50.000 LOC (Java)● Time Investment: ~4h weekly● Single person project● MIT License● Framework like, feel free to copy

https://github.com/Haehnchen/idea-*

Page 6: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Symfony Plugin Update

Page 7: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Symfony Plugin / Contribution

Page 8: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Testing / Travis

Page 9: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

public class XmlDicCompletionContributorTest extends SymfonyLightCodeInsightFixtureTestCase { public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject("appDevDebugProjectContainer.xml");

myFixture.configureByText("classes.php", "<?php\n" + "namespace Foo\\Name;\n" + "class FooClass {" + " public function foo() " + "}" ); }

public void testServiceCompletion() { assertCompletionContains("service.xml", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<container>\n" + " <services>\n" + " <argument type=\"service\" id=\"<caret>\"/>\n" + " </services>\n" + "</container>" , "data_collector.router" ); }}

Testing / Travissry Java Code

Page 10: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

JetBrains APIPsiViewer Yaml File

Page 11: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

“There are to be some PSI structure changes; I see that your plugin use YAML extensively so something will definitely break. To be honest, I wanted to do some changes which may even break compilation, but I can leave some legacy code. However, one will need to fix the usage of PSI so I don't think it's a big problem.”

JetBrains API

Page 12: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
Page 13: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

“There is a patch to master which compiles but leads to about 60 tests failing. However, you can look through the changes to have an idea of what's happening.”

JetBrains API

Page 14: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

JetBrains APIYaml: [@service, "@service2", [""], ['']]

Page 15: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later
Page 16: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

JetBrains API / 2016.3

PhpStorm 2016.3 EAP 163.5644 / Initial PHPSpec support

Page 17: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Features

Symfony InstallerService and Container

FormEvents

DoctrineCode Generator

Twig DocTwig Namespaces

TranslationsProfiler

Remote ContainerPHP-Toolbox

Page 18: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Symfony InstallerFile → New Project → Symfony

Page 19: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Symfony InstallerFile → New Project → Symfony

Page 20: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Container

<?php

namespace espend\Container\ServiceBundle\Classes;

use Symfony\Component\Routing\RouterInterface;

class Bar extends \Twig_Extension{ public function __construct(RouterInterface $router) { } public function getName() { }}

Class Template

Page 21: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

ContainerService Generator

Page 22: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

ContainerService Generator

Page 23: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

ContainerJavascript: Service Id Strategy

Page 24: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

ContainerAutocompletion

Page 25: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

ContainerArgument Detection

Page 26: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

FormOption Completion and Navigation

Page 27: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

FormOption Completion and Navigation

Page 28: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Form

public function buildForm(FormBuilderInterface $builder, array $options){ $builder->add('test', 'birthday');

$builder->add('test', 'file'); $builder->add('test', 'file');}

public function buildForm(FormBuilderInterface $builder, array $options){ $builder->add('test', BirthdayType::class);

$builder->add('test', FileType::class);

$builder->add('test', FileType::class);}

Symfony 3.x Migration

Page 29: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

FormSymfony 3.x Migration: Generator / Inspection

Page 30: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Events

use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

public function onKernelController(FilterControllerEvent $event){}

Method Generation

Page 31: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Events

final class KernelEvents{ /** * @Event("Symfony\Component\HttpKernel\Event\FilterControllerEvent") */ const CONTROLLER = 'kernel.controller';}

* * This event allows you to change the controller that will handle the * request. The event listener method receives a * Symfony\Component\HttpKernel\Event\FilterControllerEvent instance. * * @var string * * @api */const CONTROLLER = 'kernel.controller';

Symfony Event Definition

Page 32: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Doctrinenamespace Bar;

class FooBar{ private $id;

private $createdAt;

private $isActive;}

namespace Bar;

use Doctrine\ORM\Mapping as ORM;

class FooBar{ /** * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * @ORM\Column(type="integer") */private $id;

/** * @ORM\Column(type="datetime") */ private $createdAt;

/** * @ORM\Column(type="boolean") */ private $isActive;}

Annotation Generator

Page 33: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

DoctrineMetadata - XML

Page 34: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

DoctrineMetadata - Annotation

Page 35: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

GeneratorFile - Template

Page 36: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Generator Method - Route

class DefaultController extends Controller{ public function fooAction() { }}

Page 37: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

GeneratorEvent Method

class YamlClass{ public function onFoobar(GetResponseForExceptionEvent $event) { }}

Page 38: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig Doc

{# @var cars \espend\[...]\Entity\Car #}

{# @var cars \espend\[...]\Entity\Car[] #}

{# @controller AcmeDemoBundle:Demo:hello #}

{# @see test.html #}

Page 39: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig Doc (var)

Page 40: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig Doc (var)

Page 41: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig Doc (controller)

public function indexAction(){ $this->render('index.html.twig'); $this->renderView('index.html.twig'); $this->renderResponse('index.html.twig');}

Page 42: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig Doc (controller)

public function indexAction(){ return ['foo_request' => new Request()]; return $this->render(null, ['foo_request_render' => new Request()]);}

Page 43: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig Doc (see)

{# @see foo/foo.html.twig #}{# @see @WebProfiler/Profiler/table.html.twig #}

{# @see ../root.html.twig #}{# @see ../root.json #}

{# @see espendRouterRoutesBundle:Default:index #}{# @see web_profiler.controller.profiler:searchBarAction #}

{# @see espend\Router\RoutesBundle\Controller\DefaultController #}{# @see [...]\DefaultController::indexAction #}

Twig Templates

Filesystem

Classes

Routes

Page 44: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig NamespaceFile → Settings → … → Symfony → Twig / Templates

Page 45: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Twig NamespaceFile → Settings → … → Symfony → Twig / Templates

# ide-twig.json{ "namespaces": [ { "namespace": "foo", // @foo/foobar.html.twig "path": "res" }, { "path": "res" // foobar.html.twig }, { "path": "res", // FooBundle::foobar.html.twig "type": "Bundle", "namespace": "FooBundle" } ]}

Page 46: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

TranslationsExtraction

Page 47: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

TranslationsExtraction

Page 48: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

TranslationsXLIFF Support

Page 49: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

ProfilerLanguage & Frameworks → Symfony → Profiler

Page 50: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Remote ContainerappDevDebugProjectContainer.xml

Tools → Deplyoment → Configuration

Page 51: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Remote ContainerappDevDebugProjectContainer.xml

Page 52: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

PHP-Toolboxhttps://github.com/Haehnchen/idea-php-toolbox

Page 53: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

PHP-Toolbox// .ide-toolbox.metadata.json{ "registrar":[ {"language":"php", "provider":"MY_FOO", "signature": ["Foo:bar"]}, {"language":"twig", "provider":"MY_FOO", "signatures":[{"function": "foo"}]} ], "providers": [ { "name": "MY_FOO", "items":[ { "lookup_string": "POST", "icon": "com.jetbrains.php.PhpIcons.PROFILER_SNAPSHOT_FILE_TYPE" }, { "lookup_string": "GET" }, { "lookup_string": "DELETE", "type_text": "Sweet Stuff" } ] } ]}

Page 54: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

PHP-Toolbox

// .ide-toolbox.metadata.json{ "registrar":[ { "provider":"FOOBAR", "language":"php", "signatures":[{"class": "Foo", "method": "bar", "type": "type"}] } ], "providers": [ { "name": "FOOBAR", "items":[ { "lookup_string": "foobar", "type": "DateTime" } ] } ]}

Page 55: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

PHP-Toolbox

[GET] /[GET] /projects[GET] /projects/{project}[GET] /projects/{project}/clear[POST] /projects/{project}/{provider}[GET] /projects/{project}/json-debug

Languages & Frameworks -> PHP Toolbox

curl \-X POST http://127.0.0.1:48734/projects/idea-espend/php-toolbox-json \-d @test.json

{ "success": true, "content": "items added"}

Page 56: SymfonyCon Berlin 2016 - Symfony Plugin for PhpStorm - 3 years later

Questions

Feedback

...