Slide 1

Slide 1 text

PHPBB, MEET SYMFONY PHP[WORLD] 2016 @MICHAELCULLUMUK

Slide 2

Slide 2 text

ME?

Slide 3

Slide 3 text

MICHAEL CULLUM @MICHAELCULLUMUK

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

25 MILLION

Slide 7

Slide 7 text

PHPBB FORUMS

Slide 8

Slide 8 text

USES COMPONENTS 3.1 3.2 3.3 3.4

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

NEW WAY OF THINKING

Slide 14

Slide 14 text

GETTING OFF THE ISLAND

Slide 15

Slide 15 text

ROMANCE

Slide 16

Slide 16 text

AWWW

Slide 17

Slide 17 text

PHPBB 3.1 RELEASE

Slide 18

Slide 18 text

COMPONENTS

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

EVENT DISPATCHER

Slide 21

Slide 21 text

EVENT DISPATCHER

Slide 22

Slide 22 text

COMPOSER

Slide 23

Slide 23 text

COMPOSER

Slide 24

Slide 24 text

EVENTS

Slide 25

Slide 25 text

EVENT DISPATCHER dispatch($eventName, $event); return $event->get_data_filtered(array_keys($data)); } }

Slide 26

Slide 26 text

EVENT DISPATCHER dispatch($eventName, $event); return $event->get_data_filtered(array_keys($data)); } public function dispatch($eventName, Event $event = null) { if ($this->disabled) { return $event; } return parent::dispatch($eventName, $event); } }

Slide 27

Slide 27 text

EVENT DISPATCHER $vars = array('page_title', 'display_online_list', 'item_id', 'item', ‘page_header_override'); extract($phpbb_dispatcher->trigger_event('core.page_header', compact($vars)));

Slide 28

Slide 28 text

PHP VERSION

Slide 29

Slide 29 text

PHP VERSION

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

DEPENDENCY INJECTION CONTAINER

Slide 32

Slide 32 text

DEPENDENCY INJECTION $storage = new SessionStorage('SESSION_ID'); $user = new User($storage);

Slide 33

Slide 33 text

DEPENDENCY INJECTION function foo() { global $storage; } Warning: Ugly PHP 4 / phpBB 3.0 code!!!

Slide 34

Slide 34 text

DEPENDENCY INJECTION CONTAINER

Slide 35

Slide 35 text

DEPENDENCY INJECTION CONTAINER

Slide 36

Slide 36 text

DEPENDENCY INJECTION CONTAINER $phpbb_container_builder = new \phpbb\di\container_builder($phpbb_root_path, $phpEx); $phpbb_container = $phpbb_container_builder->with_config($phpbb_config_php_file)->get_container();

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

DEPENDENCY INJECTION CONTAINER protected function dump_container($container_filename) { $dumper = new PhpDumper($this->container); $cached_container_dump = $dumper->dump(array( 'class' => 'phpbb_cache_container', 'base_class' => 'Symfony\\Component\\DependencyInjection\\ContainerBuilder', )); file_put_contents($container_filename, $cached_container_dump); }

Slide 39

Slide 39 text

DEPENDENCY INJECTION CONTAINER $container_filename = $this->get_container_filename(); if (!defined('DEBUG_CONTAINER') && $this->dump_container && file_exists($container_filename)) { require($container_filename); $this->container = new \phpbb_cache_container(); } else { // ...

Slide 40

Slide 40 text

DEPENDENCY INJECTION CONTAINER protected function create_container(array $extensions) { $container = new ContainerBuilder(); foreach ($extensions as $extension) { $container->registerExtension($extension); $container->loadFromExtension($extension->getAlias()); } return $container; }

Slide 41

Slide 41 text

DEPENDENCY INJECTION CONTAINER /** * Loads a specific configuration. * * @param array $config An array of configuration values * @param ContainerBuilder $container A ContainerBuilder instance * * @throws \InvalidArgumentException When provided tag is not defined in this extension */ public function load(array $config, ContainerBuilder $container) { $loader = new YamlFileLoader($container, new FileLocator(phpbb_realpath($this->config_path))); $loader->load('services.yml'); }

Slide 42

Slide 42 text

COMPILER PASSES if ($this->use_custom_pass) { // Symfony Kernel Listeners $this->container->addCompilerPass(new \phpbb\di\pass\collection_pass()); $this->container->addCompilerPass( new RegisterListenersPass('dispatcher', 'event.listener_listener', ‘event.listener')); if ($this->use_kernel_pass) { $this->container->addCompilerPass(new RegisterListenersPass('dispatcher')); } }

Slide 43

Slide 43 text

COMPILER PASSES public function process(ContainerBuilder $container) { foreach ($container->findTaggedServiceIds('service_collection') as $id => $data) { $definition = $container->getDefinition($id); foreach ($container->findTaggedServiceIds($data[0]['tag']) as $service_id => $service_data) { $definition->addMethodCall('add', array($service_id)); } } }

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

HTTP *

Slide 46

Slide 46 text

FRONT CONTROLLER session_begin(); $auth->acl($user->data); $user->setup('app');

Slide 47

Slide 47 text

FRONT CONTROLLER $http_kernel = $phpbb_container->get('http_kernel'); $symfony_request = $phpbb_container->get('symfony_request'); $response = $http_kernel->handle($symfony_request); $response->send(); $http_kernel->terminate($symfony_request, $response);

Slide 48

Slide 48 text

HTTP * get_super_global(\phpbb\request\request_interface::GET); $post_parameters = $phpbb_request->get_super_global(\phpbb\request\request_interface::POST); $server_parameters = $phpbb_request->get_super_global(\phpbb\request\request_interface::SERVER); $files_parameters = $phpbb_request->get_super_global(\phpbb\request\request_interface::FILES); $cookie_parameters = $phpbb_request->get_super_global(\phpbb\request\request_interface::COOKIE); parent::__construct($get_parameters, $post_parameters, array(), $cookie_parameters, $files_parameters, $server_parameters); } }

Slide 49

Slide 49 text

HTTP * routes = new RouteCollection; foreach ($this->routing_files as $file_path) { $loader = new YamlFileLoader(new FileLocator(phpbb_realpath($base_path))); $this->routes->addCollection($loader->load($file_path)); } return $this; }

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

CONSOLE

Slide 52

Slide 52 text

CONSOLE register(); $phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx); $phpbb_class_loader_ext->register(); $phpbb_container = phpbb_create_update_container($phpbb_root_path, $phpEx, "$phpbb_root_path/config"); $application = new \phpbb\console\application('phpBB Console', PHPBB_VERSION); $application->register_container_commands($phpbb_container); $application->run();

Slide 53

Slide 53 text

CONSOLE hasParameterOption(array('--safe-mode'))) { $phpbb_container_builder->set_use_extensions(false); $phpbb_container_builder->set_dump_container(false); } // ... $user = $phpbb_container->get('user'); $user->data['user_id'] = ANONYMOUS; $user->ip = '127.0.0.1'; $user->add_lang('acp/common'); $user->add_lang('cli');

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

TWIG

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

TWIG

Slide 58

Slide 58 text

TWIG

Slide 59

Slide 59 text

TWIG

Slide 60

Slide 60 text

FIXING TOKENS Strip Quotes:

Slide 61

Slide 61 text

Replace ELSE IF with ELSEIF Replace our "div by" with Twig's divisibleby Replace $TEST with definition.TEST Replace .foo with loops.foo|length Replace .foo.bar with foo.bar|length

Slide 62

Slide 62 text

TWIG

Slide 63

Slide 63 text

TWIG public function getTag() { return 'EVENT'; }

Slide 64

Slide 64 text

PARSER parser->getExpressionParser()->parseExpression(); $stream = $this->parser->getStream(); $stream->expect(\Twig_Token::BLOCK_END_TYPE); return new \phpbb\template\twig\node\event( $expr, $this->parser->getEnvironment(), $token->getLine(), $this->getTag() ); }

Slide 65

Slide 65 text

COMPILER

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

BROWSER KIT
 CSS SELECTOR
 DOM CRAWLER

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

COMING SOON

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

TWIG

Slide 73

Slide 73 text

FORMS & VALIDATOR

Slide 74

Slide 74 text

STOPWATCH

Slide 75

Slide 75 text

SERIALISER

Slide 76

Slide 76 text

MONOLOG

Slide 77

Slide 77 text

DOCTRINE

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

EXTENDING

Slide 80

Slide 80 text

24

Slide 81

Slide 81 text

ON PREFORMED IDEAS

Slide 82

Slide 82 text

No content

Slide 83

Slide 83 text

12 YEARS AGO (IN A GALAXY FAR FAR AWAY?)

Slide 84

Slide 84 text

SQL INJECTION

Slide 85

Slide 85 text

UPDATE CONFLICTS

Slide 86

Slide 86 text

SPAM

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

“But it was my first experience with phpBB as a forum software, and so too easily I formed the opinion that phpBB was easy to inject exploits into. So then subsequently whenever I needed forum software, I shyed away from it. I didn't want my reputation and my clients' sites to be easily compromised.”

Slide 89

Slide 89 text

PHPBB 3.0 RELEASE

Slide 90

Slide 90 text

SECURITY

Slide 91

Slide 91 text

BUT STILL…

Slide 92

Slide 92 text

PHPBB 3.1 RELEASE

Slide 93

Slide 93 text

SYMFONY COMPONENTS

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

No content

Slide 96

Slide 96 text

No content

Slide 97

Slide 97 text

No content

Slide 98

Slide 98 text

PHP

Slide 99

Slide 99 text

“Tonight's talk made me realise that having that preformed opinion and idea about how phpBB performed in the wild, from 12 years ago, was indicative of how closed my mind could be to certain topics. I'd liken it to the same way I felt about Ruby, based on “hipsters” and the plethora of “ninja rockstar guru” developer positions”

Slide 100

Slide 100 text

“Tonight I realised I still held the "insecure and outdated" opinion of phpBB, despite not having touched it since back then - and that saddened me, that I hadn't taken time to be more aware of where it was at.”

Slide 101

Slide 101 text

PREFORMED IDEAS

Slide 102

Slide 102 text

PREFORMED OPINIONS

Slide 103

Slide 103 text

PREFORMED CONCLUSIONS

Slide 104

Slide 104 text

DAMAGING

Slide 105

Slide 105 text

TOWARDS A: PROJECT
 LANGUAGE
 FRAMEWORK PERSON

Slide 106

Slide 106 text

“After my Ruby experience a couple of years ago, I resolved to be more open-minded about topics on which I had little experience. Michael's talk this evening made me resolve to do that more.”

Slide 107

Slide 107 text

THANKS @MICHAELCULLUMUK

Slide 108

Slide 108 text

QUESTIONS? @MICHAELCULLUMUK

Slide 109

Slide 109 text

phpbb/phpbb PHPBB.COM/GET-INVOLVED/

Slide 110

Slide 110 text

BIT.LY/WORLD16-PHPBB @MICHAELCULLUMUK

Slide 111

Slide 111 text

2016 2016 @MICHAELCULLUMUK

Slide 112

Slide 112 text

PHPBB, MEET SYMFONY PHP[WORLD] 2016 @MICHAELCULLUMUK