我正在使用zend框架工作,我在模块文件夹侧面的模块src文件夹中创建了一个模型,我想将该模型用作服务,我在Module.php配置中调用该模型类但是当我运行应用程序时它向我显示错误ServiceNotFoundException。
Zend\ServiceManager\ServiceManager::createFromInvokable: failed retrieving "authdbservice(alias: AuthDbService)" via invokable class "Authentication\Model\AuthDb"; class does not exist
这是我的module.php文件 class Module实现AutoloaderProviderInterface,
ConfigProviderInterface, ServiceProviderInterface
{
/**
*
* {@inheritDoc}
* @see \Zend\ModuleManager\Feature\AutoloaderProviderInterface::getAutoloaderConfig()
*/
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
/**
*
* {@inheritDoc}
* @see \Zend\ModuleManager\Feature\ConfigProviderInterface::getConfig()
*/
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
/**
*
* {@inheritDoc}
* @see \Zend\ModuleManager\Feature\ServiceProviderInterface::getServiceConfig()
*/
public function getServiceConfig()
{
return array(
'invokables' => array(
'AuthService' => 'Authentication\Service\AuthService',
'AuthDbService' => 'Authentication\DbService\AuthDb',
),
);
}
}
这是我的authDb班级
namespace Authentication\DbService;
use Doctrine\ORM\EntityManager;
use Authentication\Entity\User;
use Authentication\Form\RegisterForm;
class AuthDb {
protected $em;
protected function getEntityManger() {
if (null === $this->em) {
$this->em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
}
return $this->em;
}
public function submitNewUser() {
$form = new RegisterForm();
$form->get('submit')->setValue('Register');
$request = $this->getRequest();
if ($request->isPost()) {
$user = new User();
$form->setInputFilter($user->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$user->exchangeArray($form->getData());
$user->__set('password', md5($user->__get('password')));
$this->getEntityManager()->persist($user);
$this->getEntityManager()->flush();
return $this->redirect()->toRoute('auth', array('action' => 'login'));
} else {
return array('form' => $form, 'messages' => $form->getMessages());
}
}
}
}
我的目录和文件结构是
./Authentication
./Authentication/autoload_classmap.php
./Authentication/Module.php
./Authentication/view
./Authentication/view/authentication
./Authentication/view/authentication/auth
./Authentication/view/authentication/auth/register.phtml
./Authentication/view/authentication/auth/login.phtml
./Authentication/config
./Authentication/config/module.config.php
./Authentication/src
./Authentication/src/Authentication
./Authentication/src/Authentication/Service
./Authentication/src/Authentication/Service/AuthService.php
./Authentication/src/Authentication/Controller
./Authentication/src/Authentication/Controller/AuthController.php
./Authentication/src/Authentication/Model
./Authentication/src/Authentication/Model/AuthDbService.php
./Authentication/src/Authentication/Entity
./Authentication/src/Authentication/Entity/User.php
./Authentication/src/Authentication/Form
./Authentication/src/Authentication/Form/LoginForm.php
./Authentication/src/Authentication/Form/RegisterForm.php
我认为在这种情况下我会在配置中理解错过 有什么想法解决这个问题吗?
答案 0 :(得分:0)
我刚刚找到了解决方案,我不得不承认这对我来说非常复杂,但现在它变得更容易了,
因为我希望我的数据库模型可以在我的控制器和其他服务中访问,我必须通过使用一些大的设计模式(在这种情况下为工厂)进行一些小的更改。
所以我把AuthDbService.php文件放在Model文件夹中,但它没有正确的名称空间,所以我不得不将命名空间更改为
namespace Authentication\Model
(这是coorect名称空间)
我还将班级名称从AuthDb
更改为AuthDbService
然后我能够在我的其他控制器中使用它。
我将getServiceConfig
功能更改为
public function getServiceConfig()
{
return array(
'invokables' => array(
'AuthService' => 'Authentication\Service\AuthService',
'AuthDbService' => 'Authentication\Model\AuthDbService',
)
);
}
所以现在我可以在我的控制器中使用它,这里就是这个!
我想在AuthService
内使用其他服务(AuthDbService
),这是新问题。因为我无法在AuthService
内使用AuthDbService
。
为什么呢? AuthService
是一个只能从Zend ServiceManager访问的服务,为此,我需要访问AuthDbService类中的ServiceManager,只要它不是模型而不是控制器而且它没有扩展从AbstractActionController
开始,技术上我无法访问ServiceManager来注入AuthService
。
所以我必须首先在我的ServiceModel(AuthDbService
)中注入ServiceManager,为此我必须再次在Module.php getServiceConfig
函数内进行一些更改。
但在此之前,我在AuthDbService
类
protected $serviceLocator;
/**
* serviceLocator Setter
* @param ServiceLocatorInterface $serviceLocator
* @author Ehsan Aghaei
*/
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->serviceLocator = $serviceLocator;
}
/**
* serviceLocator Getter
* @return \Authentication\Model\Service\unknown
* @author Ehsan Aghaei
*/
protected function getServiceLocator()
{
return $this->serviceLocator;
}
我只是让setter和getter在这个类中注入ServiceManger对象。
之后,我对getServiceConfig
进行了以下
public function getServiceConfig()
{
return array(
'invokables' => array(
'AuthService' => 'Authentication\Service\AuthService',
),
'factories' => array(
'AuthDbService' => function ($sm) {
$authService = new AuthDbService();
$authService->setServiceLocator($sm);
return $authService;
}
),
);
}
现在我可以访问服务管理器,从服务管理器我可以访问其他服务。 这就是我解决问题的方法。 我希望它可以帮到像我这样的人。 ;)