I tried some ideas from other posts and examples but I still haven't a solution. I can't recieve the servicelocator in my Model.
my Module.php contains the following factory in function getServiceConfig():
'Backend\Model\Beuser' => function($sm){
$serviceLocator = $sm->getServiceLocator();
return new \Backend\Model\Beuser($serviceLocator);
},
my model Beuser.php looks like:
namespace Backend\Model;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Beuser implements ServiceLocatorAwareInterface
{
public $idx_be_user;
public $be_user_email;
public $be_user_password;
public $be_user_firstname;
public $be_user_lastname;
public $be_user_phone;
public $be_user_photo;
public $be_user_shorttext;
protected $inputFilter;
protected $serviceLocator;
public function setServiceLocator(ServiceLocatorInterface $sl)
{
$this->serviceLocator = $sl;
return $this;
}
public function getServiceLocator()
{
return $this->serviceLocator;
}
public function exchangeArray($data)
{
$this->idx_be_user = (!empty($data['idx_be_user'])) ? $data['idx_be_user'] : null;
$this->be_user_email = (!empty($data['be_user_email'])) ? $data['be_user_email'] : null;
$this->be_user_password = (!empty($data['be_user_password'])) ? $data['be_user_password'] : null;
$this->be_user_firstname = (!empty($data['be_user_firstname'])) ? $data['be_user_firstname'] : null;
$this->be_user_lastname = (!empty($data['be_user_lastname'])) ? $data['be_user_lastname'] : null;
$this->be_user_phone = (!empty($data['be_user_phone'])) ? $data['be_user_phone'] : null;
$this->be_user_photo = (!empty($data['be_user_photo'])) ? $data['be_user_photo'] : null;
$this->be_user_shorttext = (!empty($data['be_user_shorttext'])) ? $data['be_user_shorttext'] : null;
}
public function getArrayCopy()
{
return get_object_vars($this);
}
public function setInputFilter(InputFilterInterface $inputFilter)
{
throw new \Exception("Not used");
}
public function getInputFilter()
{
var_dump($this->getServiceLocator());
die();
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$factory = new InputFactory();
$inputFilter->add($factory->createInput(array(
'name' => 'idx_be_user',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'be_user_email',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
/*
array(
'name' => 'Db\NoRecordExists',
'options' => array(
'table' => 'users',
'field' => 'email',
// 'adapter' => $this->getServiceLocator()->get('dbAdapter'),
),
),
*/
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'be_user_password',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 6,
'max' => 100,
),
),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'be_user_firstname',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'be_user_lastname',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'be_user_phone',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
)));
$inputFilter->add(
$factory->createInput(array(
'name' => 'be_user_photo',
'required' => false,
))
);
$inputFilter->add($factory->createInput(array(
'name' => 'be_user_shorttext',
'required' => false,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 5,
'max' => 255,
),
),
),
)));
$this->inputFilter = $inputFilter;
}
return $this->inputFilter;
}
}
But
var_dump($this->getServiceLocator());
returns NULL. Thats the reasion why any call of $this->getServiceLocator()->get('something')
creates an
PHP Fatal error: Call to a member function get()[...]
Could you help me finding the problem?
PS: I also tried following factory:
'Backend\Model\Beuser' => function($sm){
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$beuser = new \Backend\Model\Beuser();
$beuser->setDbAdapter($dbAdapter);
return $beuser;
},
my module.php:
namespace Backend;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\Authentication\Storage;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Adapter\DbTable as AuthAdapter;
use Zend\Authentication\Result as Result;
use Zend\Session\Container; // We need this when using sessions
//Be User
use Backend\Model\Beuser;
use Backend\Model\BeuserTable;
class Module implements AutoloaderProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php'
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
public function getServiceConfig()
{
return array(
//factories
'factories'=>array(
//Storage
'BackendStorage' => function($sm){
return new BackendStorage('backend');
},
//DB Adapter
'dbAdapter' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
return $dbAdapter;
},
//nur DB
'db' => function($sm) {
$dba= $sm->get('dbAdapter');
$db = new db\Db($dba);
return $db;
},
//mache Auth Info verfuegbar
'AuthService' => function($sm) {
//$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$dbTableAuthAdapter = new AuthAdapter($sm->get('dbAdapter'),'tbl_be_user','be_user_email','be_user_password', 'MD5(?)');
//$authService = new AuthenticationService();
$authService = new AuthenticationService(new Storage\Session('Auth_Backend'));
$authService->setAdapter($dbTableAuthAdapter);
return $authService;
},
//Navigation
'NavigationFactory' => 'Backend\Service\NavigationFactory',
// Backend User
'Backend\Model\BeuserTable' => function($sm) {
$tableGateway = $sm->get('BeuserTableGateway');
$table = new BeuserTable($tableGateway);
return $table;
},
'BeuserTableGateway' => function ($sm) {
$dbAdapter = $sm->get('dbAdapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Beuser());
return new TableGateway('tbl_be_user', $dbAdapter, null, $resultSetPrototype);
},
'Backend\Model\Beuser' => function($sm){
$model = new \Backend\Model\Beuser();
$model->setServiceLocator($sm);
return $model;
},
),
);
}
public function getViewHelperConfig()
{
return array(
'invokables' => array(
'PageTitle' => 'Backend\ViewHelper\PageTitle',
),
'factories' => array(
//hasIdentity true or false
'AuthStatusFactory' => function ($serviceManager) {
// Get the service locator
$serviceLocator = $serviceManager->getServiceLocator();
// pass it to your helper
return new \Backend\ViewHelper\AuthStatusFactory($serviceLocator);
},
'BeUserName' => function ($serviceManager) {
// Get the service locator
$serviceLocator = $serviceManager->getServiceLocator();
// pass it to your helper
return new \Backend\ViewHelper\BeUserName($serviceLocator);
},
)
);
}
}
You are passing it in via a none existent constructor...just use the setter. The Service Manager implements ServiceLocatorInterface, just pass it through to your model.
Change your service config:
'Backend\Model\Beuser' => function($sm){
$model = new \Backend\Model\Beuser();
$model->setServiceLocator($sm);
return $model;
},
Example Access in Controller:
public function testAction()
{
// The service manager will then inject itself into your model
// when it is instantiated.
$myModel = $this->getServiceLocator()->get('Backend\Model\Beuser');
// now you have the Service Locator injecte4d into your model ..
//var_dump($myModel->getServiceLocator());
}
You also need to make sure use the Service Locator to get any instances of Models you need created, otherwise nothing will be injected:
'BeuserTableGateway' => function ($sm) {
$dbAdapter = $sm->get('dbAdapter');
$resultSetPrototype = new ResultSet();
// Beuser will not have the service locator injected below..
// and will return null if the object wasn't created via the service manager.
//$resultSetPrototype->setArrayObjectPrototype(clone $sm->get('Backend\Model\Beuser'));
$resultSetPrototype->setArrayObjectPrototype(new Beuser());
return new TableGateway('tbl_be_user', $dbAdapter, null, $resultSetPrototype);
},
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With