Bläddra i källkod

Translation of introduction

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17398 44c647ce-9c0f-0410-b52a-842ac1e357ba
ceriak 16 år sedan
förälder
incheckning
69d5ad56c4

+ 626 - 0
documentation/manual/hu/module_specs/Zend_Application-TheoryOfOperation.xml

@@ -0,0 +1,626 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 17397 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.application.theory-of-operation">
+    <title>Működési elv</title>
+
+    <para>
+        Egy <acronym>MVC</acronym> alkalmazás beállítása és felkészítése az indulásra egyre növekvő
+        mennyiségű kódot igényelt, ahogy egyre több és több lehetőség állt rendelkezésre: beállítani
+        az adatbázist, a nézetet és a nézet segédeket, az elrendezéseket, bejegyezni a
+        bővítményeket, művelet segédeket és a többi.
+    </para>
+
+    <para>
+        Ezen felül gyakoran igény lehet ugyanazon kód használata a tesztek, ütemezett feladatok vagy
+        egy webszolgáltatás rendszertöltéséhez. Miközben lehetséges egyszerűen beilleszteni a
+        rendszertöltő állományt, gyakori, hogy bizonyos beállítások környezetre jellemzők – nem
+        szükséges az <acronym>MVC</acronym> egy ütemezett feladathoz, vagy az adatbázis réteg egy
+        szolgáltatáshoz.
+    </para>
+
+    <para>
+        A <classname>Zend_Application</classname> célja ennek leegyszerűsítése és az újrahasznosítás
+        elősegítése a rendszertöltés <acronym>OOP</acronym> mintákba zárásával.
+    </para>
+
+    <para>
+        A <classname>Zend_Application</classname> három részre bontható:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                <classname>Zend_Application</classname>: betölti a <acronym>PHP</acronym>
+                környezetet, beleértve az include_path-t és az automatikus betöltést, illetve
+                példányosítja a kért rendszertöltő osztályt.
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                <classname>Zend_Application_Bootstrap</classname>: felületeket nyújt a rendszertöltő
+                osztályoknak. A <classname>Zend_Application_Bootstrap_Bootstrap</classname> a
+                legtöbb rendszertöltővel szemben támasztható igényt kielégítő funkcionalitást nyújt,
+                beleértve a függőség-ellenőrző algoritmusokat és a rendszertöltő erőforrások igény
+                szerinti betöltését.
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                A <classname>Zend_Application_Resource</classname> szabványos, egy rendszertöltő
+                példány által igény szerint betölthető erőforrásokhoz nyújt felületet, csakúgy, mint
+                több kész megvalósítást.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        A fejlesztők a <classname>Zend_Application_Bootstrap_Bootstrap</classname> kiterjesztésével
+        vagy (legkevesebb) a <classname>Zend_Application_Bootstrap_Bootstrapper</classname>
+        megvalósításával hozhatnak létre rendszertöltőt alkalmazásukhoz. A belépési pont
+        (<filename>public/index.php</filename>, pl.) betölti és példányosítja a
+        <classname>Zend_Application</classname>-t
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                a pillanatnyi környezet és
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                a rendszertöltés beállításainak
+            </para>
+        </listitem>
+    </itemizedlist>
+    <para>
+        átadásával.
+    </para>
+
+    <para>
+        Utóbbiak magukban foglalják a rendszertöltő osztályt tartalmazó állomány elérési útját,
+        illetve igény szerint:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                további include_path összetevőket;
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                további automatikus betöltéshez bejegyzendő névtereket;
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                beállítandó <filename>php.ini</filename> értékeket;
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                a rendszertöltő osztály nevét (ha nem „Bootstrap”)
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                erőforrás előtagat a az elérési utakhoz;
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                használandó erőforrásokat (az osztály neve vagy rövid név szerint);
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                további elérési utakat konfigurációs állományok betöltéséhez, illetve
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+                további konfigurációs beállításokat.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        A beállítások érkezhetnek egy tömbben, egy <classname>Zend_Config</classname> objektumban
+        vagy egy konfigurációs állomány elérési útja képében.
+    </para>
+
+    <sect2 id="zend.application.theory-of-operation.bootstrap">
+        <title>Bootstrapping</title>
+
+        <para>
+            <classname>Zend_Application</classname>'s second area of responsibility is
+            executing the application bootstrap. Bootstraps minimally need to
+            implement <classname>Zend_Application_Bootstrap_Bootstrapper</classname>,
+            which defines the following <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>
+            This <acronym>API</acronym> allows the bootstrap to accept the environment and
+            configuration from the application object, report the resources its
+            responsible for bootstrapping, and then bootstrap and run the
+            application.
+        </para>
+
+        <para>
+            You can implement this interface on your own, extend
+            <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>, or use
+            <classname>Zend_Application_Bootstrap_Bootstrap</classname>.
+        </para>
+
+        <para>
+            Besides this functionality, there are a number of other areas of
+            concern you should familiarize yourself with.
+        </para>
+
+        <sect3 id="zend.application.theory-of-operation.bootstrap.resource-methods">
+            <title>Resource Methods</title>
+
+            <para>
+                The <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
+                implementation provides a simple convention for defining class
+                resource methods. Any protected method beginning with a name
+                prefixed with <emphasis>_init</emphasis> will be considered a resource
+                method.
+            </para>
+
+            <para>
+                To bootstrap a single resource method, use the
+                <methodname>bootstrap()</methodname> method, and pass it the name of the
+                resource. The name will be the method name minus the
+                <emphasis>_init</emphasis> prefix.
+            </para>
+
+            <para>
+                To bootstrap several resource methods, pass an array of names.
+                Too bootstrap all resource methods, pass nothing.
+            </para>
+
+            <para>
+                Take the following bootstrap class:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+    protected function _initFoo()
+    {
+        // ...
+    }
+
+    protected function _initBar()
+    {
+        // ...
+    }
+
+    protected function _initBaz()
+    {
+        // ...
+    }
+}
+]]></programlisting>
+
+            <para>
+                To bootstrap just the <methodname>_initFoo()</methodname> method, do the
+                following:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$bootstrap->bootstrap('foo');
+]]></programlisting>
+
+            <para>
+                To bootstrap the <methodname>_initFoo()</methodname> and
+                <methodname>_initBar()</methodname> methods, do the following:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$bootstrap->bootstrap(array('foo', 'bar'));
+]]></programlisting>
+
+            <para>
+                To bootstrap all resource methods, call <methodname>bootstrap()</methodname>
+                with no arguments:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$bootstrap->bootstrap();
+]]></programlisting>
+        </sect3>
+
+        <sect3 id="zend.application.theory-of-operation.bootstrap.resource-plugins">
+            <title>Bootstraps that use resource plugins</title>
+
+            <para>
+                To make your bootstraps more re-usable, we have provided the
+                ability to push your resources into resource plugin classes.
+                This allows you to mix and match resources simply via
+                configuration. We will cover <link
+                    linkend="zend.application.theory-of-operation.resources">how
+                    to create resources</link> later; in
+                this section we will show you how to utilize them only.
+            </para>
+
+            <para>
+                If your bootstrap should be capable of using resource plugins,
+                you will need to implement an additional interface,
+                <classname>Zend_Application_Bootstrap_ResourceBootstrapper</classname>.
+                This interface defines an <acronym>API</acronym> for locating, registering, and
+                loading resource plugins:
+            </para>
+
+        <programlisting language="php"><![CDATA[
+interface Zend_Application_Bootstrap_ResourceBootstrapper
+{
+    public function registerPluginResource($resource, $options = null);
+    public function unregisterPluginResource($resource);
+    public function hasPluginResource($resource);
+    public function getPluginResource($resource);
+    public function getPluginResources();
+    public function getPluginResourceNames();
+    public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader);
+    public function getPluginLoader();
+}
+]]></programlisting>
+
+            <para>
+                Resource plugins basically provide the ability to create
+                resource intializers that can be re-used between applications.
+                This allows you to keep your actual bootstrap relatively clean,
+                and to introduce new resources without needing to touch your
+                bootstrap itself.
+            </para>
+
+            <para>
+                <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname> (and
+                <classname>Zend_Application_Bootstrap_Bootstrap</classname> by extension)
+                implement this interface as well, allowing you to utilize
+                resource plugins.
+            </para>
+
+            <para>
+                To utilize resource plugins, you must specify them in the
+                options passed to the application object and/or bootstrap. These
+                options may come from a configuration file, or be passed in
+                manually. Options will be of key to options pairs, with the key
+                representing the resource name. The resource name will be the
+                segment following the class prefix. For example, the resources
+                shipped with Zend Framework have the class prefix
+                "<classname>Zend_Application_Resource_</classname>"; anything following this would
+                be the name of the resource. As an example,
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$application = new Zend_Application(APPLICATION_ENV, array(
+    'resources' => array(
+        'FrontController' => array(
+            'controllerDirectory' => APPLICATION_PATH . '/controllers',
+        ),
+    ),
+));
+]]></programlisting>
+
+            <para>
+                This indicates that the "FrontController" resource should be
+                used, with the options specified.
+            </para>
+
+            <para>
+                If you begin writing your own resource plugins, or utilize
+                third-party resource plugins, you will need to tell your
+                bootstrap where to look for them. Internally, the bootstrap
+                utilizes <classname>Zend_Loader_PluginLoader</classname>, so you will only
+                need to indicate the common class prefix an path pairs.
+            </para>
+
+            <para>
+                As an example, let's assume you have custom resource plugins in
+                <filename>APPLICATION_PATH/resources/</filename> and that they share the
+                common class prefix of <classname>My_Resource</classname>. You would then
+                pass that information to the application object as follows:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$application = new Zend_Application(APPLICATION_ENV, array(
+    'pluginPaths' => array(
+        'My_Resource' => APPLICATION_PATH . '/resources/',
+    ),
+    'resources' => array(
+        'FrontController' => array(
+            'controllerDirectory' => APPLICATION_PATH . '/controllers',
+        ),
+    ),
+));
+]]></programlisting>
+
+            <para>
+                You would now be able to use resources from that directory.
+            </para>
+
+            <para>
+                Just like resource methods, you use the <methodname>bootstrap()</methodname>
+                method to execute resource plugins. Just like with resource
+                methods, you can specify either a single resource plugin,
+                multiple plugins (via an array), or all plugins. Additionally,
+                you can mix and match to execute resource methods as well.
+            </para>
+
+            <programlisting language="php"><![CDATA[
+// Execute one:
+$bootstrap->bootstrap('FrontController');
+
+// Execute several:
+$bootstrap->bootstrap(array('FrontController', 'Foo'));
+
+// Execute all resource methods and plugins:
+$bootstrap->bootstrap();
+]]></programlisting>
+        </sect3>
+
+        <sect3 id="zend.application.theory-of-operation.bootstrap.registry">
+            <title>Resource Registry</title>
+
+            <para>
+                Many, if not all, of your resource methods or plugins will
+                initialize objects, and in many cases, these objects will be
+                needed elsewhere in your application. How can you access them?
+            </para>
+
+            <para>
+                <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
+                provides a local registry for these objects. To store your
+                objects in them, you simply return them from your resources.
+            </para>
+
+            <para>
+                For maximum flexibility, this registry is referred to as a
+                "container" internally; its only requirements are that it is an
+                object. Resources are then registered as properties named after
+                the resource name. By default, an instance of
+                <classname>Zend_Registry</classname> is used, but you may also specify any
+                other object you wish. The methods <methodname>setContainer()</methodname>
+                and <methodname>getContainer()</methodname> may be used to manipulate the
+                container itself. <methodname>getResource($resource)</methodname> can be
+                used to fetch a given resource from the container, and
+                <methodname>hasResource($resource)</methodname> to check if the resource has
+                actually been registered.
+            </para>
+
+            <para>
+                As an example, consider a basic view resource:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+    protected function _initView()
+    {
+        $view = new Zend_View();
+        // more initialization...
+
+        return $view;
+    }
+}
+]]></programlisting>
+
+            <para>
+                You can then check for it and/or fetch it as follows:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+// Using the has/getResource() pair:
+if ($bootstrap->hasResource('view')) {
+    $view = $bootstrap->getResource('view');
+}
+
+// Via the container:
+$container = $bootstrap->getContainer();
+if (isset($container->view)) {
+    $view = $container->view;
+}
+]]></programlisting>
+
+            <para>
+                Please note that the registry and also the container is not global. This
+                means that you need access to the bootstrap in order to fetch
+                resources. <classname>Zend_Application_Bootstrap_Bootstrap</classname>
+                provides some convenience for this: during its
+                <methodname>run()</methodname> execution, it registers itself as the front
+                controller parameter "bootstrap", which allows you to fetch it
+                from the router, dispatcher, plugins, and action controllers.
+            </para>
+
+            <para>
+                As an example, if you wanted access to the view resource from
+                above within your action controller, you could do the following:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+class FooController extends Zend_Controller_Action
+{
+    public function init()
+    {
+        $bootstrap = $this->getInvokeArg('bootstrap');
+        $view = $bootstrap->getResource('view');
+        // ...
+    }
+}
+]]></programlisting>
+        </sect3>
+
+        <sect3 id="zend.application.theory-of-operation.bootstrap.dependency-tracking">
+            <title>Dependency Tracking</title>
+
+            <para>
+                In addition to executing resource methods and plugins, it's
+                necessary to ensure that these are executed once and once
+                only; these are meant to bootstrap an application, and
+                executing multiple times can lead to resource overhead.
+            </para>
+
+            <para>
+                At the same time, some resources may depend on other
+                resources being executed. To solve these two issues,
+                <classname>Zend_Application_Bootstrap_BootstrapAbstract</classname>
+                provides a simple, effective mechanism for dependency
+                tracking.
+            </para>
+
+            <para>
+                As noted previously, all resources -- whether methods or plugins
+                -- are bootstrapped by calling <methodname>bootstrap($resource)</methodname>,
+                where <varname>$resource</varname> is the name of a resource, an array
+                of resources, or, left empty, indicates all resources should be
+                run.
+            </para>
+
+            <para>
+                If a resource depends on another resource, it should call
+                <methodname>bootstrap()</methodname> within its code to ensure that resource
+                has been executed. Subsequent calls to it will then be ignored.
+            </para>
+
+            <para>
+                In a resource method, such a call would look like this:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
+{
+    protected function _initRequest()
+    {
+        // Ensure the front controller is initialized
+        $this->bootstrap('FrontController');
+
+        // Retrieve the front controller from the bootstrap registry
+        $front = $this->getResource('FrontController');
+
+        $request = new Zend_Controller_Request_Http();
+        $request->setBaseUrl('/foo');
+        $front->setRequest($request);
+
+        // Ensure the request is stored in the bootstrap registry
+        return $request;
+    }
+}
+]]></programlisting>
+        </sect3>
+    </sect2>
+
+    <sect2 id="zend.application.theory-of-operation.resources">
+        <title>Resource Plugins</title>
+
+        <para>
+            <link
+                linkend="zend.application.theory-of-operation.bootstrap.resource-plugins">As noted
+                previously</link>, a good way to create re-usable bootstrap resources and to
+            offload much of your coding to discrete classes is to utilize resource
+            plugins. While Zend Framework ships with a number of standard
+            resource plugins, the intention is that developers should write
+            their own to encapsulate their own initialization needs.
+        </para>
+
+        <para>
+            Resources need only implement
+            <classname>Zend_Application_Resource_Resource</classname>, or, more simply
+            still, extend
+            <classname>Zend_Application_Resource_ResourceAbstract</classname>. The basic
+            interface is simply this:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+interface Zend_Application_Resource_Resource
+{
+    public function __construct($options = null);
+    public function setBootstrap(
+        Zend_Application_Bootstrap_Bootstrapper $bootstrap
+    );
+    public function getBootstrap();
+    public function setOptions(array $options);
+    public function getOptions();
+    public function init();
+}
+]]></programlisting>
+
+        <para>
+            The interface defines simply that a resource should accept options
+            to the constructor, have mechanisms for setting and retrieving
+            options, have mechanisms for setting and retrieving the bootstrap
+            object, and an initialization method.
+        </para>
+
+        <para>
+            As an example, let's assume you have a common view intialization you
+            use in your applications. You have a common doctype, <acronym>CSS</acronym> and
+            JavaScript, and you want to be able to pass in a base document title
+            via configuration. Such a resource might look like this:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+class My_Resource_View extends Zend_Application_Resource_ResourceAbstract
+{
+    protected $_view;
+
+    public function init()
+    {
+        // Return view so bootstrap will store it in the registry
+        return $this->getView();
+    }
+
+    public function getView()
+    {
+        if (null === $this->_view) {
+            $options = $this->getOptions();
+            $title   = '';
+            if (array_key_exists('title', $options)) {
+                $title = $options['title'];
+                unset($options['title']);
+            }
+
+            $view = new Zend_View($options);
+            $view->doctype('XHTML1_STRICT');
+            $view->headTitle($title);
+            $view->headLink()->appendStylesheet('/css/site.css');
+            $view->headScript()->appendfile('/js/analytics.js');
+
+            $viewRenderer =
+                Zend_Controller_Action_HelperBroker::getStaticHelper(
+                    'ViewRenderer'
+                );
+            $viewRenderer->setView($view);
+
+            $this->_view = $view;
+        }
+        return $this->_view;
+    }
+}
+]]></programlisting>
+
+        <para>
+            As long as you register the prefix path for this resource plugin,
+            you can then use it in your application. Even better, because it
+            uses the plugin loader, you are effectively overriding the shipped
+            "View" resource plugin, ensuring that your own is used instead.
+        </para>
+    </sect2>
+</sect1>