Мимо кассы, просто если тратить время на функционал, а не на изобретательство велосипедов - получается экономно.
Вы держите миграции вне кода? А как вы откатываетесь, когда миграция некорректна? И как вы их контролируете? Файлами SQL инструкций? Как проводите миграции, которые требуют алгоритмического изменения данных?
Я имею в виду поддержку выпущенных продуктов. А то через полгода узнает клиент о критической уязвимости, а сообщества, которое бы ее поправить могло, и не при делах.
Стоп. Секунду. Фреймворк?! 😂
Вот и я говорю, никаких проблем. Покажите как вы за, цитирую, доли секунды подключаете RBAC к самописной системе.
Некоторым не везет, некоторым не везет особо.
А мне-то что? Меньше конкурентов - больше заработка. Я только за, самописные системы лучшие! 🍿
Эмм.. То есть даже не стандартная одна точка входа на index.php, который дальше роутит, а прям таки по Rewrite правилу на каждый action? Это чертовски круто.
Стооооп, мы же договаривались, полный контроль над кодом. Пол-ный. Так не пойдет. Только сами, только с нуля.
Ну ладно, так и быть, взяли модуль.. или не взяли? Вот честное слово, я отступлю от полного контроля, лишь бы увидеть подключение RBAC'a к самописке.
В моей картине мира есть локальные умельцы, которые загоняют 10-20 копий самописного проектов задешево, под потребность небольшого круга людей, наплевав на здравый смысл, и все прочее. И есть рынок решений, который хочет качества, надежности и предсказуемости, а предсказуемость для бизнеса - возможность заменить исполнителя среди первых статей.
Не могу не согласиться, что лучше иметь меньшее количество, и лучшее качество, но очень удивлен что бизнес заказы перепадают и на долю наколенных решений.
На счет говнокода - да, он бывает и в проектах на фреймворках, особенно если клиент жаден, и исполнители меняются раз в месяц. Но разница во времени между "сейчас я добавлю здесь метод, впишу туда логику, и моя доработка заработает", и "что это за жесть, как оно может работать, а, вот, тут стоп нет это работать не может только если не ох черт.." все равно маргинальная :)
Если интересно, вот несколько забавных фактов:
https://css-tricks.com/favicon-quiz/
Но ответ SeVlad правилен и достаточен для большинства "нормальных" сайтов.
Нюанс. В идеальном мире. Вон у товарища ушло два дня (!) на каталог квартир, который на фреймворке делается за два часа включая деплой.
И спорим, если ему потребуется поменять БД, это будет не просто замена одной строчки в конфиге, хотя, казалось бы, PDO в ядре языка, а Doctrine или ActiveRecord в двух кликах. И если ему потребуется добавить миграцию данных, это может занять часы - а может убить все данные влет. Ой, простите, это же чужой функционал - мы потеряем полный контроль над кодом. Надо написать и их с нуля.
И сколько он сделал изменений по указанным статьям за последний год? Примерно ноль. Нет, не потому, что он их сразу написал идеально.
Имея _очень_ хороший опыт в указанных областях, очень много времени и множество тестировщиков (мы же не из воздуха узнаем об ошибках и уязвимостях), а также бесконечное желание чинить их самостоятельно, можно поддерживать пару самописных проектов. Но я бы предпочел заниматься созданием функционала, а не ошибок в давно изобретенных вещах :)
Вот. Чтобы владеть всем кодом самопись лучше. Но владеть всем кодом хуже. Абстракция БД, безопасность, роутинг, модули (сколько модулей ты можешь подключить к друпалу, и сколько к самопиське? Сколько времени это займет? Как хорошо ты сможешь их поддерживать, имея хотя бы 4-5 проектов, и сотню клиентов? Или сделаешь ручкой и исчезнешь с горизонта, а новый исполнитель возьмет втрое выше рынка только потому, что в этом хозяйстве разобраться - ногу сломишь?)
Пообщались с Kedr777, очень приятный и думающий товарищ. Частично починили.
Файлы со стороны сервера:
cron/cron_create_route.php
include/find_route.php
В них дублируется код, изменения аналогичные:
1. Загрузка яндекс.карт переведена на https
$load_url='http://api-maps.yandex.ru/2.1-dev/?lang=ru-RU&load=package.full'; => $load_url='https://api-maps.yandex.ru/2.1-dev/?lang=ru-RU&load=package.full';
2. Геокодер тоже переехал на https:
get_url_from_yandex('https://geocode-maps.yandex.ru/1.x/?geocode=... => get_url_from_yandex('https://geocode-maps.yandex.ru/1.x/?geocode=...
3. Старый сервис роутинга прикрыли
$load_url='https://api-maps.yandex.ru/services/route/1.2/route.xml?
lang=ru_RU&rll='.$city_start['locality']['x'].','.$city_start['locality']['y'].'~'.$city_end['locality']['x'].','.$city_end['locality']['y'].'&token='.$match[1][0]; => $load_url='https://api-maps.yandex.ru/services/route/2.0/?lang=ru_RU&rll='.$city_start['locality']['x'].','.$city_start['locality']['y'].'~'.$city_end['locality']['x'].','.$city_end['locality']['y'].'&token='.$match[1][0];
3.1. Изменился формат отдачи данных маршрута,
$route_string=get_url_from_yandex($load_url, 5); if ($route_string!=false) { ...
Изменился значительно, но после небольшого ковыряния почти все стало на место. Кроме координат.
3.2. кроме координат
Ребята из яндекса, для добра и экономии места, закодировали все координаты в одну забавную строку вида
HKnJAc-kngNBAQAAw____-EAAACK____gQAAAG3___8gAAAAOP____D___8B____iv___879__9u_v__lfr__1n___-S_v__Kv___3T8__-w____Df7__xf____I_f__vv7__wL-__8_____a_7__6X___-w_v__PP___8j9__9N_v__XPv__6f___9h____9v7__9v-__-B_v__0P7__yD-__9h_v__kf7__xn-__8X____Tv7__5X____q_v__0v___2H____t____P____wcAAACQ____PwAAAP7-__9VAAAAJf___94BAABb_P__cQAAAFn___9-AAAAof___7sFAACl_f__IgEAAHH___9gAAAAwP___1kAAACg____oQAAABX___-5BQAAggAAAC8WAACaAQAApBUAAKkBAABVBAAAPQAAAEQFAAAPAAAAjgMAAM7____qAwAAg____wEDAAB9____QgMAAE7___81EwAAuPr__2gDAABU____QQMAAJr___8XCwAAGP___3YPAACj_v__9QYAAIL___80BgAAwf___7ADAADm____pwQAABAAAAA9DQAAwQAAAPb___-5AAAADwAAAHEAAAAsAAAAoAAAAEoAAACkAQAAtf___-oBAABWAAAAvgQAAK4AAABoAQAAufz__5cEAAD6-___TQIAAKn-__8VAAAA3_f__1MGAACH_v__agEAABP3__9xAgAAdfr__wABAAAu_P__SQIAAKr8__82AgAAF_7__z0DAAC0AAAAJQEAAAQAAABVAQAAyPz__6IFAADl_v__fQIAAEb-__8_AQAAz____2MCAAClAAAATgIAAC0AAABEAQAAJwEAAHUBAADMAAAAOwEAAKX___-8AAAA9P7__9IAAABq____OwEAAP_-__8hAQAA3f3__94BAABI_v__WwEAADP-__8xAQAAhvz__6YCAAA9_v__-AEAAA
Это порядка 60 координат. И я не знаю как их разобрать, без эмуляции браузера. Если у кого-то есть хороший, добрый и ласковый JS-монстр, можно попробовать его натравить на декодер, который вшит в АПИ яндекс.карт. Из неприятного - он минифицирован. Из приятного - он не обфусцирован. Выглядит так:
base64
"jY",function x756(e,t){var n=t.defineClass;e.define("util.base64",[],function(e){var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r={encode:function(e,r){var i=typeof e=="string";if(typeof btoa!="undefined")return i||(e=String.fromCharCode.apply(String,e)),r?btoa(e).replace(/\//g,"_").replace(/\+/g,"-"):btoa(e);var s=[],o,u,a,f,l,c,h,p=0,d=e.length,v=r?t:n;while(p<d)i?(o=e.charCodeAt(p++),u=e.charCodeAt(p++),a=e.charCodeAt(p++)):(o=e[p++],u=e[p++],a=e[p++]),f=o>>2,l=(o&3)<<4|u>>4,c=(u&15)<<2|a>>6,h=a&63,isNaN(u)?c=h=64:isNaN(a)&&(h=64),s.push(v.charAt(f),v.charAt(l),v.charAt(c),v.charAt(h));return s.join("")},decode:function(e,r){if(typeof atob!="undefined")return r?atob(e.replace(/_/g,"/").replace(/-/g,"+")):atob(e);var i=r?t:n,s=[],o,u,a,f,l,c,h,p=0,d=(e=e.replace(/[^A-Za-z0-9\-\+_\=]/g,"")).length;while(p<d)f=i.indexOf(e.charAt(p++)),l=i.indexOf(e.charAt(p++)),c=i.indexOf(e.charAt(p++)),h=i.indexOf(e.charAt(p++)),o=f<<2|l>>4,u=(l&15)<<4|c>>2,a=(c&3)<<6|h,s.push(String.fromCharCode(o)),c!=64&&s.push(String.fromCharCode(u)),h!=64&&s.push(String.fromCharCode(a));return s.join("")}};e(r)})}
coordinates.decode
"j$",function x765(e,t){var n=t.defineClass;e.define("util.coordinates.decode",["util.base64"],function(e,t){var n=1e6,r=function(e){var r=t.decode(e,!0),i=r.length,s=0,o=[0,0],u=[];while(s<i){var a=0,f=0,l=0,c=r.substr(s,8);while(l<4)a|=c.charCodeAt(l)<<l*8,f|=c.charCodeAt(l+4)<<l*8,l++;var h=[a/n,f/n],p=[h[0]+o[0],h[1]+o[1]];o=p,u.push(p),s+=8}return u};e(r)})}
Есть очень много водителей, знания которых позволяют ездить не пристегиваясь.
Почти любой современный, если используешь его согласно инструкции, а не изобретаешь велосипед. Даже серьезные CMS вроде Друпала имеют встроенную CSRF, а уж защита от SQL инъекций, пардон, уж лет 5 есть в любом продукте. Или вы знаете фреймворк без слоя абстракции БД? Поделитесь.
Про пару часов, хочу такого любого фрилансера, а лучше парочку, лет на 20. Глядишь, и миллиардик поднакоплю :) Есть подозрение что на WP это займет намного больше времени. Вечно так, сначала нафиг чистоту кода и безопасность, потом в этой куче коричневой субстанции сам автор не разберется, а потом тема на форуме, где 20 человек пытаются придумать, чем лечить внезапно почивший в бозе сайт.
Мсье тонко троллит, или действительно так считает? С нуля дольше делать, результат при сравнимых затратах времени более паршивый, и мешок проблем с безопасностью в подарок. Кому оно надо?
Каждый первый такой писатель с нуля даже не думает об экранировании переменных при записи в бд. И все JS тоже с нуля, нафиг jQuery, пускай работает только под моей версией моего любимого браузера.
Пардон, неудачно выразился. Да, ты верно сказал, экземпляр кода должен быть один, как и экземпляр БД. Но в плане доменов - все не так очевидно. Вон OLX, к примеру, сейчас посчитал что удачнее каждый город выносить на субдомен, т.е. для поисковика "сайты" разные. Возможно, ТС даже нужны сателлиты на разных доменах.
Еще один вариант - использовать разные шаблоны. Походу так это делается в вордпрессе:
#wp-config.phpswitch ( $_SERVER['HTTP_HOST'] ){ case 'example.com': define( 'WP_DEFAULT_THEME', 'blue-child' ); break; case 'example.net': define( 'WP_DEFAULT_THEME', 'red-child' ); break; default: define( 'WP_DEFAULT_THEME', 'parent-theme-slug' );}
но если там всего пара переменных - жирно выйдет.
Полагаю, такое проще собрать, чем перепилить из "несколько похожей" сборки. Готовые сборки с такими пожеланиями в свободном доступе - сомневаюсь.
Если на друпале, то:
Товары (базы, заказ рассылки) - https://www.drupal.org/project/commerce
Рассылка SMS - https://www.drupal.org/project/smsframework
Рассылка вацапов - https://www.drupal.org/project/whatsapp