Fork me on GitHub

Сервисы

Сервисы для клиентского приложения расположены в директории public/js/app/services/.

Клиентское приложение имеет разные виды сервисов:

  1. Ввод даты в поле формы, Datepicker.class.js
  2. Валидация данных в форме, FormValidation.class.js
  3. Подсветка кода, Highlight.class.js
  4. Форматирование ввода, MaskInput.class.js

Добавление сервисов на клиенте

Существует три переменных, с помощью которых происходит добавление сервисов на клиенте:

  1. Список классов сервисов window.BSA.ScriptResources = ['FormValidation', 'Datepicker', ...]
  2. объект параметров сервисов window.BSA.ScriptParams = {FormValidation:[{params-1},{params-2}, ...], ...}
  3. объект экземпляров сервисов window.BSA.ScriptInstances = {FormValidation:[Obj1, Obj2, ...], ...}

Эти переменные задаются в файле app/Views/Include/add.resources.html.twig.

<!-- Add script resources -->
<script type="text/javascript">
    if ( undefined === window.BSA) {
        window.BSA = {};
        // List script resources
        window.BSA.ScriptResources = [];
        // List script parameters
        window.BSA.ScriptParams = {};
        // List object instances 
        window.BSA.ScriptInstances = {};
        ...
    }
</script> 

Код добавление классов сервисов и их параметров можно посмотреть ниже:

Файл app/Views/Controller/blog/new.html.twig.

<!-- Add Resources (required) -->
...
<script type="text/javascript">
    BSA.ScriptResources.push('FormValidation');
    addScriptParams('FormValidation',
            {
                form: 'form[name="post"]',
                rules: {
                    "post[created]": {
                        required: true
                    },
                    "post[title]": {
                        required: true,
                        minlength: 5
                    },
                    "post[body]": {
                        required: true
                    }
                }
            });
    ...        
</script>

Функция addScriptParams определена в файле app/Views/Include/add.resources.html.twig.

Для создания экземпляра объекта сервиса и сохранения его в переменной window.BSA.ScriptInstances используется классовый метод RegRunOnLoad, который определен в классах сервисов. Выполняются эти методы в функции init класса App public/js/app/app.js.

Пример кода приведен ниже:

...
// Add script resources 
if (undefined !== window.BSA) {
    _.each(BSA.ScriptResources, function (resource) {
        require([resource], function (res) {
            // Create resource object 
            if (res && res.RegRunOnLoad) {
                res.RegRunOnLoad();
            }
        });
    });
}
...

С помощью функции require загружается сам сервис и все его зависимости, которые определены в файле public/js/main.js.

Обратиться к экземпляру объекта сервиса можно например так:

var oFormValidation1 = BSA.ScriptInstances['FormValidation'][0];
oFormValidation1.Validate();

Структура сервисов

Классы сервисов как и другие классы создаются с помощью Class.extend public/js/lib/Extend.class.js.

Более подробно можно посмотреть здесь

Основные способы использования:

 Class.extend(props)
 Class.extend(props, staticProps)
 Class.extend([mixins], props)
 Class.extend([mixins], props, staticProps)

Например структура сервиса public/js/app/services/Highlight.class выглядит так:

define(['jquery'], function ($) {
    var Highlight = Class.extend({
        init: function (params) {
            try {
            ...
            } catch (ex) {
                if (ex instanceof Error) {
                    app.sys.onFailure(ex.name + ": " + ex.message);
                }
            }
        }
    }, {
        RegRunOnLoad: function () {
        ...
        }
    });
    return Highlight;
});

Здесь init есть функция инициализации создаваемого объекта, а RegRunOnLoad есть классовая (статическая) функция создания экземпляра объекта и помещение его в переменную BSA.ScriptInstances

BSA.ScriptInstances['Highlight'] = [new Highlight(param)];