Как работает Zend-приложение / Bootstrapping? - PullRequest
5 голосов
/ 26 января 2010

Несколько вопросов об основах Zend Framework 1.9.

  1. я следовал руководству по быстрому старту, и в основном, при загрузке используется

    а. из index.php:

    $ZEND_FRAMEWORK_LIB_PATH = '/appl/ZendFramework-1.9.7/library';
    defined('APPLICATION_PATH') || define('APPLICATION_PATH', (realpath(dirname(__FILE__) . '/../application')));
    defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
    set_include_path(implode(PATH_SEPARATOR, array((dirname(dirname(__FILE__)) . '/library'), $ZEND_FRAMEWORK_LIB_PATH, get_include_path(),)));
    require_once 'Zend/Application.php';
    $application = new Zend_Application(APPLICATION_ENV, (APPLICATION_PATH . '/configs/application.ini'));
    $application->bootstrap()->run();
    

    б. Затем в Bootstrap.php у меня есть

    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array("namespace" => "Default_", "basePath" => dirname(__FILE__),));
        return $autoloader;
    }
    
    protected function _initDoctype()
    {
        $this->bootstrap("view");
        $view = $this->getResource("view");
        $view->doctype("XHTML1_STRICT");
    }
    
  2. Для начала несколько вещей, которые я не понимаю:

    а. Если пользователь получает доступ к сайту не через index.php по умолчанию, означает ли это, что начальная загрузка (и действительно, весь код в index.php, включая настройку среды и т. Д., Будет обойден?)

    б. Нет места, где бы явно вызывались методы Bootstrap _initAutoload() или _initDoctype(). Так когда же эти методы вызываются неявно?

    с. Поскольку в index.php я уже "передал" файл конфигурации '/configs/application.ini' в конструктор Zend_Application, есть ли способ получить записи конфигурации в другом месте?

  3. В моем приложении мне приходится работать с разными базами данных (поэтому я не могу просто использовать resources.db.*). Так что в том же файле application.ini у меня есть, например,

    custdb.adapter = "PDO_MYSQL"
    custdb.params.host = "localhost"
    custdb.params.username = "username"
    custdb.params.password = "password"
    custdb.params.dbname = "custdb"
    

    Как лучше всего управлять адаптером БД?

    а. Можно ли (и нужно ли мне) создать адаптер DB в index.php ИЛИ Bootstrap.php и получить его в другом месте, когда это необходимо (и как)?

    б. Или возможно (и я должен просто) получить записи конфигурации в другом месте (как?) И создать экземпляр адаптера БД, как и когда это необходимо?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 26 января 2010

Вот несколько ответов.

2a. Все запросы перенаправляются в index.php. Это делается с помощью mod_rewrite и указывается в файле .htaccess.

2b. Загрузчик вызывает любой метод с префиксом _init. См. Zend Framework - Теория работы

2в. Да. Zend :: Config . Вы можете сохранить экземпляр в Zend::Registry для быстрого доступа. Например:

$config = new Zend_Config((APPLICATION_PATH . '/configs/application.ini')); 
$application = new Zend_Application(APPLICATION_ENV, $config);
Zend_Registry::set('config', $config);

Проверьте ссылку на API, чтобы увидеть конструкторы для этих двух классов.

Не думаю, что Быстрый старт полезен. Я бы порекомендовал получить книгу. Мне понравилась «Разработка веб-приложений Zend Framework 1.8» Кейта Поупа.

2 голосов
/ 26 января 2010

Чтобы ответить на вопрос 3, ZF использует плагин ресурсов приложения Zend_Application_Resource_Db для загрузки конфигурации и создания экземпляра адаптера базы данных.

Если ваша потребность в нескольких базах данных связана с окружающей средой, вы можете легко указать пространство имен вашей БД в файле application.ini.

[production]
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = user
resources.db.params.password = pass
resources.db.params.dbname = production_db

[staging : production]
resources.db.params.dbname = staging_db

[development : production]
resources.db.params.dbname = development_db

В этом примере мы настраиваем общую информацию в разделе [production] и переопределяем ее для наших сред разработки и разработки. Какая конфигурация применяется, определяется переменной окружения в .htaccess

вашего приложения

Если вам нужен доступ к нескольким базам данных в одном приложении, я бы порекомендовал создать собственный плагин Application Resource Plugin и создать некую структуру для хранения нескольких соединений.

Это не так сложно, как может показаться. Читайте об этом здесь и создайте подкласс из Zend_Application_Resource_ResourceAbstract. Используя этот класс, вы можете легко получить resources.* в вашем конфигурационном файле, используя:

$this->getBootstrap()-getResource('mydb')`

После этого у вас будет доступ к вашему плагину через объект начальной загрузки:

$bootstrap->getPluginResource('mydb')

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: я забыл упомянуть, если у вас есть плагин ресурсов как часть вашего application.ini, загрузчик Zend_Application автоматически узнает, как включить его как часть процесса начальной загрузки, так что вам не нужно определять _init() метод в вашем файле начальной загрузки. Это что-то вроде магии.

Кроме того, что касается хранения экземпляра адаптера, я бы, вероятно, просто использовал Zend_Registry.

0 голосов
/ 28 января 2010

спасибо за все ваши ответы! Это действительно помогло мне понять концепцию ZF.

Я также прошел ссылки и исходные коды, чтобы получить более глубокое понимание, и вот что я принял:

В моем application.ini у меня есть:

custom.db.customers.adapter = "PDO_MYSQL"
custom.db.customers.params.host = "localhost"
custom.db.customers.params.username = "username"
custom.db.customers.params.password = "password"
custom.db.customers.params.dbname = "custdb"

Тогда в моем Bootstrap.php у меня есть:

protected function _initCustomDbCustomers()
{
    $config = $this->getOptions();
    $cfgCustom = $config['custom'];
    if (null != $cfgCustom)
    {
        $cfgCustomDb = $cfgCustom['db'];
        if (null != $cfgCustomDb)
        {
            $cfgCustomDbCustomers = $cfgCustom['customers'];
            if (null != $cfgCustomDbCustomers)
            {
                $resrcCustomDbCustomers = new Zend_Application_Resource_Db($cfgCustomDbCustomers);
                return $resrcCustomDbCustomers
            }
        }
    }
}

Конечно, в моем index.php я звоню:

$application->bootstrap();
$application->run();

Затем в контроллере, где мне нужно получить адаптер БД, я делаю:

$bootstrap = $this->getInvokeArg('bootstrap');
$resrcCustomDbCustomers = $bootstrap->getResource('customDbCustomers');
$adpCustomDbCustomers = $resrcCustomDbCustomers->getDbAdapter();
// Do Stuffs With DB Adapter

Это хороший / плохой способ делать вещи? И есть ли какие-нибудь подводные камни, на которые я должен обратить внимание?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...