<commit_before><?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.application.theory-of-operation">
    <title>Теоретические основы работы с Zend_Application</title>

    <para>
        Получение сконфигурированного <acronym>MVC</acronym>-приложения,
        готового к обработке запроса,
        требует наличия дополнительного кода, объем которого зависит от
        используемого функционала:
        установка соединения с базой данных, конфигурирование видов и
        их помощников, конфигурирование макетов (layouts), регистрация плагинов,
        регистрация помощников действий и так далее.
    </para>

    <para>
        Кроме того, вы можете захотеть повторно использовать один и тот же код
        для загрузки тестов, сервисных скриптов, скриптов, предназначенных
        для запуска через крон.
        Можно просто добавлять свой скрипт загрузки, но часто встречаются
        инициализации, зависящие от окружения - например, для
        запуска через крон <acronym>MVC</acronym> может быть лишним, а для
        сервисного скрипта может быть достаточно только слоя баз данных.
    </para>

    <para>
        <classname>Zend_Application</classname> облегчает управление начальной
        загрузкой и способствует повторному использованию путем инкапсуляции
        загрузки в соответствии с парадигмой <acronym>ООП</acronym>.
    </para>

    <para>
        <classname>Zend_Application</classname> состоит из трех областей:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                <classname>Zend_Application</classname>: загружает окружение
                <acronym>PHP</acronym>, включая include_paths и автозагрузку
                (autoloading), инстанцирует запрошенный загрузочный класс.
            </para>
        </listitem>
        <listitem>
            <para>
                <classname>Zend_Application_Bootstrap</classname>: предоставляет
                интерфейсы для загрузочных классов.
                <classname>Zend_Application_Bootstrap_Bootstrap</classname>
                предоставляет общий функционал, удовлетворяющий большинство
                нужд по начальной загрузке, включающие в себя алгоритмы проверки
                зависимостей и возможность загрузки ресурсов по требованию.
            </para>
        </listitem>
        <listitem>
            <para>
                <classname>Zend_Application_Resource</classname> предоставляет
                интерфейс для стандартных ресурсов загрузки,
                которые могут быть загружены по требованию через экземпляр
                загрузочного класса, и несколько реализаций ресурсов,
                используемых по умолчанию.
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Разработчики могут создавать загрузочный класс для приложения,
        расширяя <classname>Zend_Application_Bootstrap_Bootstrap</classname>
        или, как минимум, реализуя интерфейс
        <classname>Zend_Application_Bootstrap_Bootstrapper</classname>.
        Входная точка (например, <filename>public/index.php</filename>)
        будет загружать <classname>Zend_Application</classname> и
        инстанцировать его путем передачи:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                Текущего окружения
            </para>
        </listitem>
        <listitem>
            <para>
                Опций для загрузки
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Опции загрузки включают в себя путь к файлу, содержащему в себе
        загрузочный класс и, опционально:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                Любые дополнительные пути для добавления в include_path
            </para>
        </listitem>
        <listitem>
            <para>
                Любые дополнительные пространства имен автозагрузки,
                которые требуется зарегистрировать
            </para>
        </listitem>
        <listitem>
            <para>
                Любые установки <filename>php.ini</filename> для инициализации
            </para>
        </listitem>
        <listitem>
            <para>
                Имя класса загрузки (если используется имя, отличное от
                "Bootstrap")
            </para>
        </listitem>
        <listitem>
            <para>
                Пары префикс-путь для ресурсов
            </para>
        </listitem>
        <listitem>
            <para>
                Любые ресурсы для использования (указываются через имя класса
                или их короткое имя)
            </para>
        </listitem>
        <listitem>
            <para>
                Дополнительный путь к загружаемому конфигурационному файлу
            </para>
        </listitem>
        <listitem>
            <para>
                Дополнительные опции конфигурации
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Опции могут быть массивом, объектом <classname>Zend_Config</classname>
        или путью к конфигурационному файлу.
    </para>

    <sect2 id="zend.application.theory-of-operation.bootstrap">
        <title>Начальная загрузка</title>

        <para>
            Второй областью отвественности компоненты
            <classname>Zend_Application</classname> является
            выполнение загрузки приложения. Загрузочные классы
            должны как минимум реализовывать интерфейс
            <classname>Zend_Application_Bootstrap_Bootstrapper</classname>,
            который определяет следующий <acronym>API</acronym>:
        </para>

        <programlisting language="php"><![CDATA[
interface Zend_Application_Bootstrap_Bootstrapper
{
    public function __construct($application);
    public function setOptions(array $options);
    public function getApplication();
    public function getEnvironment();
    public function getClassResources();
    public function getClassResourceNames();
    public function bootstrap($resource = null);
    public function run();
}
]]></programlisting>

        <para>
            Этот API позволяет классу загрузки принимать окружение
            и конфигурацию из объекта приложения, определять ресурсы,
            за загрузку которых он отвечает, выполнять загрузку и запуск
            приложения.
        </para>

        <para>
            Вы можете сами реализовывать этот интерфейс, расширять
            <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
            или использовать
            <classname>Zend_Application_Bootstrap_Bootstrap</classname>.
        </para>

        <para>
            Кроме этого функционала есть и другие требующие внимания области,
            с котрыми вы должны ознакомиться.
        </para>

        <sect3 id="zend.application.theory-of-operation.bootstrap.resource-methods">
            <title>Методы ресурсов</title>

            <para>
                <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
                предоставляет простое соглашение для определения
                методов ресурсов. Любой защищенный метод с именем,
                начинающимся с <emphasis>_init</emphasis>, будет считаться
                методом ресурса.
            </para>

            <para>
                Для того, чтобы запустить один метод ресурса, вызывайте
                метод <methodname>bootstrap()</methodname> с именем ресурса в
                качестве аргумента. Именем ресурса будет имя метода без префикса
                <emphasis>_init</emphasis>.
            </para>

            <para>
                Для того, чтобы запустить несколько методов ресурсов,
                передавайте массив имен. А для того, чтобы запустить
                все методы ресурсов, вызывайте метод без аргументов.
            </para>

            <para>
                Возьмем следующий загрузочный класс:
            </para><commit_msg>[DOCUMENTATION] Russian:  - Fixed typo<commit_after><?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.application.theory-of-operation">
    <title>Теоретические основы работы с Zend_Application</title>

    <para>
        Получение сконфигурированного <acronym>MVC</acronym>-приложения,
        готового к обработке запроса,
        требует наличия дополнительного кода, объем которого зависит от
        используемого функционала:
        установка соединения с базой данных, конфигурирование видов и
        их помощников, конфигурирование макетов (layouts), регистрация плагинов,
        регистрация помощников действий и так далее.
    </para>

    <para>
        Кроме того, вы можете захотеть повторно использовать один и тот же код
        для загрузки тестов, сервисных скриптов, скриптов, предназначенных
        для запуска через крон.
        Можно просто добавлять свой скрипт загрузки, но часто встречаются
        инициализации, зависящие от окружения - например, для
        запуска через крон <acronym>MVC</acronym> может быть лишним, а для
        сервисного скрипта может быть достаточно только слоя баз данных.
    </para>

    <para>
        <classname>Zend_Application</classname> облегчает управление начальной
        загрузкой и способствует повторному использованию путем инкапсуляции
        загрузки в соответствии с парадигмой <acronym>ООП</acronym>.
    </para>

    <para>
        <classname>Zend_Application</classname> состоит из трех областей:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                <classname>Zend_Application</classname>: загружает окружение
                <acronym>PHP</acronym>, включая include_paths и автозагрузку
                (autoloading), инстанцирует запрошенный загрузочный класс.
            </para>
        </listitem>
        <listitem>
            <para>
                <classname>Zend_Application_Bootstrap</classname>: предоставляет
                интерфейсы для загрузочных классов.
                <classname>Zend_Application_Bootstrap_Bootstrap</classname>
                предоставляет общий функционал, удовлетворяющий большинство
                нужд по начальной загрузке, включающие в себя алгоритмы проверки
                зависимостей и возможность загрузки ресурсов по требованию.
            </para>
        </listitem>
        <listitem>
            <para>
                <classname>Zend_Application_Resource</classname> предоставляет
                интерфейс для стандартных ресурсов загрузки,
                которые могут быть загружены по требованию через экземпляр
                загрузочного класса, и несколько реализаций ресурсов,
                используемых по умолчанию.
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Разработчики могут создавать загрузочный класс для приложения,
        расширяя <classname>Zend_Application_Bootstrap_Bootstrap</classname>
        или, как минимум, реализуя интерфейс
        <classname>Zend_Application_Bootstrap_Bootstrapper</classname>.
        Входная точка (например, <filename>public/index.php</filename>)
        будет загружать <classname>Zend_Application</classname> и
        инстанцировать его путем передачи:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                Текущего окружения
            </para>
        </listitem>
        <listitem>
            <para>
                Опций для загрузки
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Опции загрузки включают в себя путь к файлу, содержащему в себе
        загрузочный класс и, опционально:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                Любые дополнительные пути для добавления в include_path
            </para>
        </listitem>
        <listitem>
            <para>
                Любые дополнительные пространства имен автозагрузки,
                которые требуется зарегистрировать
            </para>
        </listitem>
        <listitem>
            <para>
                Любые установки <filename>php.ini</filename> для инициализации
            </para>
        </listitem>
        <listitem>
            <para>
                Имя класса загрузки (если используется имя, отличное от
                "Bootstrap")
            </para>
        </listitem>
        <listitem>
            <para>
                Пары префикс-путь для ресурсов
            </para>
        </listitem>
        <listitem>
            <para>
                Любые ресурсы для использования (указываются через имя класса
                или их короткое имя)
            </para>
        </listitem>
        <listitem>
            <para>
                Дополнительный путь к загружаемому конфигурационному файлу
            </para>
        </listitem>
        <listitem>
            <para>
                Дополнительные опции конфигурации
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Опции могут быть массивом, объектом <classname>Zend_Config</classname>
        или путью к конфигурационному файлу.
    </para>

    <sect2 id="zend.application.theory-of-operation.bootstrap">
        <title>Начальная загрузка</title>

        <para>
            Второй областью отвественности компоненты
            <classname>Zend_Application</classname> является
            выполнение загрузки приложения. Загрузочные классы
            должны как минимум реализовывать интерфейс
            <classname>Zend_Application_Bootstrap_Bootstrapper</classname>,
            который определяет следующий <acronym>API</acronym>:
        </para>

        <programlisting language="php"><![CDATA[
interface Zend_Application_Bootstrap_Bootstrapper
{
    public function __construct($application);
    public function setOptions(array $options);
    public function getApplication();
    public function getEnvironment();
    public function getClassResources();
    public function getClassResourceNames();
    public function bootstrap($resource = null);
    public function run();
}
]]></programlisting>

        <para>
            Этот API позволяет классу загрузки принимать окружение
            и конфигурацию из объекта приложения, определять ресурсы,
            за загрузку которых он отвечает, выполнять загрузку и запуск
            приложения.
        </para>

        <para>
            Вы можете сами реализовывать этот интерфейс, расширять
            <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
            или использовать
            <classname>Zend_Application_Bootstrap_Bootstrap</classname>.
        </para>

        <para>
            Кроме этого функционала есть и другие требующие внимания области,
            с которыми вы должны ознакомиться.
        </para>

        <sect3 id="zend.application.theory-of-operation.bootstrap.resource-methods">
            <title>Методы ресурсов</title>

            <para>
                <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
                предоставляет простое соглашение для определения
                методов ресурсов. Любой защищенный метод с именем,
                начинающимся с <emphasis>_init</emphasis>, будет считаться
                методом ресурса.
            </para>

            <para>
                Для того, чтобы запустить один метод ресурса, вызывайте
                метод <methodname>bootstrap()</methodname> с именем ресурса в
                качестве аргумента. Именем ресурса будет имя метода без префикса
                <emphasis>_init</emphasis>.
            </para>

            <para>
                Для того, чтобы запустить несколько методов ресурсов,
                передавайте массив имен. А для того, чтобы запустить
                все методы ресурсов, вызывайте метод без аргументов.
            </para>

            <para>
                Возьмем следующий загрузочный класс:
            </para>
{'fraction_non_alphanumeric': 0.06973816717019134, 'fraction_numerical': 0.0007552870090634441, 'mean_word_length': 2.0293612964728314, 'pattern_counts': {'":': 0, '<': 307, '<?xml version=': 2, '>': 307, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3438773', 'n_tokens_mistral': 5149, 'n_tokens_neox': 5740, 'n_words': 1146}