Как подключиться к mysql в моей собственной библиотеке ZF? - PullRequest
0 голосов
/ 15 июня 2011

Я создал свою собственную библиотеку с путем: library/Mylib.У меня есть класс в library/Mylib/ с именем Acl.php:

    class Mylib_Acl extends Zend_Acl{
        public $_db;

        public function init(){
            $this->_db = new Zend_Db_Adapter_Pdo_Mysql(
                array(
                    'host' => 'localhost',
                    'username' => 'username',
                    'password' => 'password',
                    'dbname' => 'mydb'
                )
            );
            Zend_Db_Table_Abstract::setDefaultAdapter($this->_db);
        }

public function __construct(){
        self::initRole();

    }

        public function initRole(){
            Zend_Debug::dump($this->_db);
            Zend_Debug::dump(Zend_Registry::get('db'));
            die;
            $sql = 'SELECT * FROM some_table';
                $result = $this->_db->query($sql)->fetchAll();

        }

Zend_Debug::dump($this->_db) дай мне: NULL

Zend_Debug::dump(Zend_Registry::get('db')) дай мне эту ошибку:

Fatal error: Uncaught exception 'Zend_Exception' with message 'No entry is registered for key 'db'' in /home/truong/public_html/test2/library/Zend/Registry.php:147 Stack trace: #0 /home/truong/public_html/test2/library/Fxml/Acl.php(19): Zend_Registry::get('db') #1 /home/truong/public_html/test2/library/Fxml/Acl.php(62): Fxml_Acl->initRole() #2 /home/truong/public_html/test2/application/Bootstrap.php(25): Fxml_Acl->__construct() #3 /home/truong/public_html/test2/library/Zend/Application/Bootstrap/BootstrapAbstract.php(666): Bootstrap->_initAutoload() #4 /home/truong/public_html/test2/library/Zend/Application/Bootstrap/BootstrapAbstract.php(619): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource('autoload') #5 /home/truong/public_html/test2/library/Zend/Application/Bootstrap/BootstrapAbstract.php(583): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap(NULL) #6 /home/truong/public_html/test2/library/Zend/Application.php(355): Zend_Application_Bootstrap_BootstrapAbstract->bootstrap(NULL) #7 /home/truong/pu in /home/truong/public_html/test2/library/Zend/Registry.php on line 147

Я зарегистрировал ключ 'db' в своем приложении / Bootstrap.php:

public function _initDb(){
         $db = new Zend_Db_Adapter_Pdo_Mysql(
            array(
                'host' => 'localhost',
                'username' => 'username',
                'password' => 'password',
                'dbname' => 'mydb'
            )
        );
        Zend_Db_Table_Abstract::setDefaultAdapter($db);

        Zend_Registry::set('db', $db);
    }

И у меня было: autoloaderNamespaces.Mylib = "Mylib_" в application.ini

Что я сделал не так?

1 Ответ

1 голос
/ 15 июня 2011

Здесь есть несколько вопросов:

  • Метод init () в вашем классе Acl никогда не вызывается (по крайней мере, в вашем примере)
  • Метод init () создает другое соединение с базой данных - лучше всего повторно использовать то, которое вы создали в начальной загрузке
  • Вы вызываете initRole () статически, когда это не статический метод

Вы не включили ту часть своего приложения, где вы вызываете класс Acl, что может быть причиной ошибки. Например. если бы вы создавали экземпляр класса в своей начальной загрузке до того, как был настроен ресурс базы данных, это объяснило бы ошибку, которую вы видите.

Вы можете значительно упростить свой класс, изменив его на что-то вроде этого:

class Mylib_Acl extends Zend_Acl{
    public $_db;

    public function __construct(){
        $this->init();
        $this->initRole();
    }

    public function init(){
        $this->_db = Zend_Registry::get('db');
    }

    [etc.]
}

До тех пор, пока метод _initDb () в начальной загрузке запускается перед использованием класса Acl, это должно быть хорошо.

...