bootstrap - его зона ответственности и что он должен делать?

Духовность™

Продвинутый новичок
bootstrap - его зона ответственности и что он должен делать?

Сабж. Расскажите, как вы правильно понимаете эту часть системы.

Вот у меня такой файл загрузки:

PHP:
<?php
// Program use php-modules: 'mysql', 'iconv', 'dom', 'gd', 'spl', 'Ctype', 'SimpleXML' (PHP 5)
error_reporting (E_ALL);

if (get_magic_quotes_runtime()) {
    set_magic_quotes_runtime(0);
}

function getmicrotime()
{
    list($usec, $sec) = explode(' ', microtime());
    return ((float)$usec + (float)$sec);
}

$time_start = getmicrotime();

//setlocale(LC_ALL, 'ru_RU.CP1251');
date_default_timezone_set('Europe/Moscow');

define('DOCUMENT_ROOT', dirname(dirname(__FILE__)));

ini_set('error_log', DOCUMENT_ROOT.
                     DIRECTORY_SEPARATOR.'logs'.
                     DIRECTORY_SEPARATOR.'php_error_log.txt');

function __autoload($class_name)
{
    $realparh = DOCUMENT_ROOT.DIRECTORY_SEPARATOR.
                'kernel'.DIRECTORY_SEPARATOR.
                str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php';

    if (file_exists($realparh))
    {
        require($realparh);
    }
    else
    {
        throw new Exception('Не найден подключаемый файл по адресу: '.$realparh);
    }
}

$Base_Registry = Base_Registry::getInstance();

ini_set('mysql.default_user', 'root');
ini_set('mysql.default_password', '');
ini_set('mysql.default_host', 'localhost');
ini_set('mysql.trace_mode', 0);
define('MYSQL_DEFAULT_DB', 'adverts');

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

$Base_Registry['config']['enabled_debug_info'] = 1;

// Соль, применяемая при хэшировании пароля для COOKIE.
$Base_Registry['config']['user_cookie_salt'] = '4357435felwfew455km';

// Язык по умолчанию. Применяется для выбора i18n и т.д.
$Base_Registry['config']['lang'] = 'ru';

// От кого отсылаем noreply письма.
$Base_Registry['config']['robot_email_adress'] = '[email protected]';

// Директория со шрифтами для captcha.
$Base_Registry['path']['font'] = DOCUMENT_ROOT.DIRECTORY_SEPARATOR.
                                 'etc'.DIRECTORY_SEPARATOR.
                                 'fonts'.DIRECTORY_SEPARATOR;

// Пути к статическим элементам сайта (js, css и т.д.)
$Base_Registry['path']['http']['index'] = '/http/';
$Base_Registry['path']['http']['js'] = '/http/js/';
$Base_Registry['path']['http']['css'] = '/http/css/';

$Base_Registry['path']['http']['image']['index'] = '/http/image/';
$Base_Registry['path']['http']['image']['system']['icon'] = '/http/image/system/icon/';
$Base_Registry['path']['http']['image']['desing']['icon'] = '/http/image/desing/icon/';

$db = Db_Mysql_Base::getInstance();
$db->setCurrentDb(MYSQL_DEFAULT_DB);

$Base_Registry['objects']['db'] = $db; unset($db);
что тут не относится к загрузке? мне сейчас очень не нравится то, что я фактический заполняю тут конфиг. Но в какое-то другое место его выносить не хочу, ибо PHP-шные конфиги для меня самые удобные.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Каждый делает как ему удобно.
У меня так:
PHP:
/**
 * Set up error reporting [test version of project only]
 */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);

require_once 'Edge/lib/Application.php';

$Application = new Application();
$Application->create(dirname(__FILE__) . '/application');
$Application->run();
 

Духовность™

Продвинутый новичок
c0dex
у тебя "классическая" загрузка, но куда деваешь настройки PHP, локали, конфигов и пр.?

UPD: а нет, это не bootstrap. Это обычный index.php, точка входа.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
triumvirat
У меня папочка движка - Edge, и папка application - это все, что относится к приложению.
Частично настройки продефайнены в виде констант в Application.php - который управляет компоновкой приложения. Там разные пути к файлам указаны и прочая мелочь.

Есть папка Application/сonfig, там сложены все файлы по i18n, мускулю, мемкешу и конфигу контроллеров и view модулей.

Сам конфиг получаю через Config::config('app.template.default.native'); - это дело обращается соответственно или к папке приложений - если первый кусок app или к папке движка, если там стоит sys. Потом ищется файл template.php.

Внутри файла идет поиск массива $config['default']['native'] = array()/string/bool/int;
В данном случае в таком массиве $config['default']['native'] лежит массив с конфигом для native шаблонизатора. Рядом в $config['default']['smarty'] & $config['default']['quicky'] положены конфиги понятно для чего)


Как-то так, если плохо описал - не пинать
 

HraKK

Мудак
Команда форума
PHP:
class Billing_Application_Bootstrap implements Core_Bootstrap_Interface
{
	public function bootstrap( Core_Application_Interface $Application )
	{
	    Core_Application::setInstance( $Application );
		$Application->setLoader( new Core_Loader )->getLoader()->addLoader( new Core_Loader_Default )->startContext();
		$Cache = new Core_Cache();
		$Cache->setOptions( array( 'driver' => 'file' ) );
		$Application->setRequest( $Application->getParam( 'Request' , new Core_Request_Http() ) )
					->setResource( new Core_Application_Resource( $Application->getLoader() ) )
					->setEngine( new Core_Engine )
					->setLanguage( new Core_Language )
					->setPermission( Core_Permission::factory( Core_Permission::ACL ) )
					->setRender( new Core_Render )
					->setCache( $Cache )
					->setAdapter( Core_Db::factory( 'Mysqli',
						$Application->getParam( 'dbHost' , '127.0.0.1' ),
						$Application->getParam( 'dbUsername' , 'root' ),
						$Application->getParam( 'dbPassword' , '' ) ) );
		$Application->getAdapter()->setDatabase( $Application->getParam( 'dbName' , 'billing' ) );
		$Application->getEngine()->addEngine( array( 'http' => 'Core_Engine_Http', 'json' => 'Core_Engine_Json', 'soap' => 'Core_Engine_Soap' ) )->setDefault( 'http' );
		$Application->getRequest()->setRequest( $Application->getRequest()->getGet( 'uri', $Application->getParam( 'defaultUri' ) ) );
		$Application->getResource()->addResource( 'Billing_Controller_Front', 'FrontController' )
								   ->addResource( 'Billing_Router_Default', 'Router' )
								   ->addResource( 'Core_View', 'View' )
								   ->addResource( 'Core_Template', 'Template' )
								   ->addResource( 'Modules_Page_Controller_Response', 'ResponsePage' )
								   ->addModule( 'Modules_Admin_Application', 'Admin' )								   
								   ->addModule( 'Modules_Request_Application', 'Request' )
								   ->addModule( 'Modules_Page_Application', 'Page' );
	    Core_User::setInstance( new Core_User_Prototype );
	}
}
 

tz-lom

Продвинутый новичок
PHP:
<?php

define('ROOT',dirname(__FILE__));


spl_autoload_register(function($className){
    require_once(ROOT."/incl/$className.php");
});

spl_autoload_call('Globals');

require(ROOT.'/incl/Globals/db.php');
require(ROOT.'/incl/Globals/templates.php');
require(ROOT.'/incl/Globals/user.php');
require(ROOT.'/incl/Globals/map.php');


$uri = substr($_SERVER['REQUEST_URI'],0,strpos($_SERVER['REQUEST_URI'],'?'));
if($uri=='') $uri = $_SERVER['REQUEST_URI'];

try
{
    Globals()->map->go($uri);
}
catch(ErrorException $exception)
{
    Globals()->tpl->showTemplate('404');
}
основные настройки разнесены по файлам-базы,шаблоны,сессии,роутинг
 

Активист

Активист
Команда форума
Я вставляю в единую точку входа. Если она отсутствует, то инициализация происходит аналогично кода храка, только кофиги все вынесены.

> $Application->getParam( 'dbHost' , '127.0.0.1' ),
Больше на сетер похож)

PHP:
// Устналвиваем уровень вывода ошибок и сообщений
ini_set("display_errors", "on");
error_reporting(E_ALL);

//Запускаем сессию
session_start(md5_file(__FILE__));

// Устанавливаем точку для обозначения успешного запуска core.php
define("CORE_START_POINT", true);

// Подключаем конфигаруционный файл
require("core/config.php");
if (!defined("CORE_CONFIG_LOADED")) { // проверяем подулючен ли конфиг
	exit("Fatal error: confuration load error [core]");
}

// Подключаем функции
require("core/functions.php");
if (!defined("CORE_FUNCTION_LOADED")) { // проверяем загружен ли конфиг
	exit("Fatal error: functions load error [core]");
}
header("Content-type: text/html; charset=windows-1251", true);
// Удалаем ненужные слешы
$_GET		= strip($_GET);
$_POST		= strip($_POST);
$_COOKIE	= strip($_COOKIE);


// Запускаем RC скрипты и подключаем библиотеки
require("core/rc.d/010.set-locale.php");				// Устанавливаем локаль
require("core/rc.d/020.load-auto-install-system.php");	// Загружаем класс для автоматической установки модулей
require("core/rc.d/047.load-fckeditor.php");			// Загружаем fckEditor
require("core/rc.d/048.load-navigation-subsystem.php"); // Загружаем класс для организации работы процессов навигации
require("core/rc.d/049.load-mysql.php");				// Запускаем MySQL
require("core/rc.d/050.load-smarty.php");				// Запускаем шаблонизатор
require("core/rc.d/051.parce-uri.php");					// Обрабатываем uri из запроса
require("core/rc.d/052.detect-current-lang.php");		// Загружаем весь список доступных языков и проверяем и проверяем его правильность.
require("core/rc.d/053.init-all-modules.php");			// Иницилизируем процесс загрузки информации о присутствующих модулях, текущем модуле
require("core/rc.d/054.load.language.system.php");		// Инициализация языковой среды
require("core/rc.d/099.load.other.classes.php");		// Инициализация языковой среды
require("core/rc.d/100.load.core-subsystem.php");		// 
//...
require("core/rc.d/110.init-core-users.php");			// Загружаем класс для работы с пользователями
require("core/rc.d/200.init-phpmailer.php");
require("core/rc.d/999.load.other.php");

// System Data 
// ..
// ...
 

HraKK

Мудак
Команда форума
> $Application->getParam( 'dbHost' , '127.0.0.1' ),
Больше на сетер похож)
это геттер с дефаултным значением. Возможно при создании апликейшена указать нужное в конфиге.
 

korchasa

LIMB infected
PHP:
set_include_path(implode(PATH_SEPARATOR,
  array(
    dirname(__FILE__) . '/lib/',
    dirname(__FILE__),
    get_include_path()
  )
));

require_once('limb/core/common.inc.php');

if(file_exists(dirname(__FILE__) . '/setup.override.php'))
  require_once(dirname(__FILE__) . '/setup.override.php');

lmb_package_require('cms');

lmb_env_setor('LIMB_VAR_DIR', dirname(__FILE__) . '/var/');

lmb_require('src/toolkit/ShopTools.class.php');
lmbToolkit :: merge(new ShopTools());

require_once('src/LimbApplication.class.php');
$application = new LimbApplication();
$application->process();
 

fixxxer

К.О.
Партнер клуба
>> Расскажите, как вы правильно понимаете эту часть системы.

А ты что имеешь в виду? У меня это разделено на 2 части.

первое (вызывается сразу из точки входа) - совсем маленькая: извлечение из envoronment имени текущей платформы, и debug-оверрайдов, set_inclide_path, создание envoronment-а приложения, запуск приложения (Web- или Cli-).

второе - это инициализация приложения. В случае с Cli - это тупо парсинг опций и запуск заданного скрипта, в случае с Web там много, по сути как у Хряка но по форме иначе, это неважно =) А, да, еще, конечно, наследуемый от базового приложения инициализатор, со всякими менеджерами соединений.
 

whirlwind

TDD infected, paranoid
PHP:
$settings = @parse_ini_file(dirname(__FILE__).'/config.ini');
if ( $settings === false ) { echo "Parsing configuration failed"; exit(); }
require_once 'Service/Locator.php';
$locator = new Service_Locator();
$config = $locator->getConfig();
foreach ( $settings as $key => $val) $config->setVar($key, $val);
$locator->getConnectionManager()->register($settings['connection.default']);
$locator->getFrontendDispatcher()->dispatch();
 

Активист

Активист
Команда форума
c0dex
Это я название файлов с ошибками написал, вместо блока Require там код

PHP:
// Запускаем RC скрипты и подключаем библиотеки
$files = glob("core/rc.d/*.php");
sort($files);

foreach ($files as $file) {
	require_once($file);
}
-~{}~ 04.11.10 08:57:

Удобно и понятно в случае если нужно инсталировать дополнительные библиотеки, например id3tag или Exel Reader
 

fixxxer

К.О.
Партнер клуба
а не лучше один раз список инклюдов сгенерить? это ж мееееееееееееедленно!
 

Активист

Активист
Команда форума
fixxxer
На этапе разработки удобно, а в паблике можно и список воткнуть. Я ж не один работаю))

Коллеги смотрят в rc.d и видят, что там сейчас есть, если что-то нужно для них, создают соответствующий "скрипт".

Бечмарков не делал, но не думаю, что glob насколько медлителен, или ты про sort?))

-~{}~ 04.11.10 09:24:

Сейчас вообще готовится архитектура новой системы, на базе прошлых наработок с учетом всех трудностей коллективной разработки, что б не использовались напильники, поэтому активно дискуссирую на форуме последнее время, хотя работы много)))

-~{}~ 04.11.10 09:27:

Кстати, у triumvirat все вроде ничего, но конфиги бы вынес в отдельный файл.

Одно время юзали ini (whirlwind)
> $settings = @parse_ini_file(dirname(__FILE__).'/config.ini');
Но с постарением структурных конфигов грабли (хотя есть большой плюс - ошибка в конфиге не вызовет фатальных ошибок), поэтому вернулись на PHP код.

Сейчас применяем INI только в языковых переменных, хотя задумываемся об использовании XML, сейчас человек занимается бенчмарком ini vs xml в реальных проектах)
 

fixxxer

К.О.
Партнер клуба
Глоб довольно медленная штука, посчитай сколько там сисколлов.
Можно хоть xml хоть черта в ступе кэшировать в .php. Быстрее все равно не бывает)
 

AmdY

Пью пиво
Команда форума
я делал конфиги сразу в xml, затем yml, сейчас только в php и никак иначе, зачем писать гибкие классы, если у тебя деревянный конфиг. вон в zf начали константы в конфиг вставлять

у HraKK мне нравится, только имхо, нужно родительский с настройками по дефолту делать, а в чилдренах переопределять дефолтные настройки если нужно, что бывает очень редко. я вообще бутстрапами обычно никогда не заморачивался, клеплю гавнокод там.
 

fixxxer

К.О.
Партнер клуба
>> только имхо, нужно родительский с настройками по дефолту делать, а в чилдренах переопределять дефолтные настройки если нужно

у меня как раз так
 
Сверху