SlideShare ist ein Scribd-Unternehmen logo
1 von 56
Downloaden Sie, um offline zu lesen
PhpSpec extension points
for version 2.0.0
About me
PHP Software engineer

KrakDevs meetups organizer
Huge fan of BDD/TDD 

Part of Coduo






Web:

https://github.com/norzechowicz

https://twitter.com/norzechowicz

http://coduo.pl

http://krakdevs.pl
Norbert Orzechowicz
This is everything you
need. Trust me ;)
Ok, so how PhpSpec
works?
Just like a regular
Symfony2 console
application
Read more 

http://symfony.com/doc/current/components/console/index.html
Ok, but what happens
when user execute „run”
command?
$ bin/phpspec run
#!/usr/bin/env php!
<?php!
//bin/phpspec!
!
$app = new PhpSpecConsoleApplication(PHPSPEC_VERSION);!
Initialize console application
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
/**!
* The command line application entry point!
*/!
class Application extends BaseApplication!
{!
public function __construct($version)!
{!
}!
}!
Create service container
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
/**!
* The command line application entry point!
*/!
class Application extends BaseApplication!
{!
public function __construct($version)!
{!
$this->container = new ServiceContainer;!
parent::__construct('phpspec', $version);!
}!
}!
In the name of dependency injection!
Service Container
<?php!
///phpspec/src/PhpSpec/ServiceContainer.php!
namespace PhpSpec;!
!
class ServiceContainer!
{!
// Sets a object or a callback for the object creation. !
// A new object will be created every time!
public function set($id, $value);!
!
// Sets a object or a callback for the object creation. !
// The same object will be returned every time!
public function setShared($id, $callable);!
!
// Retrieves a service from the container!
public function get($id);!
!
// Retrieves a list of services of a given prefix!
public function getByPrefix($prefix);!
}!
Explanation of the most important methods
Register service example
<?php!
///phpspec/src/Acme/MyClass.php!
namespace Acme;!
!
class MyClass!
{!
public function setup(ServiceContainer $container)!
{!
$container->set('acme.service.foo', function ($c) {!
return new Foo();!
});!
!
$container->setShared('acme.service.bar', function ($c) {!
return new Bar();!
});!
!
$container->getByPrefix('acme.service');!
// will return acme.service.foo as Foo incance &
! ! ! // acme.service.bar as Bar instance!
}!
}!
#!/usr/bin/env php!
<?php!
//bin/phpspec!
!
$app = new PhpSpecConsoleApplication(PHPSPEC_VERSION);!
$app->run();!
Run!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
/**!
* The command line application entry point!
*/!
class Application extends BaseApplication!
{!
public function doRun(InputInterface $input, OutputInterface $output)!
{!
$this->setupContainer($this->container); !
}!
}!
Not so fast, setup service container first
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
$this->setupPresenter($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
$this->setupPresenter($container);!
$this->setupLocator($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
$this->setupPresenter($container);!
$this->setupLocator($container);!
$this->setupLoader($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
$this->setupPresenter($container);!
$this->setupLocator($container);!
$this->setupLoader($container);!
$this->setupFormatter($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
$this->setupPresenter($container);!
$this->setupLocator($container);!
$this->setupLoader($container);!
$this->setupFormatter($container);!
$this->setupRunner($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
$this->setupPresenter($container);!
$this->setupLocator($container);!
$this->setupLoader($container);!
$this->setupFormatter($container);!
$this->setupRunner($container);!
$this->setupCommands($container);!
}!
}!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
$this->setupIO($container);!
$this->setupEventDispatcher($container);!
$this->setupGenerators($container);!
$this->setupPresenter($container);!
$this->setupLocator($container);!
$this->setupLoader($container);!
$this->setupFormatter($container);!
$this->setupRunner($container);!
$this->setupCommands($container);!
!
$this->loadConfigurationFile($container);!
}!
}!
RUN!
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
public function doRun(InputInterface $input, OutputInterface $output)!
{!
$this->setupContainer($this->container);!
!
foreach ($this->container->getByPrefix('console.commands') as $command) {!
$this->add($command);!
}!
!
return parent::doRun($input, $output);!
}!
}!
But first add commands. 

By default „run” and „describe”.
Application is ready
what now?
Run command
<?php!
//phpspec/src/PhpSpec/Console/Command/RunCommand.php!
namespace PhpSpecConsoleCommand;!
!
class RunCommand extends Command!
{!
protected function configure()!
{!
// configure input options, arguments, command name!
}!
!
protected function execute(InputInterface $input, OutputInterface $output)!
{!
// run suite with runner.suite service!!
}!
}!
There is no magic here, just simple Symfony2 console
command.
Suite you say?
Space where specifications exists
Suite
Specifications?
Spaces where examples exists
Suite
FooClassSpec.php - Specification
BarClassSpec.php - Specification
FazClassSpec.php - Specification
BazClassSpec.php - Specification
Examples!?
Yes, functions that describe object behavior
(tests)
Suite
FooClassSpec.php - Specification
function it_is_awesome() - Example
function it_do_awesome_stuff() - Example
function it_is_famous() - Example
Make sense now!
Run command simplified algorithm
1. Localize suite - Locator

2. Load suite - Loader

3. Run suite - Suite Runner

4. Run specifications - Specification Runner

5. Run examples - Example Runner
And what about
extensions?
Remember container setup?
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupContainer(ServiceContainer $container)!
{!
// . . . !
$this->loadConfigurationFile($container);!
}!
}!
phpspec.yml
suites:
acme_suite:
namespace: AcmeTheLib
spec_prefix: acme_spec
!
# shortcut for
# my_suite:
# namespace: TheNamespace
my_suite: TheNamespace
!
extensions:!
- PhpSpecSymfony2ExtensionExtension
Extension interface
<?php!
//phpspec/src/PhpSpec/Extension/ExtensionInterface.php!
namespace PhpSpecExtension;!
!
use PhpSpecServiceContainer;!
!
interface ExtensionInterface!
{!
/**!
* @param ServiceContainer $container!
*/!
public function load(ServiceContainer $container);!
}!
That’s all?
Simply beautiful, right?
But what can I do with it?
But what can I do with it?
Register event listeners as a services
Replace existing services
Register custom example maintainers
Register new fomatters
Register new code generators
Replace suite locator
Register new matchers
Register new commands
!
And many many more…
How?
Let me show you how to
register an event listener.
Event subscriber class
<?php!
///src/Coduo/PhpSpec/Listener/DataProviderListener.php!
namespace CoduoPhpSpecListener;!
!
class DataProviderListener implements EventSubscriberInterface!
{!
public static function getSubscribedEvents()!
{!
return array(!
'beforeSpecification' => array('beforeSpecification'),!
);!
}!
!
public function beforeSpecification(SpecificationEvent $event)!
{!
// listener logic here !
}!
}!
PhpSpec extension class
<?php!
//src/Coduo/PhpSpec/DataProviderExtension.php!
namespace CoduoPhpSpec;!
!
class DataProviderExtension implements ExtensionInterface!
{!
public function load(ServiceContainer $container)!
{!
$container->set(!
'event_dispatcher.listeners.data_provider', !
function ($c) {!
return new DataProviderListener();!
}!
);!
}!
}!
And how PhpSpec know
that my service is an
event listener?
Just use proper prefix
<?php!
//phpspec/src/PhpSpec/Console/Application.php!
!
use SymfonyComponentConsoleApplication as BaseApplication;!
!
class Application extends BaseApplication!
{!
protected function setupEventDispatcher(ServiceContainer $container)!
{!
$container->setShared('event_dispatcher', function ($c) {!
$dispatcher = new EventDispatcher;!
!
array_map(!
array($dispatcher, 'addSubscriber'),!
$c->getByPrefix('event_dispatcher.listeners')!
);!
!
return $dispatcher;!
});!
}!
}!
Are there any other prefixes
that I can use?
List of prefixes that you can use by default.
event_dispatcher.listeners - EventSubscriberInterfac

code_generator.generators - GeneratorInterfac

formatter.presenter.differ.engines - DifferEngineInterface

locator.locators - ResourceLocatorInterface

runner.maintaners - MaintainerInterface

console.commands - Command
Thank you for your
attention
Coduo 

behaviour driven developers
contact@coduo.pl
Hire us!
Questions?

Weitere ähnliche Inhalte

Was ist angesagt?

Laravel 4 package development
Laravel 4 package developmentLaravel 4 package development
Laravel 4 package developmentTihomir Opačić
 
Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Compare Infobase Limited
 
Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2Sumy PHP User Grpoup
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportBen Scofield
 
Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2Raul Fraile
 
Codeigniter4の比較と検証
Codeigniter4の比較と検証Codeigniter4の比較と検証
Codeigniter4の比較と検証ME iBotch
 
Magento - a Zend Framework Application
Magento - a Zend Framework ApplicationMagento - a Zend Framework Application
Magento - a Zend Framework ApplicationZendCon
 
Troubleshooting Plone
Troubleshooting PloneTroubleshooting Plone
Troubleshooting PloneRicado Alves
 
How not to develop with Plone
How not to develop with PloneHow not to develop with Plone
How not to develop with PloneLennart Regebro
 
Building Cloud Castles
Building Cloud CastlesBuilding Cloud Castles
Building Cloud CastlesBen Scofield
 
Python Flask app deployed to OPenShift using Wercker CI
Python Flask app deployed to OPenShift using Wercker CIPython Flask app deployed to OPenShift using Wercker CI
Python Flask app deployed to OPenShift using Wercker CIBruno Rocha
 
Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?Kirill Chebunin
 
Assurer - a pluggable server testing/monitoring framework
Assurer - a pluggable server testing/monitoring frameworkAssurer - a pluggable server testing/monitoring framework
Assurer - a pluggable server testing/monitoring frameworkGosuke Miyashita
 
Application Diagnosis with Zend Server Tracing
Application Diagnosis with Zend Server TracingApplication Diagnosis with Zend Server Tracing
Application Diagnosis with Zend Server TracingZendCon
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is DockerNick Belhomme
 
Flask Introduction - Python Meetup
Flask Introduction - Python MeetupFlask Introduction - Python Meetup
Flask Introduction - Python MeetupAreski Belaid
 
Modularizing Rails Apps with Cells
Modularizing Rails Apps with CellsModularizing Rails Apps with Cells
Modularizing Rails Apps with CellsFlavian Missi
 
Flask RESTful Flask HTTPAuth
Flask RESTful Flask HTTPAuthFlask RESTful Flask HTTPAuth
Flask RESTful Flask HTTPAuthEueung Mulyana
 

Was ist angesagt? (20)

Laravel 4 package development
Laravel 4 package developmentLaravel 4 package development
Laravel 4 package development
 
Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation Zend - Installation And Sample Project Creation
Zend - Installation And Sample Project Creation
 
Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack Support
 
Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2Refactorización de aplicaciones PHP/Symfony2
Refactorización de aplicaciones PHP/Symfony2
 
Codeigniter4の比較と検証
Codeigniter4の比較と検証Codeigniter4の比較と検証
Codeigniter4の比較と検証
 
Magento - a Zend Framework Application
Magento - a Zend Framework ApplicationMagento - a Zend Framework Application
Magento - a Zend Framework Application
 
Troubleshooting Plone
Troubleshooting PloneTroubleshooting Plone
Troubleshooting Plone
 
How not to develop with Plone
How not to develop with PloneHow not to develop with Plone
How not to develop with Plone
 
Building Cloud Castles
Building Cloud CastlesBuilding Cloud Castles
Building Cloud Castles
 
Python Flask app deployed to OPenShift using Wercker CI
Python Flask app deployed to OPenShift using Wercker CIPython Flask app deployed to OPenShift using Wercker CI
Python Flask app deployed to OPenShift using Wercker CI
 
Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?Composer - Package Management for PHP. Silver Bullet?
Composer - Package Management for PHP. Silver Bullet?
 
Assurer - a pluggable server testing/monitoring framework
Assurer - a pluggable server testing/monitoring frameworkAssurer - a pluggable server testing/monitoring framework
Assurer - a pluggable server testing/monitoring framework
 
Application Diagnosis with Zend Server Tracing
Application Diagnosis with Zend Server TracingApplication Diagnosis with Zend Server Tracing
Application Diagnosis with Zend Server Tracing
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
Flask Introduction - Python Meetup
Flask Introduction - Python MeetupFlask Introduction - Python Meetup
Flask Introduction - Python Meetup
 
Palestra VCR
Palestra VCRPalestra VCR
Palestra VCR
 
Modularizing Rails Apps with Cells
Modularizing Rails Apps with CellsModularizing Rails Apps with Cells
Modularizing Rails Apps with Cells
 
Flask RESTful Flask HTTPAuth
Flask RESTful Flask HTTPAuthFlask RESTful Flask HTTPAuth
Flask RESTful Flask HTTPAuth
 
Elixir on Containers
Elixir on ContainersElixir on Containers
Elixir on Containers
 

Andere mochten auch

Dye family room furniture selections
Dye family room furniture selectionsDye family room furniture selections
Dye family room furniture selectionsErica Peale
 
Goo Create: Import animation
Goo Create: Import animationGoo Create: Import animation
Goo Create: Import animationGoo Technologies
 
Hasil pengamatan gum xantan
Hasil pengamatan gum xantanHasil pengamatan gum xantan
Hasil pengamatan gum xantanDn Ssd
 
Transitions and Trajectories in Temporal Networks
Transitions and Trajectories in Temporal NetworksTransitions and Trajectories in Temporal Networks
Transitions and Trajectories in Temporal NetworksMoses Boudourides
 
Multilayerity within multilayerity? On multilayer assortativity in social net...
Multilayerity within multilayerity? On multilayer assortativity in social net...Multilayerity within multilayerity? On multilayer assortativity in social net...
Multilayerity within multilayerity? On multilayer assortativity in social net...Moses Boudourides
 
Art 2100 Online syllabus summer i 2016
Art 2100 Online syllabus summer i 2016Art 2100 Online syllabus summer i 2016
Art 2100 Online syllabus summer i 2016Lydia Dorsey
 
Goo Create: Import and Create
Goo Create: Import and CreateGoo Create: Import and Create
Goo Create: Import and CreateGoo Technologies
 
Goo Create: Lights and cameras
Goo Create: Lights and camerasGoo Create: Lights and cameras
Goo Create: Lights and camerasGoo Technologies
 
Dye living room furniture selections
Dye living room furniture selectionsDye living room furniture selections
Dye living room furniture selectionsErica Peale
 
Dye dining room furniture selections
Dye dining room furniture selectionsDye dining room furniture selections
Dye dining room furniture selectionsErica Peale
 
Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...
Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...
Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...Moses Boudourides
 

Andere mochten auch (20)

A walk through system layers
A walk through system layersA walk through system layers
A walk through system layers
 
Save Repository From Save
Save Repository From SaveSave Repository From Save
Save Repository From Save
 
TDD with phpspec2
TDD with phpspec2TDD with phpspec2
TDD with phpspec2
 
Dye family room furniture selections
Dye family room furniture selectionsDye family room furniture selections
Dye family room furniture selections
 
Introduction to Lights
Introduction to LightsIntroduction to Lights
Introduction to Lights
 
Goo Create: Import animation
Goo Create: Import animationGoo Create: Import animation
Goo Create: Import animation
 
Hasil pengamatan gum xantan
Hasil pengamatan gum xantanHasil pengamatan gum xantan
Hasil pengamatan gum xantan
 
Transitions and Trajectories in Temporal Networks
Transitions and Trajectories in Temporal NetworksTransitions and Trajectories in Temporal Networks
Transitions and Trajectories in Temporal Networks
 
Multilayerity within multilayerity? On multilayer assortativity in social net...
Multilayerity within multilayerity? On multilayer assortativity in social net...Multilayerity within multilayerity? On multilayer assortativity in social net...
Multilayerity within multilayerity? On multilayer assortativity in social net...
 
Physical activity
Physical  activityPhysical  activity
Physical activity
 
French vocab rehab
French vocab rehabFrench vocab rehab
French vocab rehab
 
Karthik
KarthikKarthik
Karthik
 
Art 2100 Online syllabus summer i 2016
Art 2100 Online syllabus summer i 2016Art 2100 Online syllabus summer i 2016
Art 2100 Online syllabus summer i 2016
 
Goo Create: Import and Create
Goo Create: Import and CreateGoo Create: Import and Create
Goo Create: Import and Create
 
Goo Create: Lights and cameras
Goo Create: Lights and camerasGoo Create: Lights and cameras
Goo Create: Lights and cameras
 
Dye living room furniture selections
Dye living room furniture selectionsDye living room furniture selections
Dye living room furniture selections
 
Dye dining room furniture selections
Dye dining room furniture selectionsDye dining room furniture selections
Dye dining room furniture selections
 
Vivian Murciano Media Sales Director
Vivian Murciano Media Sales DirectorVivian Murciano Media Sales Director
Vivian Murciano Media Sales Director
 
Fotografías
FotografíasFotografías
Fotografías
 
Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...
Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...
Boudourides & Lenis, Distribution of Groups of Vertices Across Multilayer Net...
 

Ähnlich wie PhpSpec extension points

HTML5 tutorial: canvas, offfline & sockets
HTML5 tutorial: canvas, offfline & socketsHTML5 tutorial: canvas, offfline & sockets
HTML5 tutorial: canvas, offfline & socketsRemy Sharp
 
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)Fabien Potencier
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy CodeRowan Merewood
 
HTML5: huh, what is it good for?
HTML5: huh, what is it good for?HTML5: huh, what is it good for?
HTML5: huh, what is it good for?Remy Sharp
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to DomainJeremy Cook
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer ToolboxPablo Godel
 
Symfony 2.0
Symfony 2.0Symfony 2.0
Symfony 2.0GrUSP
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.catPablo Godel
 
CodePolitan Webinar: The Rise of PHP
CodePolitan Webinar: The Rise of PHPCodePolitan Webinar: The Rise of PHP
CodePolitan Webinar: The Rise of PHPSteeven Salim
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Rafael Dohms
 
Scale your PHP application with Elastic Beanstalk - CloudParty Genova
Scale your PHP application with Elastic Beanstalk - CloudParty GenovaScale your PHP application with Elastic Beanstalk - CloudParty Genova
Scale your PHP application with Elastic Beanstalk - CloudParty GenovaCorley S.r.l.
 
3. build your own php extension ai ti aptech
3. build your own php extension   ai ti aptech3. build your own php extension   ai ti aptech
3. build your own php extension ai ti aptechQuang Anh Le
 
07 build your-own_php_extension
07 build your-own_php_extension07 build your-own_php_extension
07 build your-own_php_extensionNguyen Duc Phu
 
Build your own PHP extension
Build your own PHP extensionBuild your own PHP extension
Build your own PHP extensionVõ Duy Tuấn
 
Composer for busy developers - DPC13
Composer for busy developers - DPC13Composer for busy developers - DPC13
Composer for busy developers - DPC13Rafael Dohms
 
Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfonyFrancois Zaninotto
 

Ähnlich wie PhpSpec extension points (20)

HTML5 tutorial: canvas, offfline & sockets
HTML5 tutorial: canvas, offfline & socketsHTML5 tutorial: canvas, offfline & sockets
HTML5 tutorial: canvas, offfline & sockets
 
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
 
Phalcon 2 - PHP Brazil Conference
Phalcon 2 - PHP Brazil ConferencePhalcon 2 - PHP Brazil Conference
Phalcon 2 - PHP Brazil Conference
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
HTML5: huh, what is it good for?
HTML5: huh, what is it good for?HTML5: huh, what is it good for?
HTML5: huh, what is it good for?
 
PHP
PHPPHP
PHP
 
Lecture8
Lecture8Lecture8
Lecture8
 
Phalcon - Giant Killer
Phalcon - Giant KillerPhalcon - Giant Killer
Phalcon - Giant Killer
 
Beyond MVC: from Model to Domain
Beyond MVC: from Model to DomainBeyond MVC: from Model to Domain
Beyond MVC: from Model to Domain
 
The Modern Developer Toolbox
The Modern Developer ToolboxThe Modern Developer Toolbox
The Modern Developer Toolbox
 
Symfony 2.0
Symfony 2.0Symfony 2.0
Symfony 2.0
 
Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.cat
 
CodePolitan Webinar: The Rise of PHP
CodePolitan Webinar: The Rise of PHPCodePolitan Webinar: The Rise of PHP
CodePolitan Webinar: The Rise of PHP
 
Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13Composer for Busy Developers - php|tek13
Composer for Busy Developers - php|tek13
 
Scale your PHP application with Elastic Beanstalk - CloudParty Genova
Scale your PHP application with Elastic Beanstalk - CloudParty GenovaScale your PHP application with Elastic Beanstalk - CloudParty Genova
Scale your PHP application with Elastic Beanstalk - CloudParty Genova
 
3. build your own php extension ai ti aptech
3. build your own php extension   ai ti aptech3. build your own php extension   ai ti aptech
3. build your own php extension ai ti aptech
 
07 build your-own_php_extension
07 build your-own_php_extension07 build your-own_php_extension
07 build your-own_php_extension
 
Build your own PHP extension
Build your own PHP extensionBuild your own PHP extension
Build your own PHP extension
 
Composer for busy developers - DPC13
Composer for busy developers - DPC13Composer for busy developers - DPC13
Composer for busy developers - DPC13
 
Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfony
 

Kürzlich hochgeladen

Progress Report - Oracle Database Analyst Summit
Progress  Report - Oracle Database Analyst SummitProgress  Report - Oracle Database Analyst Summit
Progress Report - Oracle Database Analyst SummitHolger Mueller
 
Grateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdfGrateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdfPaul Menig
 
Regression analysis: Simple Linear Regression Multiple Linear Regression
Regression analysis:  Simple Linear Regression Multiple Linear RegressionRegression analysis:  Simple Linear Regression Multiple Linear Regression
Regression analysis: Simple Linear Regression Multiple Linear RegressionRavindra Nath Shukla
 
A DAY IN THE LIFE OF A SALESMAN / WOMAN
A DAY IN THE LIFE OF A  SALESMAN / WOMANA DAY IN THE LIFE OF A  SALESMAN / WOMAN
A DAY IN THE LIFE OF A SALESMAN / WOMANIlamathiKannappan
 
Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999
Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999
Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999Tina Ji
 
Call Girls in Gomti Nagar - 7388211116 - With room Service
Call Girls in Gomti Nagar - 7388211116  - With room ServiceCall Girls in Gomti Nagar - 7388211116  - With room Service
Call Girls in Gomti Nagar - 7388211116 - With room Servicediscovermytutordmt
 
Cash Payment 9602870969 Escort Service in Udaipur Call Girls
Cash Payment 9602870969 Escort Service in Udaipur Call GirlsCash Payment 9602870969 Escort Service in Udaipur Call Girls
Cash Payment 9602870969 Escort Service in Udaipur Call GirlsApsara Of India
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Lviv Startup Club
 
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service AvailableCall Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service AvailableDipal Arora
 
DEPED Work From Home WORKWEEK-PLAN.docx
DEPED Work From Home  WORKWEEK-PLAN.docxDEPED Work From Home  WORKWEEK-PLAN.docx
DEPED Work From Home WORKWEEK-PLAN.docxRodelinaLaud
 
Pharma Works Profile of Karan Communications
Pharma Works Profile of Karan CommunicationsPharma Works Profile of Karan Communications
Pharma Works Profile of Karan Communicationskarancommunications
 
Insurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usageInsurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usageMatteo Carbone
 
0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdf0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdfRenandantas16
 
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...Dave Litwiller
 
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒anilsa9823
 
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...noida100girls
 
Socio-economic-Impact-of-business-consumers-suppliers-and.pptx
Socio-economic-Impact-of-business-consumers-suppliers-and.pptxSocio-economic-Impact-of-business-consumers-suppliers-and.pptx
Socio-economic-Impact-of-business-consumers-suppliers-and.pptxtrishalcan8
 
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best ServicesMysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best ServicesDipal Arora
 
The CMO Survey - Highlights and Insights Report - Spring 2024
The CMO Survey - Highlights and Insights Report - Spring 2024The CMO Survey - Highlights and Insights Report - Spring 2024
The CMO Survey - Highlights and Insights Report - Spring 2024christinemoorman
 

Kürzlich hochgeladen (20)

Progress Report - Oracle Database Analyst Summit
Progress  Report - Oracle Database Analyst SummitProgress  Report - Oracle Database Analyst Summit
Progress Report - Oracle Database Analyst Summit
 
Grateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdfGrateful 7 speech thanking everyone that has helped.pdf
Grateful 7 speech thanking everyone that has helped.pdf
 
Regression analysis: Simple Linear Regression Multiple Linear Regression
Regression analysis:  Simple Linear Regression Multiple Linear RegressionRegression analysis:  Simple Linear Regression Multiple Linear Regression
Regression analysis: Simple Linear Regression Multiple Linear Regression
 
A DAY IN THE LIFE OF A SALESMAN / WOMAN
A DAY IN THE LIFE OF A  SALESMAN / WOMANA DAY IN THE LIFE OF A  SALESMAN / WOMAN
A DAY IN THE LIFE OF A SALESMAN / WOMAN
 
Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999
Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999
Russian Faridabad Call Girls(Badarpur) : ☎ 8168257667, @4999
 
Call Girls in Gomti Nagar - 7388211116 - With room Service
Call Girls in Gomti Nagar - 7388211116  - With room ServiceCall Girls in Gomti Nagar - 7388211116  - With room Service
Call Girls in Gomti Nagar - 7388211116 - With room Service
 
Cash Payment 9602870969 Escort Service in Udaipur Call Girls
Cash Payment 9602870969 Escort Service in Udaipur Call GirlsCash Payment 9602870969 Escort Service in Udaipur Call Girls
Cash Payment 9602870969 Escort Service in Udaipur Call Girls
 
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
Yaroslav Rozhankivskyy: Три складові і три передумови максимальної продуктивн...
 
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service AvailableCall Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
Call Girls Pune Just Call 9907093804 Top Class Call Girl Service Available
 
DEPED Work From Home WORKWEEK-PLAN.docx
DEPED Work From Home  WORKWEEK-PLAN.docxDEPED Work From Home  WORKWEEK-PLAN.docx
DEPED Work From Home WORKWEEK-PLAN.docx
 
Pharma Works Profile of Karan Communications
Pharma Works Profile of Karan CommunicationsPharma Works Profile of Karan Communications
Pharma Works Profile of Karan Communications
 
Insurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usageInsurers' journeys to build a mastery in the IoT usage
Insurers' journeys to build a mastery in the IoT usage
 
Best Practices for Implementing an External Recruiting Partnership
Best Practices for Implementing an External Recruiting PartnershipBest Practices for Implementing an External Recruiting Partnership
Best Practices for Implementing an External Recruiting Partnership
 
0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdf0183760ssssssssssssssssssssssssssss00101011 (27).pdf
0183760ssssssssssssssssssssssssssss00101011 (27).pdf
 
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
Enhancing and Restoring Safety & Quality Cultures - Dave Litwiller - May 2024...
 
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒VIP Call Girls In Saharaganj ( Lucknow  ) 🔝 8923113531 🔝  Cash Payment (COD) 👒
VIP Call Girls In Saharaganj ( Lucknow ) 🔝 8923113531 🔝 Cash Payment (COD) 👒
 
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...BEST ✨ Call Girls In  Indirapuram Ghaziabad  ✔️ 9871031762 ✔️ Escorts Service...
BEST ✨ Call Girls In Indirapuram Ghaziabad ✔️ 9871031762 ✔️ Escorts Service...
 
Socio-economic-Impact-of-business-consumers-suppliers-and.pptx
Socio-economic-Impact-of-business-consumers-suppliers-and.pptxSocio-economic-Impact-of-business-consumers-suppliers-and.pptx
Socio-economic-Impact-of-business-consumers-suppliers-and.pptx
 
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best ServicesMysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
Mysore Call Girls 8617370543 WhatsApp Number 24x7 Best Services
 
The CMO Survey - Highlights and Insights Report - Spring 2024
The CMO Survey - Highlights and Insights Report - Spring 2024The CMO Survey - Highlights and Insights Report - Spring 2024
The CMO Survey - Highlights and Insights Report - Spring 2024
 

PhpSpec extension points