Настраиваем Zend Application

С выходом Zend Framework 1.8 связано много новых изменений и дополнений. Самые значительные это добавление Zend_Application и Zend_Tool.

Zend_Tool представляет собой консольную программу управления проектами на Zend Framework.

Zend_Application это новая система загрузки приложения и конфигурирования проекта.

Рассмотрим как работать с Zend_Application подробнее.

Управление загрузкой приложения занимается Zend_Application_Bootstrap, он выполняет загрузку конфига, инициализацию компонентов, front контроллера, базы данных и объекта вида view.

Большинство настроек этих компонентов может храниться в конфигурационном файле, что обеспечивает дополнительную гибкость и модульность.

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

Вы можете просто использовать copy-past приведенных скриптов, чтоб сэкономить время.

Давате создадим файловую структуру.

PHP:
  1. mkdir -p public/css
  2. mkdir -p public/img
  3. mkdir -p public/js
  4. mkdir -p application/configs
  5. mkdir -p application/controllers
  6. mkdir -p application/layouts/scripts
  7. mkdir -p application/models
  8. mkdir -p application/views/helpers
  9. mkdir -p application/views/scripts/index
  10. mkdir -p application/views/scripts/error
  11. mkdir -p data/session
  12. mkdir -p bin
  13. mkdir -p library/App
  14. mkdir -p tests/application
  15. mkdir -p tests/application/controllers

Теперь скачайте последний релиз ZF и скопируйте директорию Zend в library.

Public каталог

Создайте файл public/.htaccess

PHP:
  1. SetEnv APPLICATION_ENV development
  2.  
  3. RewriteEngine On
  4. RewriteCond %{REQUEST_FILENAME} -s [OR]
  5. RewriteCond %{REQUEST_FILENAME} -l [OR]
  6. RewriteCond %{REQUEST_FILENAME} -d
  7. RewriteRule ^.*$ - [NC,L]
  8. RewriteRule ^.*$ index.php [NC,L]

В файле public/index.php мы просто установим переменные окружения, а все остальное сделает Zend_Application. Как я упоминал раньше, большинство настроек хранится в конфиграционном файле.

public/index.php

PHP:
  1. <?php
  2. define('BASE_PATH', realpath(dirname(__FILE__) . '/../'));
  3. define('APPLICATION_PATH', BASE_PATH . '/application');
  4.  
  5. // Include path
  6.     BASE_PATH . '/library'
  7.     . PATH_SEPARATOR . get_include_path()
  8. );
  9.  
  10. // Define application environment
  11. defined('APPLICATION_ENV')
  12.     || define('APPLICATION_ENV',
  13.               (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
  14.                                          : 'production'));
  15.  
  16. // Zend_Application
  17. require_once 'Zend/Application.php';
  18.  
  19. $application = new Zend_Application(
  20.     APPLICATION_ENV,
  21.     APPLICATION_PATH . '/configs/application.ini'
  22. );
  23.  
  24. $application->bootstrap();
  25. $application->run();

Конфигурационный файл

application/configs/application.ini: В моем приложении используется 3 базы данных: основная база, база для разработки и база для тестирования, поэтому определение настроек баз данных разделено на 3 разных части.

PHP:
  1. [production]
  2.  
  3. # Debug output
  4. phpSettings.display_startup_errors = 0
  5. phpSettings.display_errors = 0
  6.  
  7. # Include path
  8. includePaths.library = APPLICATION_PATH "/../library"
  9.  
  10. # Bootstrap
  11. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  12. bootstrap.class = "Bootstrap"
  13.  
  14. # Front Controller
  15. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  16. resources.frontController.env = APPLICATION_ENV
  17.  
  18. # Layout
  19. resources.layout.layout = "layout"
  20. resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
  21.  
  22. # Views
  23. resources.view.encoding = "UTF-8"
  24. resources.view.basePath = APPLICATION_PATH "/views/"
  25.  
  26. # Database
  27. resources.db.adapter = "pdo_mysql"
  28. resources.db.params.host = "localhost"
  29. resources.db.params.username = "myproject"
  30. resources.db.params.password = "myproject"
  31. resources.db.params.dbname = "myproject_production"
  32. resources.db.isDefaultTableAdapter = true
  33.  
  34. # Session
  35. resources.session.save_path = APPLICATION_PATH "/../data/session"
  36. resources.session.remember_me_seconds = 864000
  37.  
  38. [testing : production]
  39.  
  40. # Debug output
  41. phpSettings.display_startup_errors = 1
  42. phpSettings.display_errors = 1
  43.  
  44. # Database
  45. resources.db.params.dbname = "myproject_testing"
  46.  
  47. [development : production]
  48.  
  49. # Debug output
  50. phpSettings.display_startup_errors = 1
  51. phpSettings.display_errors = 1
  52.  
  53. # Database
  54. resources.db.params.dbname = "myproject_development"

Загрузчик

application/Bootstrap.php: как определено в конфигурационном файле, приложение использует этот файл для процесса загрузки. Я предоставил Zend_Application выполнить всю инициализацию самостоятельно за исключение вида view. В view я хочу установить особый doctype XHTML.

PHP:
  1. <?php
  2. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  3. {
  4.     protected function _initView()
  5.     {
  6.         // Initialize view
  7.         $view = new Zend_View();
  8.         $view->doctype('XHTML1_STRICT');
  9.         $view->headTitle('My Project');
  10.         $view->env = APPLICATION_ENV;
  11.  
  12.         // Add it to the ViewRenderer
  13.         $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
  14.             'ViewRenderer'
  15.         );
  16.         $viewRenderer->setView($view);
  17.  
  18.         // Return it, so that it can be stored by the bootstrap
  19.         return $view;
  20.     }
  21. }

Готово. Это и есть процесс загрузки. Ваше приложение теперь готово использовать ZF MVC и базу данных. Поэтому, давайте продолжим настроку специфических элементов приложения.

Добавим layout

Давайте добвим layout по умолчанию applicaiton/layouts/scripts/layout.phtml:

PHP:
  1. <?php echo $this->doctype() ?>
  2. <html>
  3. <head>
  4.     <?php echo $this->headTitle() ?>
  5.     <?php echo $this->headLink() ?>
  6.     <?php echo $this->headStyle() ?>
  7.     <?php echo $this->headScript() ?>
  8. </head>
  9. <body>
  10.     <?php echo $this->layout()->content ?>
  11. </body>
  12. </html>

Добавим контроллер и вид view

application/controllers/IndexController.php ничего особенного в нем:

PHP:
  1. <?php
  2. class IndexController extends Zend_Controller_Action
  3. {
  4.     public function indexAction()
  5.     {
  6.     }
  7. }

Дабавим view для index/index action в application/view/scripts/index/index.phtml

PHP:
  1. <h1 id="welcome-to-the-zend-framework">Welcome to the Zend Framework!</h1>

application/controllers/ErrorController.php вызывается в том случае, если запрашиваемый контроллер не был найден. В зависимости от переменных окружения он вызывает исключение и вывод трассировки стека.

application/controllers/ErrorController.php:

PHP:
  1. <?php
  2. class ErrorController extends Zend_Controller_Action
  3. {
  4.     public function errorAction()
  5.     {
  6.         $errors = $this->_getParam('error_handler');
  7.  
  8.         switch ($errors->type) {
  9.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  10.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  11.  
  12.                 // 404 error -- controller or action not found
  13.                 $this->getResponse()->setHttpResponseCode(404);
  14.                 $this->view->message = 'Page not found';
  15.                 break;
  16.             default:
  17.                 // application error
  18.                 $this->getResponse()->setHttpResponseCode(500);
  19.                 $this->view->message = 'Application error';
  20.                 break;
  21.         }
  22.  
  23.         $this->view->exception = $errors->exception;
  24.         $this->view->request   = $errors->request;
  25.     }
  26. }

И принадлежащий ему вид:

PHP:
  1. <h1 id="an-error-occurred">An error occurred</h1>
  2. <h3 id=""><?php echo $this->message ?></h3>
  3.  
  4. <? if ('development' == $this->env): ?>
  5.  
  6.     <h4 id="exception-information">Exception information:</h4>
  7.     <p>
  8.       <strong>Message:</strong> <?php echo $this->exception->getMessage(); ?>
  9.     </p>
  10.  
  11.     <h4 id="stack-trace">Stack trace:</h4>
  12.     <pre><?php echo $this->exception->getTraceAsString() ?></pre>
  13.  
  14.     <h4 id="request-parameters">Request Parameters:</h4>
  15.     <? var_dump($this->request->getParams()); ?>
  16.  
  17. <? endif; ?>

Теперь ваше приложение должно работать. Попробуйте открыть / и /foo. Вы должны будете увидеть index/index и error/error actions.

Сокращено и переведено из mafflog.

  1. Oleg Lobach says:

    А не проще ли воспользоваться Zend_Tool? Большая часть приведенного кода будет создано утилитой.

  2. Совершенно верно, zend tool сделает большую часть этой работы.
    Но, понимание происходящих процессов с Zend Tool не получишь.
    Это как программирование под Visual Studio или Delphi, которые создают много кода визардами за тебя, и без пояснений, программист понятия не имеет, что этот код делает.

  1. There are no trackbacks for this post yet.

Leave a Reply