Editor.target vs Editor.serializedObject

Мой ответ несколько отличается в подходе, но включает в себя многие из приведенных здесь ответов. Я бы рекомендовал многопростовый подход:

  1. .htaccess и ограничения Apache для уверенности
  2. defined('_SOMECONSTANT') or die('Hackers! Be gone!');

ОДНАКО defined or die подход имеет ряд недостатков. Во-первых, это настоящая боль в предположениях для тестирования и отладки. Во-вторых, это связано с ужасающим, умопомрачительно скучным рефакторингом, если вы передумаете. "Найти и заменить!" ты говоришь. Да, но насколько ты уверен, что все написано точно так же везде, хммм? Теперь умножьте это на тысячи файлов ... o.O

И тогда есть .htaccess. Что произойдет, если ваш код будет распространен на сайтах, где администратор не так скрупулезен? Если вы полагаетесь только на .htaccess для защиты ваших файлов, вам также понадобится: a) резервная копия, b) ящик тканей для высыхания ваших слез, c) огнетушитель, чтобы погасить огонь во всей ленте от людей используя ваш код.

Итак, я знаю, что вопрос задает «самый простой», но я думаю, что это требует более «защитного кодирования».

Я предлагаю:

  1. Перед любыми вашими сценариями require('ifyoulieyougonnadie.php'); (не include() и в качестве замены для defined or die)
  2. В ifyoulieyougonnadie.php выполните некоторые логические действия - проверьте различные константы, вызывающий скрипт, локальное тестирование и т. д., а затем реализовать ваш die(), throw new Exception, 403 и т. д. Я создаю свою собственную фреймворк с двумя возможными точками входа - основной index.php (инфраструктура Joomla) и ajaxrouter.php (моя фреймворк) - поэтому в зависимости от точки входа я проверяю разные вещи. Если запрос на ifyoulieyougonnadie.php не поступает из одного из этих двух файлов, я знаю, что принимаются махинации! Но что, если я добавлю новую точку входа? Не беспокойся. Я просто изменяю ifyoulieyougonnadie.php, и меня сортируют, а также нет «найти и заменить». Ура! Что делать, если я решил переместить некоторые мои скрипты, чтобы создать другую структуру, которая не имеет одинаковых констант defined()? ... Ура! ^ _ ^

Я нашел, что эта стратегия делает разработку намного веселее и намного меньше:

/**
 * Hmmm... why is my netbeans debugger only showing a blank white page 
 * for this script (that is being tested outside the framework)?
 * Later... I just don't understand why my code is not working...
 * Much later... There are no error messages or anything! 
 * Why is it not working!?!
 * I HATE PHP!!!
 * 
 * Scroll back to the top of my 100s of lines of code...
 * U_U
 *
 * Sorry PHP. I didn't mean what I said. I was just upset.
 */

 // defined('_JEXEC') or die();

 class perfectlyWorkingCode {}

 perfectlyWorkingCode::nowDoingStuffBecauseIRememberedToCommentOutTheDie();
2
задан Petro Koval 6 March 2019 в 16:04
поделиться

1 ответ

Хороший вопрос! Editor API docs объясняет это, но информация в основном разбросана, поэтому я подведу итог:

Для начала, есть опция CanEditMultipleObjects , которую вы в настоящее время используете. не используется. Цитата из документов:

Если этот подход используется, пользователь может выбрать несколько активов в окне иерархии и изменить значения для всех них одновременно.

Для базового примера этого выберите два GameObjects в вашей сцене, которые имеют одинаковый компонент Unity (например, Image или Rigidbody), и вы сможете изменять эти компоненты на в то же время, чтобы иметь одинаковые значения. Большинство встроенных компонентов поддерживают его.

Это первое преимущество использования serializedObject; он поддерживает редактирование нескольких объектов, а Editor.target - нет (для этого вам понадобится Editor.targets ). Так что теперь, если вам интересно, « почему бы мне просто не использовать Editor.targets для многообъектного редактирования? », рассмотрите эту цитату из документов:

Вместо Для непосредственного изменения переменных сценария выгодно использовать системы SerializedObject и SerializedProperty для их редактирования, поскольку это автоматически обрабатывает многообъектное редактирование, отмену и переопределение Prefab .

Суть этого сводится к тому, что если вы не хотите, чтобы функции отмены, переопределения и автоматического редактирования мультиобъектов выполнялись для вас автоматически, просто используйте Editor.target или Editor.targets. Если вы хотите, чтобы эти функции просто работали автоматически, используйте SerializedObject и SerializedProperty.

0
ответ дан Foggzie 6 March 2019 в 16:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: