— Разработка, структура, конфигурация и интеграция модулей
— Событийная модель для модулей. Управление зависимостями.
— Вопросы распространения, composer, modules.zendframework.com
— Тестирование, Travis-CI
config to work (routes, views) global config: - global things, DI definition, production settings local config: - local, environment dependable (db host)
Zend\Mvc\Controller\AbstractActionController; class IndexController extends AbstractActionController { pirvate $key = ''; public function setApplicationKey($key) { $this->key = $key; } public function getApplicatonKey() { return $key; } public function indexAction() {} }
= $this->invokableClasses[$canonicalName]; $instance = new $invokable(); return $instance; } You have Invokables CONTROLLERS !!! Zend\ServiceManager\AbstractPluginManager
public function setToken($token); } namespace Application\Controller; class IndexController implements TokenInterface { private $token = ''; public function setToken($token) { $this->token = $token; } }
public function getServiceLocator(); // ServiceManager public function plugin($name, $options=null) public function getRequest(); public function getResponse(); }
getList(); abstract public function get($id); abstract public function create($data); abstract public function update($id, $data); abstract public function delete($id); }
works with github (only) + clear environment every run + multiple php version + easy integration and notification + all configuration in one file .travis.yml But only execution limit - 35 min
this.test.assertSelectorHasText(xpath("//table[@class='table table- striped']/tbody/tr[1]/td[4]"), "20"); // wait ajax for 10 seconds this.waitWhileSelector('div[name="cacheGooglePlus"]', function() { this.echo('div[name="cacheGooglePlus"] is no more!'); }, 10); // click the link this.click('a[href="/metric"]'); // phantomjs object access and get base64 resource attr logo = this.evaluate(function() { return __utils__.getBase64(document.querySelector('img.logo').getAttribute('src')); });