SlideShare a Scribd company logo
1 of 44
Download to read offline
Into the ZF2 Service
Manager
Chris	
  Tankersley	
  
ZendCon	
  2015	
  
ZendCon	
  2015	
   1	
  
Who Am I
•  PHP	
  Programmer	
  for	
  over	
  10	
  years	
  
•  Been	
  using	
  ZF	
  since	
  ~0.5	
  
•  Daily	
  ZF2	
  user	
  
•  hBps://github.com/dragonmantank	
  
ZendCon	
  2015	
   2	
  
A running joke…
•  “Symfony2	
  is	
  a	
  PHP	
  script	
  that	
  turns	
  YAML	
  into	
  applicaNons”	
  
•  “Yeah,	
  but	
  Zend	
  Framework	
  2	
  is	
  a	
  PHP	
  script	
  that	
  turns	
  arrays	
  into	
  
applicaNons”	
  
ZendCon	
  2015	
   3	
  
ZendCon	
  2015	
   4	
  
It kind of is…
ZendCon	
  2015	
   5	
  
return	
  [	
  
	
  	
  	
  	
  'service_manager'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  'initializers'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'JobServiceJobServiceAwareInitializer'	
  
	
  	
  	
  	
  	
  	
  	
  	
  ],	
  
	
  	
  	
  	
  	
  	
  	
  	
  'invokables'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'JobProcessorListener'	
  =>	
  'JobProcessorProcessorListener',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'JobServiceAccountListener'	
  =>	
  'JobServiceJobServiceListener’	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  ],	
  
	
  	
  	
  	
  	
  	
  	
  	
  'factories'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'JobService'	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  =>	
  'JobServiceJobServiceFactory',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'JobProcessor'	
  	
  	
  	
  	
  	
  	
  	
  	
  =>	
  'JobProcessorProcessorFactory',	
  
	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  ]	
  
]	
  
Theater Magic
•  When	
  something	
  awesome	
  happens,	
  but	
  it’s	
  really	
  something	
  
mundane	
  controlling	
  it	
  in	
  the	
  background	
  
•  When	
  it	
  looks	
  good	
  from	
  25’	
  
ZendCon	
  2015	
   6	
  
The Service Manager
ZendCon	
  2015	
   7	
  
Service Locator
•  Container	
  for	
  storing	
  objects	
  or	
  condiNons	
  for	
  building	
  an	
  object	
  
•  Mostly	
  it’s	
  used	
  to	
  create	
  objects	
  
•  It	
  does	
  not	
  do	
  automaNc	
  dependency	
  injecNon	
  
•  It	
  is	
  not	
  global	
  (unless	
  you	
  make	
  it	
  global)	
  
ZendCon	
  2015	
   8	
  
What can we store in there?
•  Invokables	
  
•  Factories	
  
•  Abstract	
  Factories	
  
•  Delegators	
  
•  IniNalizers	
  
•  Aliases	
  
ZendCon	
  2015	
   9	
  
Standalone
$serviceManager	
  =	
  new	
  ZendServiceManagerServiceManager();	
  
$serviceManager-­‐>setService(‘MyService’,	
  $myService);	
  
	
  
$serviceManager-­‐>has(‘MyService’);	
  
$service	
  =	
  $serviceManager-­‐>get(‘MyService’);	
  
	
  
ZendCon	
  2015	
   10	
  
Built into ZF2 full-stack applications
•  Anything	
  that	
  is	
  ServiceLocatorAwareInterface	
  can	
  have	
  it	
  injected	
  
•  Controllers	
  are	
  the	
  most	
  common	
  
ZendCon	
  2015	
   11	
  
namespace	
  ApplicationController;	
  
	
  
use	
  ZendMvcControllerAbstractActionController;	
  
	
  
class	
  IndexController	
  extends	
  AbstractActionController	
  {	
  
	
  	
  	
  	
  public	
  function	
  indexAction()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $model	
  =	
  $this-­‐>getServiceLocator()-­‐>get(‘MyModel’);	
  
	
  	
  	
  	
  }	
  
}	
  
Stuff we can get from the Service Manager
ZendCon	
  2015	
   12	
  
Invokables
•  Any	
  sort	
  of	
  object	
  that	
  can	
  be	
  declared	
  with	
  ‘new’	
  and	
  has	
  no	
  
constructor	
  parameters	
  
ZendCon	
  2015	
   13	
  
class	
  MyClass	
  {	
  
	
  	
  	
  	
  public	
  function	
  foo()	
  {	
  ...	
  }	
  
	
  	
  	
  	
  public	
  function	
  bar()	
  {	
  ...	
  }	
  
}	
  
	
  
class	
  SimpleConstructor	
  {	
  
	
  	
  	
  	
  protected	
  $name;	
  
	
  	
  	
  	
  public	
  function	
  __construct()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>name	
  =	
  'baz';	
  
	
  	
  	
  	
  }	
  
}	
  
In ZF2
return	
  [	
  
	
  	
  	
  	
  'service_manager'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  'invokables'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'JobProcessorProcessorListener'	
  =>	
  'JobProcessorProcessorListener',	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'JobServiceAccountListener'	
  =>	
  'JobServiceJobServiceListener'	
  
	
  	
  	
  	
  	
  	
  	
  	
  ],	
  
	
  	
  	
  	
  ]	
  
]	
  
ZendCon	
  2015	
   14	
  
Quick Dependency Injection Tutorial
ZendCon	
  2015	
   15	
  
What is Dependency Injection?
•  InjecNng	
  dependencies	
  into	
  classes,	
  instead	
  of	
  having	
  the	
  class	
  create	
  
it	
  
•  Allows	
  for	
  much	
  easier	
  tesNng	
  
•  Allows	
  for	
  a	
  much	
  easier	
  Nme	
  swapping	
  out	
  code	
  
•  Reduces	
  the	
  coupling	
  that	
  happens	
  between	
  classes	
  
php[tek]	
  2015	
   16	
  
Method Injection
class	
  MapService	
  {	
  
	
  	
  	
  	
  public	
  function	
  getLatLong(GoogleMaps	
  $map,	
  $street,	
  $city,	
  $state)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $map-­‐>getLatLong($street	
  .	
  '	
  '	
  .	
  $city	
  .	
  '	
  '	
  .	
  $state);	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  public	
  function	
  getAddress(GoogleMaps	
  $map,	
  $lat,	
  $long)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $map-­‐>getAddress($lat,	
  $long);	
  
	
  	
  	
  	
  }	
  
}	
  
php[tek]	
  2015	
   17	
  
Constructor Injection
class	
  MapService	
  {	
  
	
  	
  	
  	
  protected	
  $map;	
  
	
  	
  	
  	
  public	
  function	
  __construct(GoogleMaps	
  $map)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>map	
  =	
  $map;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  public	
  function	
  getLatLong($street,	
  $city,	
  $state)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $this	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>map	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  -­‐>getLatLong($street	
  .	
  '	
  '	
  .	
  $city	
  .	
  '	
  '	
  .	
  $state);	
  
	
  	
  	
  	
  }	
  
}	
  
	
  
	
  	
  
php[tek]	
  2015	
   18	
  
Setter Injection
class	
  MapService	
  {	
  
	
  	
  	
  	
  protected	
  $map;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  public	
  function	
  setMap(GoogleMaps	
  $map)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>map	
  =	
  $map;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  public	
  function	
  getMap()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $this-­‐>map;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  public	
  function	
  getLatLong($street,	
  $city,	
  $state)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $this-­‐>getMap()-­‐>getLatLong($street	
  .	
  '	
  '	
  .	
  $city	
  .	
  '	
  '	
  .	
  $state);	
  
	
  	
  	
  	
  }	
  
}	
  
	
  	
  
php[tek]	
  2015	
   19	
  
Back to the show
ZendCon	
  2015	
   20	
  
Factories
•  A	
  Factory	
  is	
  an	
  object/method	
  is	
  that	
  is	
  used	
  to	
  create	
  other	
  objects	
  
•  ZF2	
  Service	
  Manager	
  will	
  call	
  the	
  factory	
  when	
  an	
  object	
  is	
  pulled	
  out	
  
of	
  the	
  Service	
  Manager	
  
ZendCon	
  2015	
   21	
  
Why do we need factories?
Dependencies	
  
ZendCon	
  2015	
   22	
  
In ZF2
ZendCon	
  2015	
   23	
  
return	
  [	
  
	
  	
  	
  	
  'service_manager'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  ’factories'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  'GoogleAdWordsAdWordsUserBuilder'	
  =>	
  'GoogleAdWordsGoogleAdWordsUserBuilderFactory',	
  
	
  	
  	
  	
  	
  	
  	
  	
  ],	
  
	
  	
  	
  	
  ]	
  
]	
  
ZendCon	
  2015	
   24	
  
namespace	
  GoogleAdWords;	
  
	
  
class	
  GoogleAdWordsUserBuilder	
  
{	
  
	
  	
  	
  	
  public	
  function	
  __construct(array	
  $config)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>config	
  =	
  $config;	
  
	
  	
  	
  	
  }	
  
}	
  
	
  
ZendCon	
  2015	
   25	
  
namespace	
  GoogleAdWords;	
  
	
  
use	
  ZendServiceManagerFactoryInterface;	
  
use	
  ZendServiceManagerServiceLocatorInterface;	
  
	
  
class	
  GoogleAdWordsUserBuilderFactory	
  implements	
  FactoryInterface	
  
{	
  
	
  	
  	
  	
  public	
  function	
  createService(ServiceLocatorInterface	
  $service)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $config	
  =	
  $service-­‐>get('Config');	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  new	
  GoogleAdWordsUserBuilder($config[‘google’]);	
  
	
  	
  	
  	
  }	
  
}	
  
	
  
Abstract Factories
•  They	
  are	
  factories,	
  but	
  they	
  allow	
  the	
  creaNon	
  of	
  a	
  broad	
  range	
  of	
  
objects	
  instead	
  of	
  a	
  single	
  object	
  
•  The	
  factory	
  will	
  take	
  addiNonal	
  configuraNon	
  to	
  properly	
  create	
  the	
  
needed	
  object	
  
ZendCon	
  2015	
   26	
  
ZendCon	
  2015	
   27	
  
<?php	
  
	
  
namespace	
  MyProject;	
  
	
  
use	
  ZendDbTableGatewayTableGateway;	
  
use	
  ZendServiceManagerFactoryInterface;	
  
use	
  ZendServiceManagerServiceLocatorInterface;	
  
	
  
class	
  ProjectsTableFactory	
  implements	
  FactoryInterface	
  {	
  
	
  	
  	
  	
  public	
  function	
  createService(ServiceLocatorInterface	
  $serviceLocator)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $adapter	
  =	
  new	
  $serviceLocator-­‐>get('ZendDbAdapterAdapter');	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  new	
  TableGateway('projects',	
  $adapter);	
  
	
  	
  	
  	
  }	
  
}	
  
	
  
class	
  CategoriesTableFactory	
  implements	
  FactoryInterface	
  {	
  
	
  	
  	
  	
  public	
  function	
  createService(ServiceLocatorInterface	
  $serviceLocator)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $adapter	
  =	
  new	
  $serviceLocator-­‐>get('ZendDbAdapterAdapter');	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  new	
  TableGateway('categories',	
  $adapter);	
  
	
  	
  	
  	
  }	
  
}	
  
In ZF2
ZendCon	
  2015	
   28	
  
return	
  [	
  
	
  	
  	
  	
  ’abstract_factories'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  ’MyProjectTableAbstractFactory’	
  
	
  	
  	
  	
  ]	
  
]	
  
ZendCon	
  2015	
   29	
  
<?php	
  
	
  
namespace	
  MyProject;	
  
	
  
use	
  ZendDbTableGatewayTableGateway;	
  
use	
  ZendServiceManagerAbstractFactoryInterface;	
  
use	
  ZendServiceManagerServiceLocatorInterface;	
  
	
  
class	
  TableAbstractFactory	
  implements	
  AbstractFactoryInterface	
  {	
  
	
  	
  	
  	
  public	
  function	
  canCreateServiceWithName(ServiceLocatorInterface	
  $sl,	
  $name,	
  $requestedName)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  preg_match("/Table$/",	
  $requestedName);	
  
	
  	
  	
  	
  }	
  
	
  
	
  	
  	
  	
  public	
  function	
  createServiceWithName(ServiceLocatorInterface	
  $sl,	
  $name,	
  $requestedName)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $adapter	
  =	
  $sl-­‐>get('ZendDbAdapterAdapter');	
  
	
  	
  	
  	
  	
  	
  	
  	
  $tableName	
  =	
  str_replace('Table',	
  '',	
  $requestedName);	
  
	
  	
  	
  	
  	
  	
  	
  	
  $tableName	
  =	
  strtolower($tableName);	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  new	
  TableGateway($tableName,	
  $adapter);	
  
	
  	
  	
  	
  }	
  
}	
  
Initializers
•  Code	
  that	
  needs	
  to	
  run	
  ajer	
  an	
  object	
  is	
  created	
  
•  Really	
  helpful	
  for	
  when	
  lots	
  of	
  objects	
  need	
  addiNonal	
  objects	
  (like	
  
loggers)	
  all	
  across	
  the	
  applicaNon	
  
ZendCon	
  2015	
   30	
  
In ZF2
ZendCon	
  2015	
   31	
  
return	
  [	
  
	
  	
  	
  	
  ’initalizers'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  ’JobServiceJobServiceAwareInitializer’	
  
	
  	
  	
  	
  ]	
  
]	
  
ZendCon	
  2015	
   32	
  
<?php	
  
	
  
namespace	
  JobService;	
  
	
  
use	
  ZendServiceManagerInitializerInterface;	
  
use	
  ZendServiceManagerServiceLocatorAwareInterface;	
  
use	
  ZendServiceManagerServiceLocatorInterface;	
  
	
  
class	
  JobServiceAwareInitializer	
  implements	
  InitializerInterface	
  
{	
  
	
  	
  	
  	
  public	
  function	
  initialize($instance,	
  ServiceLocatorInterface	
  $serviceLocator)	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  (!$instance	
  instanceof	
  JobServiceAwareInterface)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  null;	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  /**	
  @var	
  JobServiceJobService	
  $jobService	
  */	
  
	
  	
  	
  	
  	
  	
  	
  	
  $jobService	
  =	
  $serviceLocator-­‐>get('JobService');	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  $instance-­‐>setJobService($jobService);	
  
	
  	
  	
  	
  }	
  
}	
  
	
  
Delegators
•  They	
  are	
  actually	
  decorators	
  for	
  objects	
  that	
  don’t	
  exist	
  
•  They	
  are	
  like	
  iniNalizers	
  that	
  only	
  run	
  on	
  a	
  specific	
  key	
  
•  Allow	
  your	
  applicaNon	
  to	
  tweak	
  or	
  modify	
  3rd	
  party	
  objects	
  without	
  
having	
  to	
  extend	
  them	
  
ZendCon	
  2015	
   33	
  
In ZF2
ZendCon	
  2015	
   34	
  
return	
  [	
  
	
  	
  	
  	
  ’delgators'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  ’OtherVendorAccountAccountService’	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ‘MyProjectAccountAccountServiceDelegator’,	
  
	
  	
  	
  	
  	
  	
  	
  	
  ]	
  
	
  	
  	
  	
  ]	
  
]	
  
ZendCon	
  2015	
   35	
  
<?php	
  
	
  
namespace	
  MyProject;	
  
	
  
use	
  ZendServiceManagerDelegatorFactoryInterface;	
  
use	
  ZendServiceManagerServiceLocatorInterface;	
  
	
  
class	
  AccountServiceDelegator	
  implements	
  DelegatorFactoryInterface	
  {	
  
	
  	
  	
  	
  public	
  function	
  createDelegatorWithName(ServiceLocatorInterface	
  $sl,	
  $name,	
  $requestedName,	
  
$callback)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $originalService	
  =	
  $callback();	
  
	
  	
  	
  	
  	
  	
  	
  	
  $accountService	
  =	
  new	
  MyProjectAccountAccountService($originalService);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  $accountService;	
  
	
  	
  	
  	
  }	
  
}	
  
Aliases
•  Just	
  another	
  name	
  for	
  some	
  other	
  key	
  in	
  the	
  service	
  manager	
  
ZendCon	
  2015	
   36	
  
In ZF2
ZendCon	
  2015	
   37	
  
return	
  [	
  
	
  	
  	
  	
  ’aliases'	
  =>	
  [	
  
	
  	
  	
  	
  	
  	
  	
  	
  ’MyProjectAccountOldAccountService’	
  =>	
  ‘MyProjectAccountNewAccountService’,	
  
	
  	
  	
  	
  ]	
  
]	
  
Bad Practices
ZendCon	
  2015	
   38	
  
Lots of Initializers
•  IniNalizers	
  run	
  ajer	
  every	
  object	
  is	
  created	
  
•  30	
  iniNalizers	
  *	
  50	
  objects	
  created	
  at	
  runNme	
  =	
  	
  1500	
  invocaNons	
  
•  Look	
  at	
  using	
  Factories	
  instead	
  to	
  inject	
  things	
  into	
  your	
  objects	
  
•  Look	
  at	
  using	
  Delegators	
  
ZendCon	
  2015	
   39	
  
Functions as Factories
•  The	
  Factory	
  system	
  will	
  actually	
  take	
  any	
  invokable	
  thing	
  as	
  a	
  factory	
  
•  That	
  means	
  you	
  can	
  use	
  closures	
  and	
  anonymous	
  classes	
  
ZendCon	
  2015	
   40	
  
ZendCon	
  2015	
   41	
  
return	
  [	
  
	
  	
  	
  	
  'factories'	
  =>	
  array(	
  
	
  	
  	
  	
  	
  	
  	
  	
  'CategoryService'	
  =>	
  function($sm)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $categoryService	
  =	
  new	
  CategoryService();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $categoryService-­‐>setCategoryTable($sm-­‐>get('CategoryTable'));	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  $categoryService;	
  
	
  	
  	
  	
  	
  	
  	
  	
  },	
  
	
  	
  	
  	
  	
  	
  	
  	
  'CategoryTable'	
  =>	
  function($sm)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $tableGateway	
  =	
  $sm-­‐>get('CategoryTableGateway');	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $table	
  =	
  new	
  CategoryTable($tableGateway);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  $table;	
  
	
  	
  	
  	
  	
  	
  	
  	
  },	
  
	
  	
  	
  	
  	
  	
  	
  	
  'CategoryTableGateway'	
  =>	
  function($sm)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $dbAdapter	
  =	
  $sm-­‐>get('ZendDbAdapterAdapter');	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $resultSetPrototype	
  =	
  new	
  ResultSet();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $resultSetPrototype-­‐>setArrayObjectPrototype(new	
  Category());	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  new	
  TableGateway('category',	
  $dbAdapter,	
  null,	
  $resultSetPrototype);	
  
	
  	
  	
  	
  	
  	
  	
  	
  },	
  
]	
  
Functions as Factories
•  This	
  makes	
  the	
  config	
  uncachable,	
  so	
  there	
  are	
  performance	
  issues	
  
ZendCon	
  2015	
   42	
  
Questions?
ZendCon	
  2015	
   43	
  
Thank You!
hBp://ctankersley.com	
  
chris@ctankersley.com	
  
@dragonmantank	
  
	
  
hBp://joind.in/talk/view/15534	
  
ZendCon	
  2015	
   44	
  

More Related Content

What's hot

Bootstrap your Cloud Infrastructure using puppet and hashicorp stack
Bootstrap your Cloud Infrastructure using puppet and hashicorp stackBootstrap your Cloud Infrastructure using puppet and hashicorp stack
Bootstrap your Cloud Infrastructure using puppet and hashicorp stack
Bram Vogelaar
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Paulo Ragonha
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Tatsuhiko Miyagawa
 

What's hot (20)

Information security programming in ruby
Information security programming in rubyInformation security programming in ruby
Information security programming in ruby
 
Autoscaling with hashi_corp_nomad
Autoscaling with hashi_corp_nomadAutoscaling with hashi_corp_nomad
Autoscaling with hashi_corp_nomad
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stack
 
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
 
Practical Testing of Ruby Core
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby Core
 
Introduction to Flask Micro Framework
Introduction to Flask Micro FrameworkIntroduction to Flask Micro Framework
Introduction to Flask Micro Framework
 
Practical PHP 5.3
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3
 
Plack - LPW 2009
Plack - LPW 2009Plack - LPW 2009
Plack - LPW 2009
 
RxSwift to Combine
RxSwift to CombineRxSwift to Combine
RxSwift to Combine
 
Bootstrap your Cloud Infrastructure using puppet and hashicorp stack
Bootstrap your Cloud Infrastructure using puppet and hashicorp stackBootstrap your Cloud Infrastructure using puppet and hashicorp stack
Bootstrap your Cloud Infrastructure using puppet and hashicorp stack
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
RxSwift to Combine
RxSwift to CombineRxSwift to Combine
RxSwift to Combine
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
How to do everything with PowerShell
How to do everything with PowerShellHow to do everything with PowerShell
How to do everything with PowerShell
 
Hopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherHopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to another
 
Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with Examples
 
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
HHVM: Efficient and Scalable PHP/Hack Execution / Guilherme Ottoni (Facebook)
 
PowerShell: Automation for everyone
PowerShell: Automation for everyonePowerShell: Automation for everyone
PowerShell: Automation for everyone
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
 

Viewers also liked

Viewers also liked (20)

Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3
 
Alagoas Dev Day
Alagoas Dev DayAlagoas Dev Day
Alagoas Dev Day
 
Docker para deploy de aplicação
Docker para deploy de aplicaçãoDocker para deploy de aplicação
Docker para deploy de aplicação
 
Blue Green Deployment com Docker
Blue Green Deployment com DockerBlue Green Deployment com Docker
Blue Green Deployment com Docker
 
Da Integração Contínua à Entrega Contínua apenas com ferramentas open-source
Da Integração Contínua à Entrega Contínua apenas com ferramentas open-sourceDa Integração Contínua à Entrega Contínua apenas com ferramentas open-source
Da Integração Contínua à Entrega Contínua apenas com ferramentas open-source
 
Asset management with Zend Framework 2
Asset management with Zend Framework 2Asset management with Zend Framework 2
Asset management with Zend Framework 2
 
Implementing access control with zend framework
Implementing access control with zend frameworkImplementing access control with zend framework
Implementing access control with zend framework
 
Zend Framework 2 - PHPUnit
Zend Framework 2 - PHPUnitZend Framework 2 - PHPUnit
Zend Framework 2 - PHPUnit
 
Error Reporting in ZF2: form messages, custom error pages, logging
Error Reporting in ZF2: form messages, custom error pages, loggingError Reporting in ZF2: form messages, custom error pages, logging
Error Reporting in ZF2: form messages, custom error pages, logging
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)
 
Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2Instant ACLs with Zend Framework 2
Instant ACLs with Zend Framework 2
 
Unit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnitUnit testing PHP apps with PHPUnit
Unit testing PHP apps with PHPUnit
 
Zend Framework 2 : Dependency Injection
Zend Framework 2 : Dependency InjectionZend Framework 2 : Dependency Injection
Zend Framework 2 : Dependency Injection
 
Oito dicas sobre Docker
Oito dicas sobre DockerOito dicas sobre Docker
Oito dicas sobre Docker
 
DevOps utilizando Docker
DevOps utilizando DockerDevOps utilizando Docker
DevOps utilizando Docker
 
DevOps II - Ambientes padronizados e Monitoramento da Aplicação | Monografia II
DevOps II - Ambientes padronizados e Monitoramento da Aplicação | Monografia IIDevOps II - Ambientes padronizados e Monitoramento da Aplicação | Monografia II
DevOps II - Ambientes padronizados e Monitoramento da Aplicação | Monografia II
 
PHPUnit best practices presentation
PHPUnit best practices presentationPHPUnit best practices presentation
PHPUnit best practices presentation
 
Automatizando a implantação e operação de aplicações conteinerizadas no...
Automatizando a implantação e operação de aplicações conteinerizadas no...Automatizando a implantação e operação de aplicações conteinerizadas no...
Automatizando a implantação e operação de aplicações conteinerizadas no...
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker Containers
 
Clean Unit Test Patterns
Clean Unit Test PatternsClean Unit Test Patterns
Clean Unit Test Patterns
 

Similar to Into the ZF2 Service Manager

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
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
AOE
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpday
Stephan Hochdörfer
 

Similar to Into the ZF2 Service Manager (20)

Zend Framework Foundations
Zend Framework FoundationsZend Framework Foundations
Zend Framework Foundations
 
ZF2 for the ZF1 Developer
ZF2 for the ZF1 DeveloperZF2 for the ZF1 Developer
ZF2 for the ZF1 Developer
 
Complex Sites with Silex
Complex Sites with SilexComplex Sites with Silex
Complex Sites with Silex
 
Zend Framework 2 - Basic Components
Zend Framework 2  - Basic ComponentsZend Framework 2  - Basic Components
Zend Framework 2 - Basic Components
 
Key Insights into Development Design Patterns for Magento 2 - Magento Live UK
Key Insights into Development Design Patterns for Magento 2 - Magento Live UKKey Insights into Development Design Patterns for Magento 2 - Magento Live UK
Key Insights into Development Design Patterns for Magento 2 - Magento Live UK
 
"Angular.js Concepts in Depth" by Aleksandar Simović
"Angular.js Concepts in Depth" by Aleksandar Simović"Angular.js Concepts in Depth" by Aleksandar Simović
"Angular.js Concepts in Depth" by Aleksandar Simović
 
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...
 
Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenches
 
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
 
Quality assurance for php projects with PHPStorm
Quality assurance for php projects with PHPStormQuality assurance for php projects with PHPStorm
Quality assurance for php projects with PHPStorm
 
Hexagonal architecture
Hexagonal architectureHexagonal architecture
Hexagonal architecture
 
Laravel Design Patterns
Laravel Design PatternsLaravel Design Patterns
Laravel Design Patterns
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
 
Performance measurement and tuning
Performance measurement and tuningPerformance measurement and tuning
Performance measurement and tuning
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
ngMess: AngularJS Dependency Injection
ngMess: AngularJS Dependency InjectionngMess: AngularJS Dependency Injection
ngMess: AngularJS Dependency Injection
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpday
 
Introduction to Zend framework
Introduction to Zend framework Introduction to Zend framework
Introduction to Zend framework
 
Nagios Conference 2012 - Dave Josephsen - Stop Being Lazy
Nagios Conference 2012 - Dave Josephsen - Stop Being LazyNagios Conference 2012 - Dave Josephsen - Stop Being Lazy
Nagios Conference 2012 - Dave Josephsen - Stop Being Lazy
 
Getting up & running with zend framework
Getting up & running with zend frameworkGetting up & running with zend framework
Getting up & running with zend framework
 

More from Chris Tankersley

More from Chris Tankersley (20)

Docker is Dead: Long Live Containers
Docker is Dead: Long Live ContainersDocker is Dead: Long Live Containers
Docker is Dead: Long Live Containers
 
Bend time to your will with git
Bend time to your will with gitBend time to your will with git
Bend time to your will with git
 
Using PHP Functions! (Not those functions, Google Cloud Functions)
Using PHP Functions! (Not those functions, Google Cloud Functions)Using PHP Functions! (Not those functions, Google Cloud Functions)
Using PHP Functions! (Not those functions, Google Cloud Functions)
 
Dead Simple APIs with OpenAPI
Dead Simple APIs with OpenAPIDead Simple APIs with OpenAPI
Dead Simple APIs with OpenAPI
 
Killer Docker Workflows for Development
Killer Docker Workflows for DevelopmentKiller Docker Workflows for Development
Killer Docker Workflows for Development
 
You Got Async in my PHP!
You Got Async in my PHP!You Got Async in my PHP!
You Got Async in my PHP!
 
Docker for Developers - PHP Detroit 2018
Docker for Developers - PHP Detroit 2018Docker for Developers - PHP Detroit 2018
Docker for Developers - PHP Detroit 2018
 
Docker for Developers
Docker for DevelopersDocker for Developers
Docker for Developers
 
They are Watching You
They are Watching YouThey are Watching You
They are Watching You
 
BASHing at the CLI - Midwest PHP 2018
BASHing at the CLI - Midwest PHP 2018BASHing at the CLI - Midwest PHP 2018
BASHing at the CLI - Midwest PHP 2018
 
You Were Lied To About Optimization
You Were Lied To About OptimizationYou Were Lied To About Optimization
You Were Lied To About Optimization
 
Docker for PHP Developers - php[world] 2017
Docker for PHP Developers - php[world] 2017Docker for PHP Developers - php[world] 2017
Docker for PHP Developers - php[world] 2017
 
Docker for PHP Developers - Madison PHP 2017
Docker for PHP Developers - Madison PHP 2017Docker for PHP Developers - Madison PHP 2017
Docker for PHP Developers - Madison PHP 2017
 
Docker for Developers - php[tek] 2017
Docker for Developers - php[tek] 2017Docker for Developers - php[tek] 2017
Docker for Developers - php[tek] 2017
 
Why Docker? Dayton PHP, April 2017
Why Docker? Dayton PHP, April 2017Why Docker? Dayton PHP, April 2017
Why Docker? Dayton PHP, April 2017
 
OOP Is More Then Cars and Dogs - Midwest PHP 2017
OOP Is More Then Cars and Dogs - Midwest PHP 2017OOP Is More Then Cars and Dogs - Midwest PHP 2017
OOP Is More Then Cars and Dogs - Midwest PHP 2017
 
From Docker to Production - SunshinePHP 2017
From Docker to Production - SunshinePHP 2017From Docker to Production - SunshinePHP 2017
From Docker to Production - SunshinePHP 2017
 
Docker for Developers - Sunshine PHP
Docker for Developers - Sunshine PHPDocker for Developers - Sunshine PHP
Docker for Developers - Sunshine PHP
 
Coming to Terms with OOP In Drupal - php[world] 2016
Coming to Terms with OOP In Drupal - php[world] 2016Coming to Terms with OOP In Drupal - php[world] 2016
Coming to Terms with OOP In Drupal - php[world] 2016
 
How We Got Here: A Brief History of Open Source
How We Got Here: A Brief History of Open SourceHow We Got Here: A Brief History of Open Source
How We Got Here: A Brief History of Open Source
 

Recently uploaded

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 

Recently uploaded (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 

Into the ZF2 Service Manager

  • 1. Into the ZF2 Service Manager Chris  Tankersley   ZendCon  2015   ZendCon  2015   1  
  • 2. Who Am I •  PHP  Programmer  for  over  10  years   •  Been  using  ZF  since  ~0.5   •  Daily  ZF2  user   •  hBps://github.com/dragonmantank   ZendCon  2015   2  
  • 3. A running joke… •  “Symfony2  is  a  PHP  script  that  turns  YAML  into  applicaNons”   •  “Yeah,  but  Zend  Framework  2  is  a  PHP  script  that  turns  arrays  into   applicaNons”   ZendCon  2015   3  
  • 5. It kind of is… ZendCon  2015   5   return  [          'service_manager'  =>  [                  'initializers'  =>  [                          'JobServiceJobServiceAwareInitializer'                  ],                  'invokables'  =>  [                          'JobProcessorListener'  =>  'JobProcessorProcessorListener',                          'JobServiceAccountListener'  =>  'JobServiceJobServiceListener’                      ],                  'factories'  =>  [                          'JobService'                      =>  'JobServiceJobServiceFactory',                          'JobProcessor'                  =>  'JobProcessorProcessorFactory',                  ]          ]   ]  
  • 6. Theater Magic •  When  something  awesome  happens,  but  it’s  really  something   mundane  controlling  it  in  the  background   •  When  it  looks  good  from  25’   ZendCon  2015   6  
  • 8. Service Locator •  Container  for  storing  objects  or  condiNons  for  building  an  object   •  Mostly  it’s  used  to  create  objects   •  It  does  not  do  automaNc  dependency  injecNon   •  It  is  not  global  (unless  you  make  it  global)   ZendCon  2015   8  
  • 9. What can we store in there? •  Invokables   •  Factories   •  Abstract  Factories   •  Delegators   •  IniNalizers   •  Aliases   ZendCon  2015   9  
  • 10. Standalone $serviceManager  =  new  ZendServiceManagerServiceManager();   $serviceManager-­‐>setService(‘MyService’,  $myService);     $serviceManager-­‐>has(‘MyService’);   $service  =  $serviceManager-­‐>get(‘MyService’);     ZendCon  2015   10  
  • 11. Built into ZF2 full-stack applications •  Anything  that  is  ServiceLocatorAwareInterface  can  have  it  injected   •  Controllers  are  the  most  common   ZendCon  2015   11   namespace  ApplicationController;     use  ZendMvcControllerAbstractActionController;     class  IndexController  extends  AbstractActionController  {          public  function  indexAction()  {                  $model  =  $this-­‐>getServiceLocator()-­‐>get(‘MyModel’);          }   }  
  • 12. Stuff we can get from the Service Manager ZendCon  2015   12  
  • 13. Invokables •  Any  sort  of  object  that  can  be  declared  with  ‘new’  and  has  no   constructor  parameters   ZendCon  2015   13   class  MyClass  {          public  function  foo()  {  ...  }          public  function  bar()  {  ...  }   }     class  SimpleConstructor  {          protected  $name;          public  function  __construct()  {                  $this-­‐>name  =  'baz';          }   }  
  • 14. In ZF2 return  [          'service_manager'  =>  [                  'invokables'  =>  [                          'JobProcessorProcessorListener'  =>  'JobProcessorProcessorListener',                          'JobServiceAccountListener'  =>  'JobServiceJobServiceListener'                  ],          ]   ]   ZendCon  2015   14  
  • 15. Quick Dependency Injection Tutorial ZendCon  2015   15  
  • 16. What is Dependency Injection? •  InjecNng  dependencies  into  classes,  instead  of  having  the  class  create   it   •  Allows  for  much  easier  tesNng   •  Allows  for  a  much  easier  Nme  swapping  out  code   •  Reduces  the  coupling  that  happens  between  classes   php[tek]  2015   16  
  • 17. Method Injection class  MapService  {          public  function  getLatLong(GoogleMaps  $map,  $street,  $city,  $state)  {                  return  $map-­‐>getLatLong($street  .  '  '  .  $city  .  '  '  .  $state);          }                    public  function  getAddress(GoogleMaps  $map,  $lat,  $long)  {                  return  $map-­‐>getAddress($lat,  $long);          }   }   php[tek]  2015   17  
  • 18. Constructor Injection class  MapService  {          protected  $map;          public  function  __construct(GoogleMaps  $map)  {                  $this-­‐>map  =  $map;          }          public  function  getLatLong($street,  $city,  $state)  {                  return  $this                          -­‐>map                          -­‐>getLatLong($street  .  '  '  .  $city  .  '  '  .  $state);          }   }         php[tek]  2015   18  
  • 19. Setter Injection class  MapService  {          protected  $map;                    public  function  setMap(GoogleMaps  $map)  {                  $this-­‐>map  =  $map;          }          public  function  getMap()  {                  return  $this-­‐>map;          }          public  function  getLatLong($street,  $city,  $state)  {                  return  $this-­‐>getMap()-­‐>getLatLong($street  .  '  '  .  $city  .  '  '  .  $state);          }   }       php[tek]  2015   19  
  • 20. Back to the show ZendCon  2015   20  
  • 21. Factories •  A  Factory  is  an  object/method  is  that  is  used  to  create  other  objects   •  ZF2  Service  Manager  will  call  the  factory  when  an  object  is  pulled  out   of  the  Service  Manager   ZendCon  2015   21  
  • 22. Why do we need factories? Dependencies   ZendCon  2015   22  
  • 23. In ZF2 ZendCon  2015   23   return  [          'service_manager'  =>  [                  ’factories'  =>  [                          'GoogleAdWordsAdWordsUserBuilder'  =>  'GoogleAdWordsGoogleAdWordsUserBuilderFactory',                  ],          ]   ]  
  • 24. ZendCon  2015   24   namespace  GoogleAdWords;     class  GoogleAdWordsUserBuilder   {          public  function  __construct(array  $config)  {                  $this-­‐>config  =  $config;          }   }    
  • 25. ZendCon  2015   25   namespace  GoogleAdWords;     use  ZendServiceManagerFactoryInterface;   use  ZendServiceManagerServiceLocatorInterface;     class  GoogleAdWordsUserBuilderFactory  implements  FactoryInterface   {          public  function  createService(ServiceLocatorInterface  $service)          {                  $config  =  $service-­‐>get('Config');                  return  new  GoogleAdWordsUserBuilder($config[‘google’]);          }   }    
  • 26. Abstract Factories •  They  are  factories,  but  they  allow  the  creaNon  of  a  broad  range  of   objects  instead  of  a  single  object   •  The  factory  will  take  addiNonal  configuraNon  to  properly  create  the   needed  object   ZendCon  2015   26  
  • 27. ZendCon  2015   27   <?php     namespace  MyProject;     use  ZendDbTableGatewayTableGateway;   use  ZendServiceManagerFactoryInterface;   use  ZendServiceManagerServiceLocatorInterface;     class  ProjectsTableFactory  implements  FactoryInterface  {          public  function  createService(ServiceLocatorInterface  $serviceLocator)  {                  $adapter  =  new  $serviceLocator-­‐>get('ZendDbAdapterAdapter');                  return  new  TableGateway('projects',  $adapter);          }   }     class  CategoriesTableFactory  implements  FactoryInterface  {          public  function  createService(ServiceLocatorInterface  $serviceLocator)  {                  $adapter  =  new  $serviceLocator-­‐>get('ZendDbAdapterAdapter');                  return  new  TableGateway('categories',  $adapter);          }   }  
  • 28. In ZF2 ZendCon  2015   28   return  [          ’abstract_factories'  =>  [                  ’MyProjectTableAbstractFactory’          ]   ]  
  • 29. ZendCon  2015   29   <?php     namespace  MyProject;     use  ZendDbTableGatewayTableGateway;   use  ZendServiceManagerAbstractFactoryInterface;   use  ZendServiceManagerServiceLocatorInterface;     class  TableAbstractFactory  implements  AbstractFactoryInterface  {          public  function  canCreateServiceWithName(ServiceLocatorInterface  $sl,  $name,  $requestedName)  {                  return  preg_match("/Table$/",  $requestedName);          }            public  function  createServiceWithName(ServiceLocatorInterface  $sl,  $name,  $requestedName)  {                  $adapter  =  $sl-­‐>get('ZendDbAdapterAdapter');                  $tableName  =  str_replace('Table',  '',  $requestedName);                  $tableName  =  strtolower($tableName);                    return  new  TableGateway($tableName,  $adapter);          }   }  
  • 30. Initializers •  Code  that  needs  to  run  ajer  an  object  is  created   •  Really  helpful  for  when  lots  of  objects  need  addiNonal  objects  (like   loggers)  all  across  the  applicaNon   ZendCon  2015   30  
  • 31. In ZF2 ZendCon  2015   31   return  [          ’initalizers'  =>  [                  ’JobServiceJobServiceAwareInitializer’          ]   ]  
  • 32. ZendCon  2015   32   <?php     namespace  JobService;     use  ZendServiceManagerInitializerInterface;   use  ZendServiceManagerServiceLocatorAwareInterface;   use  ZendServiceManagerServiceLocatorInterface;     class  JobServiceAwareInitializer  implements  InitializerInterface   {          public  function  initialize($instance,  ServiceLocatorInterface  $serviceLocator)          {                  if  (!$instance  instanceof  JobServiceAwareInterface)  {                          return  null;                  }                    /**  @var  JobServiceJobService  $jobService  */                  $jobService  =  $serviceLocator-­‐>get('JobService');                    $instance-­‐>setJobService($jobService);          }   }    
  • 33. Delegators •  They  are  actually  decorators  for  objects  that  don’t  exist   •  They  are  like  iniNalizers  that  only  run  on  a  specific  key   •  Allow  your  applicaNon  to  tweak  or  modify  3rd  party  objects  without   having  to  extend  them   ZendCon  2015   33  
  • 34. In ZF2 ZendCon  2015   34   return  [          ’delgators'  =>  [                  ’OtherVendorAccountAccountService’  =>  [                          ‘MyProjectAccountAccountServiceDelegator’,                  ]          ]   ]  
  • 35. ZendCon  2015   35   <?php     namespace  MyProject;     use  ZendServiceManagerDelegatorFactoryInterface;   use  ZendServiceManagerServiceLocatorInterface;     class  AccountServiceDelegator  implements  DelegatorFactoryInterface  {          public  function  createDelegatorWithName(ServiceLocatorInterface  $sl,  $name,  $requestedName,   $callback)  {                  $originalService  =  $callback();                  $accountService  =  new  MyProjectAccountAccountService($originalService);                                    return  $accountService;          }   }  
  • 36. Aliases •  Just  another  name  for  some  other  key  in  the  service  manager   ZendCon  2015   36  
  • 37. In ZF2 ZendCon  2015   37   return  [          ’aliases'  =>  [                  ’MyProjectAccountOldAccountService’  =>  ‘MyProjectAccountNewAccountService’,          ]   ]  
  • 39. Lots of Initializers •  IniNalizers  run  ajer  every  object  is  created   •  30  iniNalizers  *  50  objects  created  at  runNme  =    1500  invocaNons   •  Look  at  using  Factories  instead  to  inject  things  into  your  objects   •  Look  at  using  Delegators   ZendCon  2015   39  
  • 40. Functions as Factories •  The  Factory  system  will  actually  take  any  invokable  thing  as  a  factory   •  That  means  you  can  use  closures  and  anonymous  classes   ZendCon  2015   40  
  • 41. ZendCon  2015   41   return  [          'factories'  =>  array(                  'CategoryService'  =>  function($sm)  {                          $categoryService  =  new  CategoryService();                          $categoryService-­‐>setCategoryTable($sm-­‐>get('CategoryTable'));                          return  $categoryService;                  },                  'CategoryTable'  =>  function($sm)  {                          $tableGateway  =  $sm-­‐>get('CategoryTableGateway');                          $table  =  new  CategoryTable($tableGateway);                          return  $table;                  },                  'CategoryTableGateway'  =>  function($sm)  {                          $dbAdapter  =  $sm-­‐>get('ZendDbAdapterAdapter');                          $resultSetPrototype  =  new  ResultSet();                          $resultSetPrototype-­‐>setArrayObjectPrototype(new  Category());                          return  new  TableGateway('category',  $dbAdapter,  null,  $resultSetPrototype);                  },   ]  
  • 42. Functions as Factories •  This  makes  the  config  uncachable,  so  there  are  performance  issues   ZendCon  2015   42  
  • 44. Thank You! hBp://ctankersley.com   chris@ctankersley.com   @dragonmantank     hBp://joind.in/talk/view/15534   ZendCon  2015   44