Плюшки фреймворков aBSuRD 01 Фев 2013, 12:09 Перерыв пол гугла в поисках миниатюрного фреймворка, который подошел бы под небольшие скрипты, так ничего и не нашел, поэтому решил написать свой, без лишней горы компонентов/языковых настроек и т.п. Собственно интересует, какой фреймворк предпочитаете Вы? Что в нем нравится? Роутинг, работа с бд/формами, реализация контроллеров, конфигурация или может еще что то. Сам я пока что работал только с Yii, поэтому основное беру с него, но хотелось бы посмотреть что есть в других и какие предпочтения у вас. --------------- Constantin_Logan 01 Фев 2013, 12:23 Перерыв пол гуглане может быть! //зачем вообще использовать фреймворки для не больших скриптов? --------------- Akdmeh 01 Фев 2013, 13:36 есть много микро-фреймворков. на том же хабре посмотрите. --------------- aBSuRD 01 Фев 2013, 13:57 Constantin_Logan, это образно сказано. Будет у тебя задача написать вап блог/небольшой форум/фотогалерею, каким образом напишешь? На унылой процедурке с url'ами site.ru/blog.php?id=1 ? Akdmeh, все что встречал, не понравилось. точнее у всех были свои минусы которые я принимать не хочу --------------- ma3uk 01 Фев 2013, 14:19 Мне нравится роутинг в добавлено спустя 1 минуту: Работу с БД, не вижу смысла, перекладывать на фреймворк, когда есть PDO. Хотя для целостности кода можно сделать обертку для создания объекта бд, но не более. --------------- aBSuRD 01 Фев 2013, 15:10 ma3uk, построитель запросов точно нужно будет сделать select(array('id', 'login')) ->from('users') ->order('id', 'desc') ->limit(10) ->fetchAll(); // Удобнее, чем $users = $db->query('SELECT `id`, `login` FROM `users` ORDER BY(`id`) DESC LIMIT 10') ->fetchAll(); // и т.п ?> Хотя и обычные функции query, exec, prepare останутся --------------- Febian 01 Фев 2013, 15:30 какой фреймворк предпочитаете Вы? .net framework :hack: --------------- deadline404 01 Фев 2013, 15:33 Sinatra, Rails P.S А если брать только PHP - то Symfony2/Zend2 --------------- Okula 01 Фев 2013, 16:16 aBSuRD, я бы не сказал что удобнее. Быстрее будет написать запрос и отправить его в query чем вспоминать какие методы вызвать. К тому же запросы разные бывают. В большенстве случаев такие запросы как ты указал не используются, а используются сложные, связанные запросы. --------------- deadline404 01 Фев 2013, 19:54 Okula, "В большенстве случаев такие запросы как ты указал не используются, а используются сложные, связанные запросы." - Видимо у тебя не было инструмента который позволял это сделать. Наоборот таки в большинстве случаев нормальная ORM позволяет совершать практически все (связи, вложенности и т.п) сложные запросы с переносимостью по разным БД. "Быстрее будет написать запрос и отправить его в query чем вспоминать какие методы вызвать" - все фреймворки пытаются поднять планку уровня языка выше (а для чего же они ещё), а ты хочешь вернуться к старому?! --------------- Okula 01 Фев 2013, 20:02 К чему "к старому"? К написанию запроса полным текстом, а не обрывками, чтоб можно было взглянуть на запрос и сразу понять что он из себя представляет, а не догадывать по названию методов или по описанию phpDoc к ним. Вероятность составить запрос неправильно значительно увеличивается в таком случаи. --------------- deadline404 01 Фев 2013, 20:05 Okula, Спасибо, посмеялся :) --------------- aBSuRD 01 Фев 2013, 20:39 Okula, sql запросы в коде, это как html в контроллере.. Хотя мне и самому большинство подобных построителей не очень нравятся ( в Yii, Zend'e еще более менее, в Kohan'e и Symfony ( или CodeIgniter ) вообще хрень полнейшая ), но все же это лучше, чем sql код. Febian, php :) D.T.S, можно подробнее, что понравилось в этих фреймворках? --------------- Okula 01 Фев 2013, 20:39 D.T.S, так и скажи что я прав, раз не можешь аргументировать :) --------------- deadline404 01 Фев 2013, 20:44 Okula, Ок ок :D --------------- Akdmeh 01 Фев 2013, 21:46 В yii вообще не нужно запросы писать, существует генератор моделей да AR в придачу. --------------- Okula 01 Фев 2013, 23:09 D.T.S, вот к примеру: у меня есть SQL запрос из реально рабочего скрипта (поля и имена таблиц естественно изменены): SELECT a.*, b.`pole1_b`, b.`pole2_b`, ( SELECT COUNT(`id`) FROM `table` WHERE `pole` LIKE CONCAT(a.`pole`, '%') AND `pole1`<>0 ) AS `col`, ( SELECT COUNT(`id`) FROM `table` WHERE `pole` LIKE CONCAT(a.`pole`, '%') AND `pole1`<>0 AND `pole2`>43646747487 ) AS `col2`, ( SELECT COUNT(`id`) FROM `table_c` WHERE `pole_c`=a.`pole1` ) AS `com_kol` FROM `table` AS a LEFT OUTER JOIN `table_b` AS b ON b.`pole`=a.`pole3` WHERE a.`pole2`=5 ORDER BY a.`pole1` ASC, a.`pole2` ASC LIMIT 0, 50; Как будет выглядеть такой запрос обработанный "плюшками фреймворка"? --------------- aBSuRD 02 Фев 2013, 0:43 Okula, немного другой пример. Допустим есть таблицы users, profile, posts, files. Запрос: SELECT u.*, p.*, (SELECT COUNT(*) FROM `posts` WHERE `author_id` = u.`id`) as `posts`, (SELECT COUNT(*) FROM `files` WHERE `owner_id` = u.`id` AND `mod` = 1) as `files` FROM `users` u INNER JOIN `profile` p ON(p.`user_id` = u.`id`) WHERE `id` = 1 В yii этот запрос мог бы выглядеть так: $user = User::model()->find(array( 'with' => array('profile', 'posts', 'files'), 'condition' => 'id = 1' )); echo $user->posts; --------------- deadline404 02 Фев 2013, 9:35 Okula, ответили выше. Но в отличии от прямых запросов, имеется переносимость, связи, ленивая загрузка, фильтры и т.п ORM куда мощней и проще, выводит функции япа на более высокий уровень и программисту не нужно знать как выглядит БД. --------------- Akdmeh 02 Фев 2013, 9:43 Разговор ведь был не о ORM, а о обертке-построителе запросов. Разговор о том что этот построитель мало универсален, лучше уж использовать ActiveRecord --------------- iBiZoNiX 02 Фев 2013, 10:24 Okula, Выносить бизнес-логику из модели в контролер — противоречия шаблону MVC. А если бизнес-логику вообще пихать в представленя....это как говно-кодерство назвать по другому нельзя. --------------- aBSuRD 02 Фев 2013, 10:41 Вообщем суть темы в другом, давайте не отходить от неё --------------- Okula 02 Фев 2013, 12:14 D.T.S, iBiZoNiX, так и не ответили на мой вопрос. Разьве я спрашивал где этот запрос лучше поставить? Нет. Я спросил как будет выглядеть данный запрос в обёртке класса и всё, вы же развели тут охинею про контроллеры, модели и ORM хотя об этом никто не спрашивал. --------------- iBiZoNiX 02 Фев 2013, 12:30 Okula, У меня, например, в контроллере вообще нет как таковых построений запросов. У меня в модели уже готовые методы. В контролере я уже использую необходимые методы с параметрами. db - модель main - контроллер --------------- Akdmeh 02 Фев 2013, 13:44 опять от темы уходишь. покажи, как будет выглядеть твой конструктор запросов для примера, который написал Okula --------------- iBiZoNiX 02 Фев 2013, 15:56 Akdmeh, в модели у меня чистые sql хапросы. Так как пишет Окула. Разница в том, что он их использует в контроллере, а я в модели, тем самым отделяя бизнес-логику от контроллера. добавлено спустя: А так я полностью согласен с Окула, лучше юзать чистый sql нежели всякие обертки к ним. --------------- Akdmeh 02 Фев 2013, 16:16 26, извини, я думал, что построитель запросов продвигал именно ты, а не Absurd (был с телефона). На счет того, что запросы в контроллере - согласен. С использованием Yii я вообще не припоминаю, когда бы мне вообще приходилось писать запросы, модели решают все. --------------- iBiZoNiX 02 Фев 2013, 16:27 ma3uk, построитель запросов точно нужно будет сделать select(array('id', 'login')) ->from('users') ->order('id', 'desc') ->limit(10) ->fetchAll(); // Удобнее, чем $users = $db->query('SELECT `id`, `login` FROM `users` ORDER BY(`id`) DESC LIMIT 10') ->fetchAll(); // и т.п ?> Хотя и обычные функции query, exec, prepare останутся Мне проще читать и использовать чистый sql. --------------- Akdmeh 02 Фев 2013, 16:57 28, а еще намного удобнее: $blog->getLastEntries(); --------------- iBiZoNiX 02 Фев 2013, 17:31 Akdmeh, У меня так db.all_publications() :) --------------- Akdmeh 02 Фев 2013, 17:37 Да я помню, видел я твой код. Учитывая, что защиты от инъекций нету вообще... --------------- Okula 02 Фев 2013, 17:54 iBiZoNiX, опять ты на меня гонишь :) Укажи моё сообщение в этой теме где я писал что использую какие-то запросы в контроллере. Вообще таких слов от меня небыло. Или может ты в какой паралельной реальности общаешься со мной? --------------- iBiZoNiX 03 Фев 2013, 20:16 Akdmeh, уже все есть :) добавлено спустя 36 секунд: Okula, хз, попутал я что-то. --------------- Tadochi 04 Фев 2013, 12:11 ma3uk, построитель запросов точно нужно будет сделать а интересно, как реализовать такое? Ну эти обращения к методам --------------- Okula 04 Фев 2013, 12:56 Tadochi, возвращать ссылку на объект в методах: class A { public function method1() { return $this; } public function method2() { return $this; } } $a = new A(); $a->method1()->method2(); --------------- san 04 Фев 2013, 13:48 Из темы возникло ощущение, что в теме только D.T.S, а остальные как-то подзависли на уровне raw code и raw sql) Приведенный Okula запрос вообще абсурден в теме обсуждения фреймворков (как и "построители" запросов). 1. Запрос невозможно построить в ORM или "построителях", потому что запрос не верен с точки зрения моделей. Если быть точным, то запрос можно построить, но это будет костыль на костыле. поэтому те, кто в теме не лепят костылей, а пишут raw. Но таких ситуаций у вас будет не так много в реальных проектах. 2. Необходимость в таком сложном запросе сомнительна. Особенно в контексте моделей. Слишком много левых данных на один запрос. 3. Запрос скорее всего не оптимален.. разбейте его на несколько (без подзапросов) и я почти уверен, что этот запрос будет обрабатываться медленнее разбитых на части. 4. Запрос не оптимален при работе с нагрузками.. он станет узким местом. Ибо простые select работают на много быстрее сложных конструкций. К тому же на простых select можно эффективно использовать индексы, что в таком запросе сделать почти невозможно. В общем-то я в Rails тоже изредка пишу большие raw запросы... но это были b2b проекты со сложными расчетам и статистикой для маркетинговых исследований. В остальном ничего подобного не надо. А построить такой запрос можно с помощью Arel. Да, он будет выглядеть на первый взгляд странно, но при правильном подходе он станет куда более удобным в работе в будущем чем raw. Если у вас получается страшный ORM запрос, то это не значит, что запрос сложный, скорее всего это значит, что вы недостаточно хорошо разбираетесь в ORM с которой работаете и у вас проблемы с абстракцией. Что касается автора, то он тратит время) 1. Если бы он знал чего хотел, то не создал бы эту тему) 2. Скорее всего автор не углублялся особо в использование фреймворков, а значит опыта не особо. 3. Сколько у автора pull-requests и коммитов в opensource фреймворки?) Утвержденных комьюнити и находящихся в мастере? Я думаю 0 и они появятся не скоро. Могу сказать точно, что получится в результате этой темы грубый кирпич который сможет использовать только автор. 4. Писать свой фреймворк (а это громкое заявление), стоит когда ты знаешь чего хочешь точно и что тебя не устраивает в других, а главное почему ты не можешь или не хочешь исправлять это в публичных фреймворках. Когда ты поработаешь с комьюнити и начнешь понимать как найти компромисс между своими нуждами и нуждами комьюнити. В общем попробовать можно, получить какой-то опыт, но особо концентрироваться я бы не советовал) Потеряешь и время и опыт который мог бы получить с реальными фреймворками :) --------------- aBSuRD 04 Фев 2013, 14:54 2. Скорее всего автор не углублялся особо в использование фреймворков В первом посте и написано, что я работал только с yii. Остальные, за которые брался, не понравились и дальше чем до частичного просмотра документации не доходило ( CI, Kohana, Symfony ). Zend2 сейчас осваиваю. Писать свой фреймворк (а это громкое заявление), стоит когда ты знаешь чего хочешь точно и что тебя не устраивает в других, а главное почему ты не можешь или не хочешь исправлять это в публичных фреймворках опять же, первый пост --------------- san 04 Фев 2013, 15:57 aBSuRD, прочти еще раз) 1. Ты не знаешь чего хочешь - значит свое писать рано! Знал бы, то мы здесь не срач разводили, а обсуждали твой фреймворк. 2. Ты фактически не знаешь ничего о фреймворках если работал только с Yii, а другие тебе не понравились и ты только доку почитал. У тебя 100% есть недостаток в понимании паттернов. 3. Я на 100% уверен, что даже говененький CI покрывает твои задачи, но тебе кажется, что ты умнее его создателей и тебе не нужно или по твоему не красиво там что-то) Но 2 и 3 пункт это фигня, основное сказано в 1 пункте. Ты не знаешь чего хочешь поэтому работая спокойно с тем, что тебе предлагает комьюнити) Не трать свое время. --------------- aBSuRD 04 Фев 2013, 16:52 san, чего хочу - я знаю, как сделать это максимально удобным - возможно, не совсем. Поэтому и создана тема. Если тебя устраивает что-то говененькое, ты это и юзай. Есть что посоветовать? Буду благодарен. Иначе с дальнейшим кудахтаньем тебе дорога в самую чащу леса --------------- san 04 Фев 2013, 18:09 :doublefacepalm: В лес это тебе дорога, мальчик... ибо мне жаль твоего работодателя, если он будет. Я знаю чего ты хочешь.. ты хочешь "красненькую машину", а бензин или дизель, ручная или автомат, седан или хэтчбэк, передний привод или задний (или может 4x4) ты не знаешь) Не знаешь потому что ничего кроме как почитать рекламные буклеты тебя не хватило. Потому что ты хочешь все и сразу не прилагая никаких усилий к изучению. Я уже пару раз посоветовал, но ты упорно не слушаешь: иди изучай хорошие фреймворки, изучи паттерны и варианты их имплементации, напиши на каждом фреймворке по паре пробных приложений, изучи как оно работает и особенности. Тогда эта тема закроется и откроется уже с хотя бы первой версией твоего фреймворка. В остальном ты здесь ничего не написал. Ты написал "все говно, хочу свое, напишите как сделать" - это суть твоего первого поста. Покажи примеры и наброски, опиши что и как ты хочешь сделать. Тогда будет обсуждение, будет критика и советы. А пока ты лишь говоришь, что знаешь что тебе надо, не знаешь как сделать, но не говоришь что тебе надо) --------------- iNeeXT 04 Фев 2013, 19:02 ТС, sf2 можно использовать компонентами. добавлено спустя 1 минуту: san, смотрел фреймворк Phalcon? Если да, то можешь написать свое мнение. --------------- aBSuRD 04 Фев 2013, 19:02 san, ты упоротый? :fp: свободен iNeeXT, zf2 ? Сейчас его и осваиваю да смотрю, че от туда взять можно --------------- iNeeXT 04 Фев 2013, 19:11 aBSuRD, нет, Symfony 2. добавлено спустя 4 минуты: aBSuRD, реагируй адекватно, ты лишь показываешь свое невежество :fp: --------------- Okula 04 Фев 2013, 19:15 aBSuRD, посдержаннее будь. С тобой нормально общаются. --------------- Верный 04 Фев 2013, 19:30 san, привеееет=))) Давно не виделись=)))) Вот смотри. Ты пишешь про универсальность каждой черты, и тут же лепишь 4х4? А если ТС хочет полноприводный труман? Фрэймворк - рабочая область. Т.е. фрэймворки должны предоставлять инструменты для разработки. И чем они будут удобней и универсальней, тем лучше. Вот только зачем смотреть на другие фрэймворки? Достаточно иметь представление. Своё. Или перед тем как выбирать жену ты будешь спать сперва с проституткой, потом с шалавой, а потом мечтать о нормальной? Нет. И тут так же. Если делать своё - это значит делать СВОЁ, а не искать готовые решения в поисках удовлетворения своей лени. А вот дальше, как ты сам заметил, я сам могу выбрать, что мне нужно от моей машины: бензин (карбюратор)/дизель/инжектор, ручная/автомат/полуавтомат, седан/хэтчбэк/минивэн/небольшой грузовичок/грузовик, привод передний/задний/полный/с раздаткой и т.п. Или может я хочу сделать завод по производству РАЗНЫХ автомобилей? Вот только я не буду смотреть на то, на каких машинах ездят другие. Мне машина нужна для МОИХ целей, и иначе никак. Мне не нужны ЧУЖИЕ приоритеты/задачи/цели, понимаешь? И реализацию-то не особо хочется смотреть... Согласись, если тебе надо сделать СВОЙ двигатель, ты же не станешь брать двигатель от запорожца и считать его идолом, зная все его "особенности"?... Хотя говоря о фрэймворке, я бы всё же привёл пример с набором инструментов. Что я могу положить в свой чемоданчик? Это конечно будет отвёртка, молоток, гвоздодёр, шуруповёрт, дрель, дюпели и т.п. А ещё - создатель инструментов не помешает. --------------- aBSuRD 04 Фев 2013, 19:35 iNeeXT, пример кода можешь привести, из того что тебе в нем приглянулось? Или реализация каких то компонентов понравилась? Okula, общался бы нормально, нормальный ответ бы и получил --------------- iNeeXT 04 Фев 2013, 19:42 aBSuRD, сам смотри, так лучше будет. В своих проектах его еще не использовал. добавлено спустя 53 секунды: Есть еще Silex, это микро-фреймворк работающий на компонентах симфони. --------------- Flyd 04 Фев 2013, 19:43 san, привеееет=))) Давно не виделись=)))) Вот смотри. Ты пишешь про универсальность каждой черты, и тут же лепишь 4х4? А если ТС хочет полноприводный труман? Фрэймворк - рабочая область. Т.е. фрэймворки должны предоставлять инструменты для разработки. И чем они будут удобней и универсальней, тем лучше. Вот только зачем смотреть на другие фрэймворки? Достаточно иметь представление. Своё. Или перед тем как выбирать жену ты будешь спать сперва с проституткой, потом с шалавой, а потом мечтать о нормальной? Нет. И тут так же. Если делать своё - это значит делать СВОЁ, а не искать готовые решения в поисках удовлетворения своей лени. А вот дальше, как ты сам заметил, я сам могу выбрать, что мне нужно от моей машины: бензин (карбюратор)/дизель/инжектор, ручная/автомат/полуавтомат, седан/хэтчбэк/минивэн/небольшой грузовичок/грузовик, привод передний/задний/полный/с раздаткой и т.п. Или может я хочу сделать завод по производству РАЗНЫХ автомобилей? Вот только я не буду смотреть на то, на каких машинах ездят другие. Мне машина нужна для МОИХ целей, и иначе никак. Мне не нужны ЧУЖИЕ приоритеты/задачи/цели, понимаешь? И реализацию-то не особо хочется смотреть... Согласись, если тебе надо сделать СВОЙ двигатель, ты же не станешь брать двигатель от запорожца и считать его идолом, зная все его "особенности"?... Хотя говоря о фрэймворке, я бы всё же привёл пример с набором инструментов. Что я могу положить в свой чемоданчик? Это конечно будет отвёртка, молоток, гвоздодёр, шуруповёрт, дрель, дюпели и т.п. А ещё - создатель инструментов не помешает. А как ты поймешь что тебе нужно не посмотрев передний/задний/полный привод, автомат/ручку/полуавтомат? Ты думаешь самый умный и у тебя получится самый гениальный велосипед, даже не посмотрев какие велосипеды уже изобрели до тебя? --------------- iBiZoNiX 04 Фев 2013, 19:57 В начале, кстати, я бы советовал какие-нибудь микровебфрейворки. В них реализован основной функционал, а дальше полная свобода, все прозрачно. Большие фреймворки очень много на себя берут тем самым немного ограничивая твой выбор. --------------- GoRgooZ 04 Фев 2013, 20:21 aBSuRD, он с тобой нормально и общался, это ты начал дергатся, человек тебе дело говорит! Верный, неудачный пример. Нормальный производитель всегда смотрит на наработки и ошибки других! --------------- aBSuRD 04 Фев 2013, 20:24 Верный, +1, про своё и свои нужны верно подмечено iNeeXT, мне бы посмотреть, чем именно тот или иной фреймворк привлекает) Какие вкусы в этом плане у других --------------- iNeeXT 04 Фев 2013, 21:04 aBSuRD, вот http://rmcreative.ru/playground/php-frameworks/ посмотри, таблица может лгать, ибо не самые последние версии описаны. --------------- san 05 Фев 2013, 0:14 С автором разговор закончен до появления его первого велосипеда на с 2.5 колесами) Тогда можно будет конкретно обсуждать) iNeeXT, не смотрел) Я php уже почти 2.5 года толком не смотрю, так что сказать ничего не могу. добавлено спустя 19 минут: Верный, ну, во первых, доебаться до 4x4 у тебя получилось) Но косвенно) Как бы тебе объяснить... кодинг, наука, любая производственная область это область накопления знаний и опыта. С поколениями и в разных группах этот опыт и знания накапливаются, обмениваются и совершенствуются. И тут стоит говорить прямо, но только полный лох будет пытаться в одиночку воссоздать знания одной из этих групп с нуля. Фактически пройти путь заново который проходили сотни и тысячи людей и потратили миллионы человекочасов. Но понятно, что он не пройдет этого вообще без пищи извне и появится как ты сказал "свое представление". Представление собранное по обрывкам фраз на рекламных буклетах, описаниям на 1 странице каждой главы в документации и пр. Тоесть несвязные обрывки информации которые автор будет пытаться слепить. И он будет себе лепить эту кашу (я уверен по его общению), дело в другом... он уже испытывает недостаток "своего представления". Дальше будет хуже. через какое-то время такие люди появляются и пытаются выставить свой велосипед собранный из деталей которые нашлись на просторах интернета и явно не от велосипеда. После чего получают пачку жесткой критики доходящей до высмеивания (потому что таких очень много и читать одно и тоже надоедает), обижаются, срут кирпичами и начинают пытаться показаться умными. Более того, потом эти юные Эйнштейны находят работодателей пишут кривые скриптики которые потом достаются другим кодерам.. и тут наступает момент когда ты понимаешь, что надо было или руки вырвать ему когда компьютер показали первый раз или все таки попробовать показать куда двигаться и что не всегда "свое" - значит лучше. Про жену сравнение глупое.. вернее как.. фреймворк это инструмент. Если для тебя жена это посудомойка, мультиварка и резиновая кукла для траха, то может оно и так, но для меня это не главное) Машина и фреймворк - вещи и инструменты. Жена/девушка - нечто большее. И да, выбирая машину я пойду на тестдрайвы, попробую с десяток другой, почитаю отзывы, изучу теххарактеристики. С фреймворком так же - изучу доки, почитаю отзывы и статьи комьюнити, попробую пару проектиков набросать типа бложека. Лень - в программировании лень это самое ценное что у вас есть, это самый большой двигатель прогресса и генератор идей. Так что не надо на нее всех волков спускать) Свое в кодинге - это изучить лучшее, определиться какие подходы тебе не подходят и после извлечения опыта и идей из хороших реализаций собрать свою реализацию с блекджеком и шлюхами. Про машины и завод пошла какая-то каша, честно - не понял) Автор тоже знает что ему нужна машина под его требования, вот только требования он свои не знает) В этом проблема) Сравнение с ящиком инструментов очень точное. Но согласись, там всегда будут базовые инструменты ;) Кусачки, пассатижи, отвертки, молоток и т.п. Вот они вместе с ящиком и есть тот самый фреймворк. Но ты же не будешь придумывать этот инструмент сам? У автора вряд ли есть проблемы с перечнем "инструментов" в коробке. У него есть проблемы с типом инструмента) --------------- Верный 05 Фев 2013, 6:19 Flyd, это можно решить, исходя из поставленных задач перед автомобилем ;/ хотя в чём-то ты прав ;/ ---------------