SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Downloaden Sie, um offline zu lesen
Dependency
Injection in PHP

PHPCon Poland
Szczyrk 25/10/13

!

by @cakper
flickr.com/limowreck666/223731385/
Kacper Gunia // @cakper
Software Engineer @SensioLabsUK
Symfony Certified Developer
#Symfony-PL // SymfonyLab.pl
Silesian PHP User Group // SPUG.pl
Inversion of Control
Dependency Injection
Events
Aspect Oriented
Programming
flickr.com/goetter/4559773791/
Diving into
Dependency Injection

flickr.com/haniamir/651043585/
Dependency Injection
!
!

class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  public	
  function	
  playDisc(Disc	
  $disc)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  echo	
  'Now	
  playing:	
  '.$disc-­‐>getMovieTitle();	
  
!

	
  	
  	
  	
  	
  	
  	
  	
  $tv	
  =	
  new	
  Tv('Samsung	
  40"');	
  
	
  	
  	
  	
  	
  	
  	
  	
  $tv-­‐>sendToOutput($disc-­‐>getResource());	
  
	
  	
  	
  	
  }	
  
}
Dependency Injection
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  private	
  $tv;	
  
!

	
  	
  	
  	
  public	
  function	
  __construct()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>tv	
  =	
  new	
  Tv('Samsung	
  40"');;	
  
	
  	
  	
  	
  }	
  
!

	
  	
  	
  	
  public	
  function	
  playDisc(Disc	
  $disc)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  echo	
  'Now	
  playing:	
  '	
  .	
  $disc-­‐>getMovieTitle();	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>tv-­‐>sendToOutput($disc-­‐>getResource());	
  
	
  	
  	
  	
  }	
  
}
Dependency Injection
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  private	
  $tv;	
  
!

	
  	
  	
  	
  public	
  function	
  __construct(Tv	
  $tv)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>tv	
  =	
  $tv;	
  
	
  	
  	
  	
  }	
  //	
  (...)	
  
}	
  
!

$tv	
  =	
  new	
  Tv('Samsung	
  40"');	
  
$dvdPlayer	
  =	
  new	
  DvdPlayer($tv);
Dependency Injection
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  private	
  $device;	
  
!

	
  	
  	
  	
  public	
  function	
  __construct(HdmiDevice	
  $device)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>device	
  =	
  $device;	
  
	
  	
  	
  	
  }	
  //	
  (...)	
  
}	
  
!

$projector	
  =	
  new	
  Projector('Epson	
  EB');	
  
$dvdPlayer	
  =	
  new	
  DvdPlayer($tv);
Nailed it!
“Dependency Injection 

is where components are given
their dependencies through
their constructors, methods, or
directly into fields.”
!

“(...) it is a 25-dollar term for a 5-cent concept”
source: picocontainer.codehaus.org jamesshore.com
Types of Injection
Constructor
Setter
Property
Reflection
flickr.com/jensfinke/4417602702/
Constructor Injection
class	
  Tv	
  implements	
  HdmiDevice{}	
  
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  private	
  $device;	
  
!

	
  	
  	
  	
  public	
  function	
  __construct(HdmiDevice	
  $device)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>device	
  =	
  $device;	
  
	
  	
  	
  	
  }	
  
}	
  
!

$tv	
  =	
  new	
  Tv('Samsung	
  40"');	
  
$dvdPlayer	
  =	
  new	
  DvdPlayer($tv);
Setter Injection
class	
  BlurayDisc	
  implements	
  Disc{}	
  
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  private	
  $disc;	
  
!

	
  	
  	
  	
  public	
  function	
  setDisc(Disc	
  $disc)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>disc	
  =	
  $disc;	
  
	
  	
  	
  	
  }	
  
}	
  
!

$disc	
  =	
  new	
  BlurayDisc('Pulp	
  Fiction');	
  
$dvdPlayer	
  =	
  new	
  DvdPlayer();	
  
$dvdPlayer-­‐>setDisc($disc);
Property Injection
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  public	
  $remote;	
  
}	
  
!

$dvdPlayer	
  =	
  new	
  DvdPlayer();	
  
$dvdPlayer-­‐>remote	
  =	
  new	
  Remote();
Reflection Injection
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  private	
  $powerSupply;	
  
}	
  
!

$dvdPlayer	
  =	
  new	
  DvdPlayer();	
  
$reflector	
  =	
  new	
  ReflectionClass($dvdPlayer);	
  
$powerSupply	
  =	
  $reflector-­‐>getProperty('powerSupply');	
  
$powerSupply-­‐>setAccessible(true);	
  
!

$powerSupply-­‐>setValue($dvdPlayer,	
  new	
  PowerSupply());
Pros & Cons

flickr.com/paperpariah/3589690234/
Advantage #1

Decoupling

flickr.com/roonster/3387705446/
Advantage #2

Dependency
Inversion Principle

flickr.com/antonsiniorg/1876733029/
Advantage #3

Reusability

flickr.com/ejpphoto/2314610838/
Advantage #4

Clean code

flickr.com/38659937@N06/4020413080/
Advantage #5

Easier testing

flickr.com/nattu/895220635/
Advantage #6

Instance
management

flickr.com/34094515@N00/3817086937/
Advantage #7

IDE support

flickr.com/gavin_fordham/9407339641/
Disadvantage

Complex
initialisation

flickr.com/toniblay/52445415/
Simple Solution

Factory

flickr.com/lenscrack/5577431429/
Proper Solution

Dependency Injection
Container

flickr.com/thomashawk/24089964/
“Dependency Injection
Container is simply a PHP
object that manages the
instantiation of other objects”
!

We call them “Services”
source: symfony.com
Our DvdPlayer
!
!

$tv	
  =	
  new	
  Tv('Samsung	
  40"');	
  
$dvdPlayer	
  =	
  new	
  DvdPlayer($tv);	
  
!

$disc	
  =	
  new	
  Disc('Pulp	
  Fiction');	
  
$dvdPlayer-­‐>playDisc($disc);
Simple Container class
class	
  Container	
  
{	
  
	
  	
  	
  	
  public	
  function	
  getTv()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  new	
  Tv('Samsung	
  40"');	
  
	
  	
  	
  	
  }	
  
!

	
  	
  	
  	
  public	
  function	
  getDvdPlayer()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  new	
  DvdPlayer($this-­‐>getTv());	
  
	
  	
  	
  	
  }	
  
}
Container use
!
!

$container	
  =	
  new	
  Container();	
  
!

$dvdPlayer	
  =	
  $container-­‐>getDvdPlayer();	
  
!

$disc	
  =	
  new	
  Disc('Pulp	
  Fiction');	
  
$dvdPlayer-­‐>playDisc($disc);
DIC Implementations
Twittee

Pimple

PHP-DI 

ZendDi

IlluminateContainer

OrnoDi

LeagueDi

SymfonyDependencyInjection 
flickr.com/smb_flickr/313116995/
DI & DIC Patterns

flickr.com/thelearningcurvedotca/8645721482/
Pattern #1

Expect Interfaces,
not Implementations

flickr.com/deapeajay/2969264395/
Pattern #2

Don’t check null values

flickr.com/g-ratphotos/3328593629/
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  public	
  $disc;	
  
!

	
  	
  	
  	
  public	
  function	
  play()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  (!is_null($this-­‐>disc))	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>sendToOutput($this-­‐>disc-­‐>getResource());	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
!

	
  	
  	
  	
  public	
  function	
  play()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  ($this-­‐>disc	
  instanceof	
  Disc)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>sendToOutput($this-­‐>disc-­‐>getResource());	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}
Pattern #3

Avoid ‘Service Locator’

flickr.com/mateus27_24-25/2224073271/
class	
  DvdPlayer	
  
{	
  
	
  	
  	
  	
  private	
  $locator;	
  
!

	
  	
  	
  	
  public	
  function	
  __construct()	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>locator	
  =	
  ServiceLocator::getInstance();	
  
	
  	
  	
  	
  }	
  
!
!

	
  	
  	
  	
  public	
  function	
  playDisc(Disc	
  $disc)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>locator	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>getTv()	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>sendToOutput($disc-­‐>getResource());	
  
	
  	
  	
  	
  }	
  
}
Pattern #4

Don’t inject whole
container

flickr.com/ucumari/580865728/
Pattern #5

In DIC store
Services and Properties,
but not Entities

flickr.com/madlyinlovewithlife/8674850717/
Pattern #6

Don’t be afraid to create
plenty of small Classes

flickr.com/geoki/2691420977/
Symfony DIC
in action
Services
new	
  Tv('Samsung	
  40”’)	
  
!

services:	
  
	
  	
  tv:	
  
	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  Tv	
  
	
  	
  	
  	
  arguments:	
  	
  [“Samsung	
  40"”]	
  
Parameters
new	
  Tv('Samsung	
  40”’)	
  
!

parameters:	
  
	
  	
  tv_name:	
  	
  Samsung	
  40"	
  
Parameters & Services
new	
  Tv('Samsung	
  40”’)	
  
!

parameters:	
  
	
  	
  tv_name:	
  	
  Samsung	
  40"	
  
!

services:	
  
	
  	
  tv:	
  
	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  Tv	
  
	
  	
  	
  	
  arguments:	
  	
  [“%tv_name%”]	
  
!

$container-­‐>get('tv');
Compiled Container
!
!
!
!

protected	
  function	
  getTvService()	
  
{	
  
	
  	
  	
  	
  return	
  $this-­‐>services['tv']	
  =	
  new	
  Tv('Samsung');	
  
}	
  
Static Factory
services:	
  
	
  	
  	
  	
  tv	
  
	
  	
  	
  	
  	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Tv	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  factory_class:	
  	
  TvFactory	
  
	
  	
  	
  	
  	
  	
  	
  	
  factory_method:	
  get
Factory
services:	
  
	
  	
  	
  	
  tv_factory:	
  
	
  	
  	
  	
  	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  TvFactory	
  
	
  	
  	
  	
  tv	
  
	
  	
  	
  	
  	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Tv	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  factory_service:	
  tv_factory	
  
	
  	
  	
  	
  	
  	
  	
  	
  factory_method:	
  	
  get
Optional Dependencies
class	
  DvdPlayer	
  
{	
  
	
  	
  function	
  __construct(HdmiDevice	
  $device	
  =	
  null){}	
  
}	
  
!

services:	
  
	
  	
  tv:	
  
	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  Tv	
  
	
  	
  	
  	
  arguments:	
  	
  [%tv_name%]	
  
	
  	
  dvd_player:	
  
	
  	
  	
  	
  	
  	
  class:	
  	
  	
  	
  DvdPlayer	
  
	
  	
  	
  	
  	
  	
  arguments	
  ["@?tv"]	
  
Lazy-loaded Services
services:	
  
	
  	
  tv:	
  
	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  Tv	
  
	
  	
  	
  	
  arguments:	
  	
  [“%tv_name%”]	
  
	
   	
   lazy:	
  	
   	
   	
   true
Private Services
services:	
  
	
  	
  drm_decryptor:	
  
	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  DrmDecryptor	
  
	
   	
   public:	
  	
   	
   false	
  
	
  	
  dvd_player:	
  
	
  	
  	
  	
  	
  	
  class:	
  	
  	
  	
  DvdPlayer	
  
	
  	
  	
  	
  	
  	
  arguments	
  [“@drm_decryptor”]
Scopes
services:	
  
	
  	
  tv:	
  
	
  	
  	
  	
  class:	
  	
  	
  	
  	
  	
  Tv	
  
	
  	
  	
  	
  arguments:	
  	
  [“%tv_name%”]	
  
	
   	
   scope:	
   	
   	
   prototype
PHPStorm
support
Adrien Brault

sxc.hu/photo/228094/
Questions?
!

Thank you! :)
!

joind.in/9760
flickr.com/eole/3809742516/

Weitere ähnliche Inhalte

Was ist angesagt?

Building a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesBuilding a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesCiaranMcNulty
 
Symfony without the framework
Symfony without the frameworkSymfony without the framework
Symfony without the frameworkGOG.com dev team
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesMarcello Duarte
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf Conference
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony TechniquesKris Wallsmith
 
PHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodePHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodeSWIFTotter Solutions
 
Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)James Titcumb
 
Let's play a game with blackfire player
Let's play a game with blackfire playerLet's play a game with blackfire player
Let's play a game with blackfire playerMarcin Czarnecki
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Konstantin Kudryashov
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Michelangelo van Dam
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationŁukasz Chruściel
 
UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013Michelangelo van Dam
 
From framework coupled code to #microservices through #DDD /by @codelytv
From framework coupled code to #microservices through #DDD /by @codelytvFrom framework coupled code to #microservices through #DDD /by @codelytv
From framework coupled code to #microservices through #DDD /by @codelytvCodelyTV
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207patter
 
You must know about CodeIgniter Popular Library
You must know about CodeIgniter Popular LibraryYou must know about CodeIgniter Popular Library
You must know about CodeIgniter Popular LibraryBo-Yi Wu
 

Was ist angesagt? (20)

Building a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesBuilding a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing Strategies
 
What's new with PHP7
What's new with PHP7What's new with PHP7
What's new with PHP7
 
Symfony without the framework
Symfony without the frameworkSymfony without the framework
Symfony without the framework
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
PHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better CodePHP: 4 Design Patterns to Make Better Code
PHP: 4 Design Patterns to Make Better Code
 
Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)Diving into HHVM Extensions (PHPNW Conference 2015)
Diving into HHVM Extensions (PHPNW Conference 2015)
 
Let's play a game with blackfire player
Let's play a game with blackfire playerLet's play a game with blackfire player
Let's play a game with blackfire player
 
Zero to SOLID
Zero to SOLIDZero to SOLID
Zero to SOLID
 
New in php 7
New in php 7New in php 7
New in php 7
 
Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015Min-Maxing Software Costs - Laracon EU 2015
Min-Maxing Software Costs - Laracon EU 2015
 
Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013Workshop quality assurance for php projects - ZendCon 2013
Workshop quality assurance for php projects - ZendCon 2013
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integration
 
UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013UA testing with Selenium and PHPUnit - PFCongres 2013
UA testing with Selenium and PHPUnit - PFCongres 2013
 
From framework coupled code to #microservices through #DDD /by @codelytv
From framework coupled code to #microservices through #DDD /by @codelytvFrom framework coupled code to #microservices through #DDD /by @codelytv
From framework coupled code to #microservices through #DDD /by @codelytv
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207
 
Short Introduction To "perl -d"
Short Introduction To "perl -d"Short Introduction To "perl -d"
Short Introduction To "perl -d"
 
You must know about CodeIgniter Popular Library
You must know about CodeIgniter Popular LibraryYou must know about CodeIgniter Popular Library
You must know about CodeIgniter Popular Library
 

Andere mochten auch

Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency InjectionTheo Jungeblut
 
Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Fabien Potencier
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency InjectionPlatonov Sergey
 
Head First Java Chapter 3
Head First Java Chapter 3Head First Java Chapter 3
Head First Java Chapter 3Tom Henricksen
 
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...Dev2Dev
 
Ciklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency InjectionCiklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency InjectionPavel Voznenko
 
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...Ciklum Minsk
 
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)Fabien Potencier
 
Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3Fabien Potencier
 
MVVM - Model View ViewModel
MVVM - Model View ViewModelMVVM - Model View ViewModel
MVVM - Model View ViewModelDareen Alhiyari
 
Тестирование безопасности: PHP инъекция
Тестирование безопасности: PHP инъекцияТестирование безопасности: PHP инъекция
Тестирование безопасности: PHP инъекцияSQALab
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDPavel Tsukanov
 
The framework as an implementation detail
The framework as an implementation detailThe framework as an implementation detail
The framework as an implementation detailMarcello Duarte
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great InfographicsSlideShare
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShareKapost
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareEmpowered Presentations
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation OptimizationOneupweb
 

Andere mochten auch (20)

Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency Injection
 
Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4Dependency injection in PHP 5.3/5.4
Dependency injection in PHP 5.3/5.4
 
Практика использования Dependency Injection
Практика использования Dependency InjectionПрактика использования Dependency Injection
Практика использования Dependency Injection
 
Thesis
ThesisThesis
Thesis
 
Head First Java Chapter 3
Head First Java Chapter 3Head First Java Chapter 3
Head First Java Chapter 3
 
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. ...
 
Ciklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency InjectionCiklum Odessa PHP Saturday - Dependency Injection
Ciklum Odessa PHP Saturday - Dependency Injection
 
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
Dependency Injection Pattern in JavaScript, Speakers' Corner by Evgeny Dmitri...
 
The MVVM Pattern
The MVVM PatternThe MVVM Pattern
The MVVM Pattern
 
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
 
Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3Dependency Injection with PHP 5.3
Dependency Injection with PHP 5.3
 
MVVM - Model View ViewModel
MVVM - Model View ViewModelMVVM - Model View ViewModel
MVVM - Model View ViewModel
 
Тестирование безопасности: PHP инъекция
Тестирование безопасности: PHP инъекцияТестирование безопасности: PHP инъекция
Тестирование безопасности: PHP инъекция
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
The framework as an implementation detail
The framework as an implementation detailThe framework as an implementation detail
The framework as an implementation detail
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great Infographics
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization
 

Ähnlich wie Dependency Injection in PHP

Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetAchieve Internet
 
Docker Security workshop slides
Docker Security workshop slidesDocker Security workshop slides
Docker Security workshop slidesDocker, Inc.
 
Jenkins multibranch pipeline workshop sep 2018
Jenkins multibranch pipeline workshop sep 2018Jenkins multibranch pipeline workshop sep 2018
Jenkins multibranch pipeline workshop sep 2018Oleksandr Metelytsia
 
Can you convert this code into a C++ code.pdf
Can you convert this code into a C++ code.pdfCan you convert this code into a C++ code.pdf
Can you convert this code into a C++ code.pdfFORTUNE2505
 
Clean code via dependency injection + guice
Clean code via dependency injection + guiceClean code via dependency injection + guice
Clean code via dependency injection + guiceJordi Gerona
 
Symfony 4 Workshop - Limenius
Symfony 4 Workshop - LimeniusSymfony 4 Workshop - Limenius
Symfony 4 Workshop - LimeniusIgnacio Martín
 
Wordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccionWordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccionSysdig
 
How to create your own hack environment
How to create your own hack environmentHow to create your own hack environment
How to create your own hack environmentSumedt Jitpukdebodin
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpdayStephan Hochdörfer
 
Introduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopIntroduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopMark Rackley
 
Docker Introductory workshop
Docker Introductory workshopDocker Introductory workshop
Docker Introductory workshopRuncy Oommen
 
Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)yann_s
 
Docker & Diego - good friends or not? | anynines
Docker & Diego  - good friends or not? | anyninesDocker & Diego  - good friends or not? | anynines
Docker & Diego - good friends or not? | anyninesanynines GmbH
 
Asynchronous Programming at Netflix
Asynchronous Programming at NetflixAsynchronous Programming at Netflix
Asynchronous Programming at NetflixC4Media
 
Into the ZF2 Service Manager
Into the ZF2 Service ManagerInto the ZF2 Service Manager
Into the ZF2 Service ManagerChris Tankersley
 
Learn docker in 90 minutes
Learn docker in 90 minutesLearn docker in 90 minutes
Learn docker in 90 minutesLarry Cai
 

Ähnlich wie Dependency Injection in PHP (20)

Harmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and PuppetHarmonious Development: Via Vagrant and Puppet
Harmonious Development: Via Vagrant and Puppet
 
Simple docker hosting in FIWARE Lab
Simple docker hosting in FIWARE LabSimple docker hosting in FIWARE Lab
Simple docker hosting in FIWARE Lab
 
Docker by Example - Basics
Docker by Example - Basics Docker by Example - Basics
Docker by Example - Basics
 
Docker Security workshop slides
Docker Security workshop slidesDocker Security workshop slides
Docker Security workshop slides
 
Jenkins multibranch pipeline workshop sep 2018
Jenkins multibranch pipeline workshop sep 2018Jenkins multibranch pipeline workshop sep 2018
Jenkins multibranch pipeline workshop sep 2018
 
Can you convert this code into a C++ code.pdf
Can you convert this code into a C++ code.pdfCan you convert this code into a C++ code.pdf
Can you convert this code into a C++ code.pdf
 
Clean code via dependency injection + guice
Clean code via dependency injection + guiceClean code via dependency injection + guice
Clean code via dependency injection + guice
 
Symfony 4 Workshop - Limenius
Symfony 4 Workshop - LimeniusSymfony 4 Workshop - Limenius
Symfony 4 Workshop - Limenius
 
Wordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccionWordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccion
 
Docker by Example - Basics
Docker by Example - Basics Docker by Example - Basics
Docker by Example - Basics
 
How to create your own hack environment
How to create your own hack environmentHow to create your own hack environment
How to create your own hack environment
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpday
 
Introduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopIntroduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint Workshop
 
Docker Introductory workshop
Docker Introductory workshopDocker Introductory workshop
Docker Introductory workshop
 
Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)Structure your Play application with the cake pattern (and test it)
Structure your Play application with the cake pattern (and test it)
 
Docker & Diego - good friends or not? | anynines
Docker & Diego  - good friends or not? | anyninesDocker & Diego  - good friends or not? | anynines
Docker & Diego - good friends or not? | anynines
 
Symfony 2
Symfony 2Symfony 2
Symfony 2
 
Asynchronous Programming at Netflix
Asynchronous Programming at NetflixAsynchronous Programming at Netflix
Asynchronous Programming at Netflix
 
Into the ZF2 Service Manager
Into the ZF2 Service ManagerInto the ZF2 Service Manager
Into the ZF2 Service Manager
 
Learn docker in 90 minutes
Learn docker in 90 minutesLearn docker in 90 minutes
Learn docker in 90 minutes
 

Mehr von Kacper Gunia

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemKacper Gunia
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedKacper Gunia
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingKacper Gunia
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD dieKacper Gunia
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Kacper Gunia
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolKacper Gunia
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupKacper Gunia
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needKacper Gunia
 

Mehr von Kacper Gunia (10)

How a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty systemHow a large corporation used Domain-Driven Design to replace a loyalty system
How a large corporation used Domain-Driven Design to replace a loyalty system
 
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learnedRebuilding Legacy Apps with Domain-Driven Design - Lessons learned
Rebuilding Legacy Apps with Domain-Driven Design - Lessons learned
 
The top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doingThe top 10 things that any pro PHP developer should be doing
The top 10 things that any pro PHP developer should be doing
 
Embrace Events and let CRUD die
Embrace Events and let CRUD dieEmbrace Events and let CRUD die
Embrace Events and let CRUD die
 
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
Domain-driven Design in PHP and Symfony - Drupal Camp Wroclaw!
 
OmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ toolOmniFocus - the #1 ‘Getting Things Done’ tool
OmniFocus - the #1 ‘Getting Things Done’ tool
 
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK MeetupScaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
Scaling Symfony2 apps with RabbitMQ - Symfony UK Meetup
 
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you needDutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
 
Code Dojo
Code DojoCode Dojo
Code Dojo
 
SpecBDD in PHP
SpecBDD in PHPSpecBDD in PHP
SpecBDD in PHP
 

Kürzlich hochgeladen

AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesDavid Newbury
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?IES VE
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UbiTrack UK
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfDaniel Santiago Silva Capera
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
VoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXVoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXTarek Kalaji
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Commit University
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 

Kürzlich hochgeladen (20)

AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
201610817 - edge part1
201610817 - edge part1201610817 - edge part1
201610817 - edge part1
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
UWB Technology for Enhanced Indoor and Outdoor Positioning in Physiological M...
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
VoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXVoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBX
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 

Dependency Injection in PHP