|
vasa_c ↓
|
 |
|
30 Июль, 2011, 09:08:47
|
НЕ ХУЕТА!
ХУЕТА!
|
|
|
|
mario ↓
|
 |
|
26 Январь, 2011, 03:17:09 , спустя
|
НЕ ХУЕТА!
ХУЕТА!
|
wazzup
Группа: Джедаи Карма: 67
Сообщений: 6162 Сила слова: 1.09
|
пля, тебе нужно идти преподавать! :) Ты так аухенно пишешь )
|
|
|
|
|
Записан
|
|
|
|
|
master ↓
|
 |
|
26 Январь, 2011, 03:34:58 , спустя 17 минут 49 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Квадратов сколько видишь ты?
Группа: Джедаи Карма: 44
Сообщений: 2080 Сила слова: 2.12
|
1. Нет никакой "конфигурации сайта", есть конфигурации инстансов объектов. Соответственно поля конфига группируем по инстансам:
db1:
host: hostname
user: username
db2:
host: host2name
user: user2name
auth:
mode: strict
check_cookies: true
allow_users: [alice, bob, cheburashka]
2. соответственно когда создаём инстанс объекта загружаем в него ветку из конфига из файла:
$config_object = new X_Config($config_file, '/db1');
$model_instance = new $model_classname($config_object);
3. В самом инстансе доступ к свойствам конфига получаем так:
$host = $this->config['/host']; // это не массив, а объект с имплементацией ArrayAccess
$user = $this->config['/user'];
$auth_users = $this->config['/allow_users'];
4. Используем ArrayAccess потому что это просто удобнее.
5. Можем поиметь при необходимости весь конфиг
$config_object = new X_Config($config_file, '/');
$model_instance = new $model_classname($config_object);
...
$host = $this->config['/db1/host'];
$auth_users = $this->config['/auth/allow_users'];
но как правило такое не нужно, т.к. удобнее работать с изолированными ветками
6. Для наложения индивидуальных настроек на общие удобно использовать array_replace_recursive (к сожалению только в 5.3, в 5.2 приходится её переписывать вручную).
|
|
|
|
« Последнее редактирование: 26 Январь, 2011, 03:33:32 от master »
|
Записан
|
|
|
|
|
vasa_c ↓
|
 |
|
26 Январь, 2011, 05:47:52 , спустя 2 часа 12 минут 54 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Нет никакой "конфигурации сайта", есть конфигурации инстансов объектов.
Если имеется отличное мнение, не следует начинать его изложение с "нет никакой"... Я считаю что есть, даже если в системе нет вообще никаких объектов. Что есть инстанс объекта? Объект сам инстанс.
соответственно когда создаём инстанс объекта загружаем в него ветку из конфига из файла:
Объекты должны знать что-то о конфиге?
|
|
|
|
|
Записан
|
|
|
|
|
master ↓
|
 |
|
26 Январь, 2011, 06:11:17 , спустя 23 минуты 25 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Квадратов сколько видишь ты?
Группа: Джедаи Карма: 44
Сообщений: 2080 Сила слова: 2.12
|
Что есть инстанс объекта? Объект сам инстанс.
ага
Объекты должны знать что-то о конфиге?
только о своей маленькой ветке и её структуре. для объекта бд конфиг выглядит как
array('host' => ..., 'user' => ... )
|
|
|
|
|
Записан
|
|
|
|
|
KaFe ↓
|
 |
|
26 Январь, 2011, 06:15:55 , спустя 4 минуты 38 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Сраный Тролль Карма: -13346
Сообщений: 1727 Сила слова: -772.79
|
у меня все на ini-файлах бодяжится, но принцип работы слегка похож на предложенный vasa_c.
|
|
|
|
|
Записан
|
|
|
|
|
master ↓
|
 |
|
26 Январь, 2011, 06:17:15 , спустя 1 минуту 20 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Квадратов сколько видишь ты?
Группа: Джедаи Карма: 44
Сообщений: 2080 Сила слова: 2.12
|
7. практика показывает что вот эти ситуации
$dir_root = '/www/site.ru/htdocs';
$dir_image = $dir_root.'/image';
$dir_thumbs = $dir_image.'/thumbs';
$dir_css = $dir_root.'/css';
лучше разруливать всё же прямым указанием значений
$dir_root = '/www/site.ru/htdocs';
$dir_image = '/www/site.ru/htdocs/image';
$dir_thumbs = '/www/site.ru/htdocs/image/thumbs';
$dir_css = '/www/site.ru/htdocs/css';
т.к. отдельная сложность конфигов - решить какие параметры объявить первичными, а какие вторичными на основе первичных.
либо
8. отдельно объявляем константы, а на основе констант уже формируем значения конфига
constants.php
define('DIR_ROOT', '/www/site.ru/htdocs');
config.php
return array(
'dir_image' => DIR_ROOT.'/image',
'dir_thumbs' => DIR_ROOT.'/image/thumbs',
'dir_css' => DIR_ROOT.'/css',
)
|
|
|
|
|
Записан
|
|
|
|
|
AlexB ↓
|
 |
|
26 Январь, 2011, 06:20:29 , спустя 3 минуты 14 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 89
Сообщений: 3425 Сила слова: 2.6
|
По первой части:
Мне хватает глобального маccива $CONF. Т.е. использую способ, который в статье называется "Массивчик". С ретурном из инклюда способ порадовал, я честно говоря не то чтобы не знал, но как-то не думал что можно найти практическое применение возвращаемого значения из инклюда. А вот все навороты с классами, ИМХО - навороты ради наворотов, не вижу существенных приемуществ.
По второй части:
У меня всегда есть отдельный conf в котором храняться настройки, которые теоритически могут отличаться на девелопменте и продакшене. На самомо деле, таких настроек крайне мало и меняются они редко, коннект к базе из их числа. Этот файл один раз правится на продакшене руками и больше его никто не трогает, кроме ведущего программиста. Если кто выложит - получает пизды (или автоматом исключаем его из комитов). Неэстетично, зато дешево и практично. Остальные конфы должны синхронизироваться между разработчиками так же как и остальные части проекта.
|
|
|
|
« Последнее редактирование: 26 Январь, 2011, 06:20:29 от AlexB »
|
Записан
|
|
|
|
|
master ↓
|
 |
|
26 Январь, 2011, 06:21:33 , спустя 1 минуту 4 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Квадратов сколько видишь ты?
Группа: Джедаи Карма: 44
Сообщений: 2080 Сила слова: 2.12
|
Этот файл один раз правится на продакшене руками и больше его никто не трогает, кроме ведущего программиста. Если кто выложит - получает пизды.
конфиг добавляется в игнор деплой-скрипта
либо если деплой делается через свн-ап то изменённые на сервере строки остаются изменёнными, а закоммиченные изменения мерджатся в рабочей копии на сервере
|
|
|
|
|
Записан
|
|
|
|
|
AlexB ↓
|
 |
|
26 Январь, 2011, 06:26:35 , спустя 5 минут 2 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 89
Сообщений: 3425 Сила слова: 2.6
|
В рабочей копии тоже запрещаем.
|
|
|
|
|
Записан
|
|
|
|
|
vasa_c ↓
|
 |
|
26 Январь, 2011, 07:22:14 , спустя 55 минут 39 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
7. практика показывает что вот эти ситуации
$dir_root = '/www/site.ru/htdocs';
$dir_image = $dir_root.'/image';
$dir_thumbs = $dir_image.'/thumbs';
$dir_css = $dir_root.'/css';
лучше разруливать всё же прямым указанием значений
$dir_root = '/www/site.ru/htdocs';
$dir_image = '/www/site.ru/htdocs/image';
$dir_thumbs = '/www/site.ru/htdocs/image/thumbs';
$dir_css = '/www/site.ru/htdocs/css';
Моя практика показывает что синхронизировать несколько копий с подобным прямым указанием крайне сложно.
8. отдельно объявляем константы, а на основе констант уже формируем значения конфига
На любой крупной системе желательно избавляться от всех глобальны переменных, констант и лишних высокоуровневых связей. Спустя 1 минуту 35 секунд добавил Неэстетично, зато дешево и практично.
Ну, мы же здесь об эстетике говорим :)
|
|
|
|
|
Записан
|
|
|
|
|
master ↓
|
 |
|
26 Январь, 2011, 08:00:59 , спустя 38 минут 45 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Квадратов сколько видишь ты?
Группа: Джедаи Карма: 44
Сообщений: 2080 Сила слова: 2.12
|
На любой крупной системе желательно избавляться от всех глобальны переменных, констант и лишних высокоуровневых связей.
констант минимум и они используются только для задания значений конфигов
|
|
|
|
|
Записан
|
|
|
|
|
vasa_c ↓
|
 |
|
26 Январь, 2011, 08:20:24 , спустя 19 минут 25 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2459 Сила слова: 3.29
|
Чем конфиг отличается от других подсистем? Почему ему такая честь, иметь константы, которые другим запрещены?
|
|
|
|
|
Записан
|
|
|
|
|
master ↓
|
 |
|
27 Январь, 2011, 07:22:45 , спустя 11 часов 2 минуты 21 секунду
|
НЕ ХУЕТА!
ХУЕТА!
|
Квадратов сколько видишь ты?
Группа: Джедаи Карма: 44
Сообщений: 2080 Сила слова: 2.12
|
догматическое программирование на пыха.ру
|
|
|
|
|
Записан
|
|
|
|
|
artoodetoo ↓
|
 |
|
27 Январь, 2011, 07:54:15 , спустя 31 минуту 30 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
с особым цинизмом
Группа: в ухо Карма: 124
Сообщений: 3805 Сила слова: 3.26
|
Очень понравилось что написал vasa_c и как написал тоже понравилось.
Сам пришел практически к таким же схемам. Опишу то что имею сверх описанного.
1. Абсолютно не принципиально в каком формате конфиг лежит на диске - после подгрузки это все-равно будет ветвистый ассоциативный массив типа дерево. :) Соответственно объединение глобального и частного конфигов выполняется через array_merge_recursive() - то что надо перекроется.
2. Про разграничение доступа к разделам конфигурации. Есть закрытый раздел конфига (назовем его " rules"), данные из него могут попасть в компоненту только при создании - Dependency Injection. Я завёл базовый класс "компонента" с таким вот конструктором:
class Component
{
public function __construct (array $params = NULL)
{
if (! empty($params)) {
foreach ($params as $var => $value) {
$this-> $var = $value;
}
}
}
}
А в закрытом разделе конфига описывается чем инициируется компонент:
return array(
'rules' => array(
'A' => array('class'=> 'MyComponentClassA', 'host'=> '192.168.12.13', 'user'=> 'benaflek', 'password'=> 'hujnane'),
'B' => array('class'=> 'MyComponentClassB', 'path'=> '/subdir/xxx.dat'),
)
)
Сам класс конфигурации, очевидно, имеет доступ к своим данным. Процесс создания объекта в фабрике-конфиге:
$args = self:: $_rules[$name];
$class = $args['class'];
unset($args['class']);
return new $class($args); // $class inherits from Component !
|
|
|
|
|
Записан
|
|
|
|
|