簡體   English   中英

在Zend Framework 2模型中訪問MySQL數據庫的最簡單方法

[英]Easiest way to access MySQL Database in Zend Framework 2 Models

我對ZF2中的工作原理有點困惑。 我需要我的模型文件來訪問數據庫,運行查詢並將結果返回給控制器。

所以,我這樣配置:

/config/autoload/global.php

return array(
'db' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=zf2tutorial;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
),
'service_manager' => array(
    'factories' => array(
        'Zend\Db\Adapter\Adapter'
                => 'Zend\Db\Adapter\AdapterServiceFactory',
    ),
    'aliases' => array(
        'db' => 'Zend\Db\Adapter\Adapter',
    ),
),

);

/config/autoload/local.php

return array(
    'db' => array(
        'username' => 'YOUR USERNAME HERE',
        'password' => 'YOUR PASSWORD HERE',
    ),
);

/module/MyModule/src/MyModule/Controller/MyController.php

    //Trying to access the DB service in controller.
    $db = $this->getServiceLocator()->get('db');

我想我能夠在控制器中訪問它,但是當我嘗試在MyModel.php文件中找到它時,它會失敗。

/module/MyModule/src/MyModule/Model/MyModel.php

   //Trying to access the DB service in Model -> Results in FATAL error. ServiceLocator not found.
    $db = $this->getServiceLocator()->get('db');

什么是模塊中所有模型和控制器訪問數據庫的最佳和最簡單的方法?

謝謝

您可以使用$this->getServiceManager() ;從控制器內的服務管理器訪問任何服務。 提供控制器類擴展Zend\\Mvc\\Controller\\AbstractActionController

例如

class FooController extends AbstractActionController {
  public function barAction() {
    $serviceManager = $this->getServiceLocator();
  }
}

這工作的原因是AbstractActionController實現了ServiceLocatorAwareInterface (因此具有名為set/getServiceLocator() )。 默認情況下,服務管理器在創建時注入控制器。

為了將服務管理器注入任何其他服務,您還需要遵循類似的過程,但需要手動注入。

首先實現接口

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class MyClass implements ServiceLocatorAwareInterface {

  protected $serviceLocator;      

  public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
    $this->serviceLocator = $serviceLocator; 
  }
  //...
}

然后創建一個工廠來注入它(有幾種方法可以這樣做)

Module.php

public function getServiceConfig() {
   return array(
     'factories' = array(
        'MyClass' => function($serviceManager) {
           $myClass = new MyClass();
           $myclass->setServiceLocator($serviceManager);

           return $myClass;
        }
     ),
   );
}

有幾點需要注意:

  • 將服務管理器注入類中通常是一個壞主意,因為很可能您只需要服務管理器應該提供的其他實例。 在工廠中獲取這些(例如數據庫適配器)然后將它們注入到類中會更有意義。 任何使用適配器的人都會知道它依賴於這些服務而不是服務管理器。

  • 讓“模型”或“實體”知道除了自己的屬性之外的任何東西都被認為是糟糕的設計。 我建議閱讀單一責任原則和已知的設計模式,以便持久保存您的域模型(如對象關系映射器(ORM)或數據映射器模式)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM