I am still struggling in instantiating a service from a ZF2 module outside of Zend Framework (in a blank .php).
I want to achieve:
Instantiate + invoke a ZF2 service method from outside ZF by the use of the ServiceManager and possibly DI.
What I have now: (UPDATED 4/10/2013)
Following up on the comments below I have done more research,particularly:
- The quick guide
http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.quick-start.html - RTD (Databases and models) http:
//zf2.readthedocs.org/en/latest/user-guide/database-and-models.html - Modules presentation (Very helpful) http://www.youtube.com/watch?v=Vp7y65rnN98#t=1200
- Module source on github - https: //github.com/juriansluiman/SlmMail
I've opted to trim out all the DI and ModuleManager things and try to autoload (works fine now) and instantiate (does not) a service.
1 - Autoload the requested classes using a Classmap and instantiate servicemanager in a stand-alone .PHP file
// Autoload ZF and ProductImage module via classmap
Zend\Loader\AutoloaderFactory::factory(array(
'Zend\Loader\StandardAutoloader' => array(
'autoregister_zf' => TRUE,
),
'Zend\Loader\ClassMapAutoloader' => array(
'/home/frequency/domains/scrftcdn/public_html/ft/shop/php/zendframework/module/ProductImage/autoload_classmap.php',
)
)
)
// Hard-coded servicemanager configuration (will come from $module->getConfig once this works)
$smc = new \Zend\ServiceManager\Config(
array(
'service_manager' => array(
'factories' => array(
'ProductImage\Model\ProductImage' => 'ProductImage\Factory\ProductImageFactory',
)
),
)
);
// Instantiate the service manager
$sm = new \Zend\ServiceManager\ServiceManager($smc);
//Load the service via the service manager
$service = $sm->get('ProductImage\Model\ProductImage'); // <throws exception
die();
2 - The exception
[error] [client 192.168.6.52] PHP Fatal error:
Uncaught exception 'Zend\\ServiceManager\\Exception\\ServiceNotFoundException' with message 'Zend\\ServiceManager\\ServiceManager::get was unable to fetch or create an instance for ProductImage\\Model\\ProductImage' in /usr/lib/zendframework/library/Zend/ServiceManager/ServiceManager.php:495
Stack trace:\n#0 /home/frequency/domains/wpfreqad/public_html/wp-content/themes/frequency/manage-product-images/functions.inc.php(48): Zend\\ServiceManager\\ServiceManager->get('ProductImage\\Mo...')
#1 /home/frequency/domains/wpfreqad/public_html/wp-content/themes/frequency/functions.inc.php(14): require_once('/home/frequency...')\n
#2 /home/frequency/domains/wpfreqad/public_html/wp-content/themes/frequency/functions.php(14): require_once('/home/frequency...')\n
#3 /home/frequency/domains/wpfreqad/public_html/wp-settings.php(293): include('/home/frequency...')\n
#4 /home/frequency/domains/wpfreqad/public_html/wp-config.php(90): require_once('/home/frequency...')\n
#5 /home/frequency/domains/wpfreqad/public_html/wp-load.php(29): require_onc in /usr/lib/zendframework/library/Zend/ServiceManager/ServiceManager.php on line 495
3 - ProductImage\autoload_classmap.php
<?php
// Generated by ZF2's ./bin/classmap_generator.php
return array(
'ProductImageTest\Service\ProductImageServiceTest' => __DIR__ . '/test/ProductImageTest/Service/ProductImageServiceTest.php',
'ProductImage\Module' => __DIR__ . '/Module.php',
'ProductImage\Factory\ProductImageFactory' => __DIR__ . '/src/ProductImage/Factory/ProductImageFactory.php',
'ProductImage\Model\ProductImage' => __DIR__ . '/src/ProductImage/Model/ProductImage.php',
);
4 - ProductImage\Module.php
class Module implements \Zend\ModuleManager\Feature\ConfigProviderInterface
{
/* Invoked by Module Manager */
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
}
5 - ProductImage\config\module.config.php
<?php
return array(
'service_manager' => array(
'factories' => array(
'ProductImage\Model\ProductImage' => 'ProductImage\Factory\ProductImageFactory',
),
),
);
I hope that's the right approach and not too far off the right way..
new Zend\Di\Diand expect it to be fully configured. Please read some documentation about ZF2 and use the quick start. Then ask a question about a specific problem. - Jurian Sluiman