zf2 ServiceNotFoundException,如何修复它

时间:2016-02-07 06:12:51

标签: php zend-framework

我正在使用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

我认为在这种情况下我会在配置中理解错过 有什么想法解决这个问题吗?

1 个答案:

答案 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;
                }
            ),
        );
    }

现在我可以访问服务管理器,从服务管理器我可以访问其他服务。 这就是我解决问题的方法。 我希望它可以帮到像我这样的人。 ;)