2Housekeeping…• Me Sr. Web Architect Manager at NOOK Developer Open Source Contributor Where you can find me:• Twitter: mwillbanks G+: Mike Willbanks• IRC (freenode): mwillbanks Blog: http://blog.digitalstruct.com• GitHub: https://github.com/mwillbanks
3Agenda• Background• ZF2 Service Components• Writing a Service Component• Incorporating your Service Component
Service Component OverviewGoals, Lifecycle, and more.
11RFC March 2012 “RFC Service Components”Removal of ZF2 ZendService namespace into a separate namespace(ZendService) and under their own GitHub project.
Goals of ZF2 Service Components• Ability to version separately from core framework• Easier to leverage outside of a ZF context• Encourage service providers to further contribute
Services for Contribution (Official Services)• Independently versioned• Dependencies on framework versions (2.*, 2.0.*, 2.0.1)• Maintain dependencies by specific packages• Must follow ZF coding standards• Must be unique A service that does the same thing should not already exist!
14Discuss onContributor MailingListCR Team Review Fork RepoBuild ComponentIRC Vote(MeetingAgenda)Publish!The Service Component Lifecycle
15Published ZendService PackagesA published package for ZendService components exist onpackages.zendframework.com.
Service Component Maintenance• Must be maintained for the duration of major versions Exceptions must be noted in the ChangeLog Component should only state dependency on minor versions• Maintainers must attempt at all times to keep compatibilitywith the latest version If unable to maintain, actively recruit, if still unable ZF or CR teamwill make a recommendation on the component.
Writing a Service ComponentBy example of ZendServiceGoogleGcm
General Information• Service Components are really just like framework libraries However, the namespace implies 3rd party integrations. They are also organized like the framework.• Service Components should be reusable for otherdevelopers Write it out based on the API and not just what you need.• Create reasonable dependencies ZendHttp and ZendStdlib being most common.
Why Not Modules?• Modules are more specifically for ZF2 Applications• Service Components are reusable libraries for any codebase.• Base Rule If it involves the MVC; it should more than likely be a module.
21Starting off…The file structure of a Service Component.
23Composer StubMain information for your specific library.
24Composer StubEnsure you handle dependencies.
Unit Testing• Quick Start Clone an existing Service Component (Currently no skeleton) Copy over files from the tests directory: _autoload.php,Bootstrap.php, phpunit.xml.dist, TestConfiguration.php.dist,TestConfiguration.php.travis• You will need to customize phpunit.xml.dist – Change out the unit test name. TestConfiguration.php.dist – Configure your constants andconfiguration.
Unit Testing• Tests should contain proper name spacing ZendServiceTestGoogleGcm• Files you need should be located in an _files directoryinside the test area of your component tests/ZendService/Google/Gcm/_files• Write unit tests like normal!
Library Code!• The guts of the library is what most of us are familiar with• Write your library inside of your compliant directory library/ZendService/Google/Gcm• Ensure proper namespacing ZendServiceGoogleGcm• Attempt to follow great naming so that it makes sense!
Coding Standards• Remember to make use of the coding standards! Docblocks Import the proper packages from their respective namespaces Read the coding standards doc:• http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards• Mainly; PSR-0, PSR-1, PSR-2 (there are slight differences)
Best Practices• Follow conventions PSR-0/1/2, file locations, options classes• Hard dependencies Use the constructor! Only set dependencies for items you require!• Write Tests Hook into Travis-CI, go for 100% code coverage• Discoverability Put the component on Packagist, submit it for inclusion toZendService.
Documentation• The most dreaded part of the job…• All of the documentation is in the “zf2-documentation”project under the “zendframework” github organization. This will likely change for services in the future.• Fork the project• Create a feature branch: feature/service-google-gcm• Write your documentation• Submit a PR
31Documentation is built out of reStructuredTextYes, Docbook has gone away; so fear not!
32Language FilesAlways start with English first aka “en” as it is the default in the eventa translation is missing.
33Modify docs/language/en/index.rst to add in your new serviceHaving a table of contents is a good thing!
34Modify docs/language/en/index.rst to add in your new serviceFollow the convention!
35Write Away!docs/language/en/modules/zendservice.google.gcm.rst or the like
36Seeing your Documentation• Install the proper tools apt-get install python-setuptools python-pygments easy_install -U Sphinx• Enter the docs/ directory• Run: make html
37Your documentation will now be in:docs/_build/htmlReview for errors before sending the PR
Integrating your ServiceAdd the module to the composer configurationAdd in potential configurationSetup the service managerFetch it inside of a controller
39Add to your composer.json!Followed by “php composer.phar install”
40Handling ConfigurationLikely in /path/to/zf2app/config/autoload/local.php
41Service Manager SetupCreating a simple factory to get a configured Client.
42Leveraging your Service Factory in a ControllerWe can easily fetch it now when we have a ServiceLocator.
Questions?These slides will be posted to SlideShare & SpeakerDeck. SpeakerDeck: http://speakerdeck.com/u/mwillbanks Slideshare: http://www.slideshare.net/mwillbanks Twitter: mwillbanks G+: Mike Willbanks IRC (freenode): mwillbanks Blog: http://blog.digitalstruct.com GitHub: https://github.com/mwillbanks