С выходом 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:
-
-
-
-
mkdir -p application/configs
-
mkdir -p application/controllers
-
mkdir -p application/layouts/scripts
-
mkdir -p application/models
-
mkdir -p application/views/helpers
-
mkdir -p application/views/scripts/index
-
mkdir -p application/views/scripts/error
-
-
-
-
mkdir -p tests/application
-
mkdir -p tests/application/controllers
Теперь скачайте последний релиз ZF и скопируйте директорию Zend в library.
Public каталог
Создайте файл public/.htaccess
PHP:
-
SetEnv APPLICATION_ENV development
-
-
RewriteEngine On
-
RewriteCond %{REQUEST_FILENAME} -s [OR]
-
RewriteCond %{REQUEST_FILENAME} -l [OR]
-
RewriteCond %{REQUEST_FILENAME} -d
-
RewriteRule ^.*$ - [NC,L]
-
RewriteRule ^.*$ index.php [NC,L]
В файле public/index.php мы просто установим переменные окружения, а все остальное сделает Zend_Application. Как я упоминал раньше, большинство настроек хранится в конфиграционном файле.
public/index.php
PHP:
-
<?php
-
-
define('APPLICATION_PATH', BASE_PATH .
'/application');
-
-
// Include path
-
-
BASE_PATH . '/library'
-
-
);
-
-
// Define application environment
-
-
-
-
: 'production'));
-
-
// Zend_Application
-
require_once 'Zend/Application.php';
-
-
$application = new Zend_Application(
-
APPLICATION_ENV,
-
APPLICATION_PATH . '/configs/application.ini'
-
);
-
-
$application->bootstrap();
-
$application->run();
Конфигурационный файл
application/configs/application.ini: В моем приложении используется 3 базы данных: основная база, база для разработки и база для тестирования, поэтому определение настроек баз данных разделено на 3 разных части.
PHP:
-
[production]
-
-
# Debug output
-
phpSettings.display_startup_errors = 0
-
phpSettings.display_errors = 0
-
-
# Include path
-
includePaths.library = APPLICATION_PATH "/../library"
-
-
# Bootstrap
-
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
-
bootstrap.class = "Bootstrap"
-
-
# Front Controller
-
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
-
resources.frontController.env = APPLICATION_ENV
-
-
# Layout
-
resources.layout.layout = "layout"
-
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
-
-
# Views
-
resources.view.encoding = "UTF-8"
-
resources.view.basePath = APPLICATION_PATH "/views/"
-
-
# Database
-
resources.db.adapter = "pdo_mysql"
-
resources.db.params.host = "localhost"
-
resources.db.params.username = "myproject"
-
resources.db.params.password = "myproject"
-
resources.db.params.dbname = "myproject_production"
-
resources.db.isDefaultTableAdapter = true
-
-
# Session
-
resources.session.save_path = APPLICATION_PATH "/../data/session"
-
resources.session.remember_me_seconds = 864000
-
-
[testing : production]
-
-
# Debug output
-
phpSettings.display_startup_errors = 1
-
phpSettings.display_errors = 1
-
-
# Database
-
resources.db.params.dbname = "myproject_testing"
-
-
[development : production]
-
-
# Debug output
-
phpSettings.display_startup_errors = 1
-
phpSettings.display_errors = 1
-
-
# Database
-
resources.db.params.dbname = "myproject_development"
Загрузчик
application/Bootstrap.php: как определено в конфигурационном файле, приложение использует этот файл для процесса загрузки. Я предоставил Zend_Application выполнить всю инициализацию самостоятельно за исключение вида view. В view я хочу установить особый doctype XHTML.
PHP:
-
<?php
-
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
-
{
-
protected function _initView()
-
{
-
// Initialize view
-
$view = new Zend_View();
-
$view->doctype('XHTML1_STRICT');
-
$view->headTitle('My Project');
-
$view->env = APPLICATION_ENV;
-
-
// Add it to the ViewRenderer
-
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
-
'ViewRenderer'
-
);
-
$viewRenderer->setView($view);
-
-
// Return it, so that it can be stored by the bootstrap
-
return $view;
-
}
-
}
Готово. Это и есть процесс загрузки. Ваше приложение теперь готово использовать ZF MVC и базу данных. Поэтому, давайте продолжим настроку специфических элементов приложения.
Добавим layout
Давайте добвим layout по умолчанию applicaiton/layouts/scripts/layout.phtml:
PHP:
-
<?php echo $this->
doctype() ?>
-
<html>
-
<head>
-
<?php echo $this->
headTitle() ?>
-
<?php echo $this->
headLink() ?>
-
<?php echo $this->
headStyle() ?>
-
<?php echo $this->
headScript() ?>
-
</head>
-
<body>
-
<?php echo $this->
layout()->
content ?>
-
</body>
-
</html>
Добавим контроллер и вид view
application/controllers/IndexController.php ничего особенного в нем:
PHP:
-
<?php
-
class IndexController extends Zend_Controller_Action
-
{
-
public function indexAction()
-
{
-
}
-
}
Дабавим view для index/index action в application/view/scripts/index/index.phtml
PHP:
-
<h1 id="welcome-to-the-zend-framework">Welcome to the Zend Framework!</h1>
application/controllers/ErrorController.php вызывается в том случае, если запрашиваемый контроллер не был найден. В зависимости от переменных окружения он вызывает исключение и вывод трассировки стека.
application/controllers/ErrorController.php:
PHP:
-
<?php
-
class ErrorController extends Zend_Controller_Action
-
{
-
public function errorAction()
-
{
-
$errors = $this->_getParam('error_handler');
-
-
switch ($errors->type) {
-
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
-
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
-
-
// 404 error -- controller or action not found
-
$this->getResponse()->setHttpResponseCode(404);
-
$this->view->message = 'Page not found';
-
break;
-
default:
-
// application error
-
$this->getResponse()->setHttpResponseCode(500);
-
$this->view->message = 'Application error';
-
break;
-
}
-
-
$this->view->exception = $errors->exception;
-
$this->view->request = $errors->request;
-
}
-
}
И принадлежащий ему вид:
PHP:
-
<h1 id="an-error-occurred">An error occurred</h1>
-
<h3 id=
""><?php
echo $this->
message ?></h3>
-
-
<? if ('development' == $this->env): ?>
-
-
<h4 id="exception-information">Exception information:</h4>
-
<p>
-
<strong>Message:</strong>
<?php echo $this->
exception->
getMessage();
?>
-
</p>
-
-
<h4 id="stack-trace">Stack trace:</h4>
-
<pre><?php
echo $this->
exception->
getTraceAsString() ?></pre>
-
-
<h4 id="request-parameters">Request Parameters:</h4>
-
<? var_dump($this->
request->
getParams());
?>
-
-
<? endif; ?>
Теперь ваше приложение должно работать. Попробуйте открыть / и /foo. Вы должны будете увидеть index/index и error/error actions.
Сокращено и переведено из mafflog.