PHP_METHOD(Test_Instance, testInstanceCreate) { zend_long ZEPHIR_LAST_CALL_STATUS; zval *className_param = NULL; zval className; zval *this_ptr = getThis(); ZVAL_UNDEF(&className); ZEPHIR_MM_GROW(); zephir_fetch_params(1, 1, 0, &className_param); zephir_get_strval(&className, className_param); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(return_value, &className TSRMLS_CC); zephir_check_call_status(); RETURN_MM(); }
/** * Resolves the service based on its configuration */ PHP_METHOD(Phalcon_Di, get) { zend_bool _6$$6; zval *_1$$3, *_7$$12; int ZEPHIR_LAST_CALL_STATUS; zval *name_param = NULL, *parameters = NULL, *service = NULL, *eventsManager = NULL, *instance = NULL, *_0, *_2$$3, *_3$$4, *_4$$7, *_8$$12; zval *name = NULL, *_5$$7; ZEPHIR_MM_GROW(); zephir_fetch_params(1, 1, 1, &name_param, ¶meters); if (unlikely(Z_TYPE_P(name_param) != IS_STRING && Z_TYPE_P(name_param) != IS_NULL)) { zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'name' must be a string") TSRMLS_CC); RETURN_MM_NULL(); } if (likely(Z_TYPE_P(name_param) == IS_STRING)) { zephir_get_strval(name, name_param); } else { ZEPHIR_INIT_VAR(name); ZVAL_EMPTY_STRING(name); } if (!parameters) { parameters = ZEPHIR_GLOBAL(global_null); } ZEPHIR_INIT_VAR(instance); ZVAL_NULL(instance); _0 = zephir_fetch_nproperty_this(this_ptr, SL("_eventsManager"), PH_NOISY_CC); ZEPHIR_CPY_WRT(eventsManager, _0); if (Z_TYPE_P(eventsManager) == IS_OBJECT) { ZEPHIR_INIT_VAR(_1$$3); zephir_create_array(_1$$3, 2, 0 TSRMLS_CC); zephir_array_update_string(&_1$$3, SL("name"), &name, PH_COPY | PH_SEPARATE); zephir_array_update_string(&_1$$3, SL("parameters"), ¶meters, PH_COPY | PH_SEPARATE); ZEPHIR_INIT_VAR(_2$$3); ZVAL_STRING(_2$$3, "di:beforeServiceResolve", ZEPHIR_TEMP_PARAM_COPY); ZEPHIR_CALL_METHOD(&instance, eventsManager, "fire", NULL, 0, _2$$3, this_ptr, _1$$3); zephir_check_temp_parameter(_2$$3); zephir_check_call_status(); } if (Z_TYPE_P(instance) != IS_OBJECT) { ZEPHIR_OBS_VAR(service); _3$$4 = zephir_fetch_nproperty_this(this_ptr, SL("_services"), PH_NOISY_CC); if (zephir_array_isset_fetch(&service, _3$$4, name, 0 TSRMLS_CC)) { ZEPHIR_CALL_METHOD(&instance, service, "resolve", NULL, 0, parameters, this_ptr); zephir_check_call_status(); } else { if (!(zephir_class_exists(name, 1 TSRMLS_CC))) { ZEPHIR_INIT_VAR(_4$$7); object_init_ex(_4$$7, phalcon_di_exception_ce); ZEPHIR_INIT_VAR(_5$$7); ZEPHIR_CONCAT_SVS(_5$$7, "Service '", name, "' wasn't found in the dependency injection container"); ZEPHIR_CALL_METHOD(NULL, _4$$7, "__construct", NULL, 9, _5$$7); zephir_check_call_status(); zephir_throw_exception_debug(_4$$7, "phalcon/di.zep", 236 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } _6$$6 = Z_TYPE_P(parameters) == IS_ARRAY; if (_6$$6) { _6$$6 = ((zephir_fast_count_int(parameters TSRMLS_CC)) ? 1 : 0); } if (_6$$6) { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance_params(instance, name, parameters TSRMLS_CC); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(instance, name TSRMLS_CC); zephir_check_call_status(); } } } if (Z_TYPE_P(instance) == IS_OBJECT) { if (zephir_instance_of_ev(instance, phalcon_di_injectionawareinterface_ce TSRMLS_CC)) { ZEPHIR_CALL_METHOD(NULL, instance, "setdi", NULL, 0, this_ptr); zephir_check_call_status(); } } if (Z_TYPE_P(eventsManager) == IS_OBJECT) { ZEPHIR_INIT_VAR(_7$$12); zephir_create_array(_7$$12, 3, 0 TSRMLS_CC); zephir_array_update_string(&_7$$12, SL("name"), &name, PH_COPY | PH_SEPARATE); zephir_array_update_string(&_7$$12, SL("parameters"), ¶meters, PH_COPY | PH_SEPARATE); zephir_array_update_string(&_7$$12, SL("instance"), &instance, PH_COPY | PH_SEPARATE); ZEPHIR_INIT_VAR(_8$$12); ZVAL_STRING(_8$$12, "di:afterServiceResolve", ZEPHIR_TEMP_PARAM_COPY); ZEPHIR_CALL_METHOD(NULL, eventsManager, "fire", NULL, 0, _8$$12, this_ptr, _7$$12); zephir_check_temp_parameter(_8$$12); zephir_check_call_status(); } RETURN_CCTOR(instance); }
/** * Creates an ItemPool for the given namespace. * * @param string namespaceName * * @return \Xpl\Cache\ItemPool */ PHP_METHOD(Xpl_Cache_Cache, createPool) { int ZEPHIR_LAST_CALL_STATUS; zval *name_param = NULL, *config = NULL, *driver = NULL, *driverClass = NULL, *prefix = NULL, *cachePrefix = NULL, *defaultTtl = NULL, *_0, *_5, *_1$$5, _2$$5, *_3$$5; zval *name = NULL, *_4$$7; ZEPHIR_MM_GROW(); zephir_fetch_params(1, 1, 0, &name_param); if (unlikely(Z_TYPE_P(name_param) != IS_STRING && Z_TYPE_P(name_param) != IS_NULL)) { zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'name' must be a string") TSRMLS_CC); RETURN_MM_NULL(); } if (likely(Z_TYPE_P(name_param) == IS_STRING)) { zephir_get_strval(name, name_param); } else { ZEPHIR_INIT_VAR(name); ZVAL_EMPTY_STRING(name); } ZEPHIR_CALL_METHOD(&config, this_ptr, "getconfig", NULL, 0, name); zephir_check_call_status(); ZEPHIR_OBS_VAR(driverClass); if (zephir_array_isset_string_fetch(&driverClass, config, SS("driver"), 0 TSRMLS_CC)) { ZEPHIR_INIT_VAR(driver); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(driver, driverClass TSRMLS_CC); zephir_check_call_status(); } else { ZEPHIR_CALL_METHOD(&driver, this_ptr, "getdriver", NULL, 0); zephir_check_call_status(); } _0 = zephir_fetch_nproperty_this(this_ptr, SL("prefix"), PH_NOISY_CC); ZEPHIR_CPY_WRT(prefix, _0); ZEPHIR_OBS_VAR(cachePrefix); if (zephir_array_isset_string_fetch(&cachePrefix, config, SS("prefix"), 0 TSRMLS_CC)) { ZEPHIR_INIT_VAR(_1$$5); ZEPHIR_SINIT_VAR(_2$$5); ZVAL_STRING(&_2$$5, ".", 0); zephir_fast_trim(_1$$5, cachePrefix, &_2$$5, ZEPHIR_TRIM_BOTH TSRMLS_CC); ZEPHIR_INIT_VAR(_3$$5); ZEPHIR_CONCAT_VS(_3$$5, _1$$5, "."); zephir_concat_self(&prefix, _3$$5 TSRMLS_CC); } else { if (!ZEPHIR_IS_STRING_IDENTICAL(name, "default")) { ZEPHIR_INIT_VAR(_4$$7); ZEPHIR_CONCAT_VS(_4$$7, name, "."); zephir_concat_self(&prefix, _4$$7 TSRMLS_CC); } } ZEPHIR_OBS_VAR(defaultTtl); if (!(zephir_array_isset_string_fetch(&defaultTtl, config, SS("default_ttl"), 0 TSRMLS_CC))) { ZEPHIR_INIT_NVAR(defaultTtl); ZVAL_LONG(defaultTtl, 0); } object_init_ex(return_value, xpl_cache_itempool_ce); ZEPHIR_INIT_VAR(_5); ZVAL_LONG(_5, zephir_get_intval(defaultTtl)); ZEPHIR_CALL_METHOD(NULL, return_value, "__construct", NULL, 26, driver, prefix, _5); zephir_check_call_status(); RETURN_MM(); }
/** * Resolves the service * * @param array parameters * @param \Phalcon\DiInterface dependencyInjector * @return mixed */ PHP_METHOD(Phalcon_Di_Service, resolve) { zend_class_entry *_1$$15; zend_bool found = 0; int ZEPHIR_LAST_CALL_STATUS; zval *parameters = NULL, *dependencyInjector = NULL, *shared = NULL, *definition = NULL, *sharedInstance = NULL, *instance = NULL, *builder = NULL, *_0$$15 = NULL, *_2$$22, *_3$$22, *_4$$22; ZEPHIR_MM_GROW(); zephir_fetch_params(1, 0, 2, ¶meters, &dependencyInjector); if (!parameters) { parameters = ZEPHIR_GLOBAL(global_null); } if (!dependencyInjector) { dependencyInjector = ZEPHIR_GLOBAL(global_null); } ZEPHIR_OBS_VAR(shared); zephir_read_property_this(&shared, this_ptr, SL("_shared"), PH_NOISY_CC); if (zephir_is_true(shared)) { ZEPHIR_OBS_VAR(sharedInstance); zephir_read_property_this(&sharedInstance, this_ptr, SL("_sharedInstance"), PH_NOISY_CC); if (Z_TYPE_P(sharedInstance) != IS_NULL) { RETURN_CCTOR(sharedInstance); } } found = 1; ZEPHIR_INIT_VAR(instance); ZVAL_NULL(instance); ZEPHIR_OBS_VAR(definition); zephir_read_property_this(&definition, this_ptr, SL("_definition"), PH_NOISY_CC); if (Z_TYPE_P(definition) == IS_STRING) { if (zephir_class_exists(definition, 1 TSRMLS_CC)) { if (Z_TYPE_P(parameters) == IS_ARRAY) { if (zephir_fast_count_int(parameters TSRMLS_CC)) { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance_params(instance, definition, parameters TSRMLS_CC); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(instance, definition TSRMLS_CC); zephir_check_call_status(); } } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(instance, definition TSRMLS_CC); zephir_check_call_status(); } } else { found = 0; } } else { if (Z_TYPE_P(definition) == IS_OBJECT) { if (zephir_instance_of_ev(definition, zend_ce_closure TSRMLS_CC)) { if (Z_TYPE_P(dependencyInjector) == IS_OBJECT) { _1$$15 = zend_fetch_class(SL("Closure"), ZEND_FETCH_CLASS_AUTO TSRMLS_CC); ZEPHIR_CALL_CE_STATIC(&_0$$15, _1$$15, "bind", NULL, 0, definition, dependencyInjector); zephir_check_call_status(); ZEPHIR_CPY_WRT(definition, _0$$15); } if (Z_TYPE_P(parameters) == IS_ARRAY) { ZEPHIR_INIT_NVAR(instance); ZEPHIR_CALL_USER_FUNC_ARRAY(instance, definition, parameters); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_CALL_USER_FUNC(instance, definition); zephir_check_call_status(); } } else { ZEPHIR_CPY_WRT(instance, definition); } } else { if (Z_TYPE_P(definition) == IS_ARRAY) { ZEPHIR_INIT_VAR(builder); object_init_ex(builder, phalcon_di_service_builder_ce); if (zephir_has_constructor(builder TSRMLS_CC)) { ZEPHIR_CALL_METHOD(NULL, builder, "__construct", NULL, 0); zephir_check_call_status(); } ZEPHIR_CALL_METHOD(&instance, builder, "build", NULL, 181, dependencyInjector, definition, parameters); zephir_check_call_status(); } else { found = 0; } } } if (found == 0) { ZEPHIR_INIT_VAR(_2$$22); object_init_ex(_2$$22, phalcon_di_exception_ce); _3$$22 = zephir_fetch_nproperty_this(this_ptr, SL("_name"), PH_NOISY_CC); ZEPHIR_INIT_VAR(_4$$22); ZEPHIR_CONCAT_SVS(_4$$22, "Service '", _3$$22, "' cannot be resolved"); ZEPHIR_CALL_METHOD(NULL, _2$$22, "__construct", NULL, 9, _4$$22); zephir_check_call_status(); zephir_throw_exception_debug(_2$$22, "phalcon/di/service.zep", 208 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } if (zephir_is_true(shared)) { zephir_update_property_this(this_ptr, SL("_sharedInstance"), instance TSRMLS_CC); } if (1) { zephir_update_property_this(this_ptr, SL("_resolved"), ZEPHIR_GLOBAL(global_true) TSRMLS_CC); } else { zephir_update_property_this(this_ptr, SL("_resolved"), ZEPHIR_GLOBAL(global_false) TSRMLS_CC); } RETURN_CCTOR(instance); }
/** * Resolves the service based on its configuration * * @param string name * @param array parameters * @return mixed */ PHP_METHOD(Phalcon_Di, get) { zephir_nts_static zephir_fcall_cache_entry *_4 = NULL, *_5 = NULL, *_6 = NULL, *_8 = NULL; zval *_1 = NULL; int ZEPHIR_LAST_CALL_STATUS; zval *name_param = NULL, *parameters = NULL, *service, *instance = NULL, *reflection = NULL, *eventsManager = NULL, *_0 = NULL, *_2 = NULL, *_3; zval *name = NULL, *_7; ZEPHIR_MM_GROW(); zephir_fetch_params(1, 1, 1, &name_param, ¶meters); if (unlikely(Z_TYPE_P(name_param) != IS_STRING && Z_TYPE_P(name_param) != IS_NULL)) { zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'name' must be a string") TSRMLS_CC); RETURN_MM_NULL(); } if (likely(Z_TYPE_P(name_param) == IS_STRING)) { zephir_get_strval(name, name_param); } else { ZEPHIR_INIT_VAR(name); ZVAL_EMPTY_STRING(name); } if (!parameters) { parameters = ZEPHIR_GLOBAL(global_null); } ZEPHIR_CALL_METHOD(&_0, this_ptr, "geteventsmanager", NULL); zephir_check_call_status(); ZEPHIR_CPY_WRT(eventsManager, _0); if (Z_TYPE_P(eventsManager) == IS_OBJECT) { ZEPHIR_INIT_VAR(_1); zephir_create_array(_1, 2, 0 TSRMLS_CC); zephir_array_update_string(&_1, SL("name"), &name, PH_COPY | PH_SEPARATE); zephir_array_update_string(&_1, SL("parameters"), ¶meters, PH_COPY | PH_SEPARATE); ZEPHIR_INIT_VAR(_2); ZVAL_STRING(_2, "di:beforeServiceResolve", ZEPHIR_TEMP_PARAM_COPY); ZEPHIR_CALL_METHOD(NULL, eventsManager, "fire", NULL, _2, this_ptr, _1); zephir_check_temp_parameter(_2); zephir_check_call_status(); } ZEPHIR_OBS_VAR(service); _3 = zephir_fetch_nproperty_this(this_ptr, SL("_services"), PH_NOISY_CC); if (zephir_array_isset_fetch(&service, _3, name, 0 TSRMLS_CC)) { ZEPHIR_CALL_METHOD(&instance, service, "resolve", NULL, parameters, this_ptr); zephir_check_call_status(); } else { if (zephir_class_exists(name, 1 TSRMLS_CC)) { if (Z_TYPE_P(parameters) == IS_ARRAY) { if (zephir_fast_count_int(parameters TSRMLS_CC)) { if (zephir_is_php_version(50600)) { ZEPHIR_INIT_VAR(reflection); object_init_ex(reflection, zephir_get_internal_ce(SS("reflectionclass") TSRMLS_CC)); ZEPHIR_CALL_METHOD(NULL, reflection, "__construct", &_4, name); zephir_check_call_status(); ZEPHIR_CALL_METHOD(&instance, reflection, "newinstanceargs", &_5, parameters); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance_params(instance, name, parameters TSRMLS_CC); zephir_check_call_status(); } } else { if (zephir_is_php_version(50600)) { ZEPHIR_INIT_NVAR(reflection); object_init_ex(reflection, zephir_get_internal_ce(SS("reflectionclass") TSRMLS_CC)); ZEPHIR_CALL_METHOD(NULL, reflection, "__construct", &_4, name); zephir_check_call_status(); ZEPHIR_CALL_METHOD(&instance, reflection, "newinstance", &_6); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(instance, name TSRMLS_CC); zephir_check_call_status(); } } } else { if (zephir_is_php_version(50600)) { ZEPHIR_INIT_NVAR(reflection); object_init_ex(reflection, zephir_get_internal_ce(SS("reflectionclass") TSRMLS_CC)); ZEPHIR_CALL_METHOD(NULL, reflection, "__construct", &_4, name); zephir_check_call_status(); ZEPHIR_CALL_METHOD(&instance, reflection, "newinstance", &_6); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(instance, name TSRMLS_CC); zephir_check_call_status(); } } } else { ZEPHIR_INIT_NVAR(_2); object_init_ex(_2, phalcon_di_exception_ce); ZEPHIR_INIT_VAR(_7); ZEPHIR_CONCAT_SVS(_7, "Service '", name, "' wasn't found in the dependency injection container"); ZEPHIR_CALL_METHOD(NULL, _2, "__construct", &_8, _7); zephir_check_call_status(); zephir_throw_exception_debug(_2, "phalcon/di.zep", 246 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } } if (Z_TYPE_P(instance) == IS_OBJECT) { if (zephir_instance_of_ev(instance, phalcon_di_injectionawareinterface_ce TSRMLS_CC)) { ZEPHIR_CALL_METHOD(NULL, instance, "setdi", NULL, this_ptr); zephir_check_call_status(); } } if (Z_TYPE_P(eventsManager) == IS_OBJECT) { if (Z_TYPE_P(instance) == IS_OBJECT) { if (zephir_instance_of_ev(instance, phalcon_events_eventsawareinterface_ce TSRMLS_CC)) { ZEPHIR_CALL_METHOD(NULL, instance, "seteventsmanager", NULL, eventsManager); zephir_check_call_status(); } } ZEPHIR_INIT_NVAR(_1); zephir_create_array(_1, 3, 0 TSRMLS_CC); zephir_array_update_string(&_1, SL("name"), &name, PH_COPY | PH_SEPARATE); zephir_array_update_string(&_1, SL("parameters"), ¶meters, PH_COPY | PH_SEPARATE); zephir_array_update_string(&_1, SL("instance"), &instance, PH_COPY | PH_SEPARATE); ZEPHIR_INIT_NVAR(_2); ZVAL_STRING(_2, "di:afterServiceResolve", ZEPHIR_TEMP_PARAM_COPY); ZEPHIR_CALL_METHOD(NULL, eventsManager, "fire", NULL, _2, this_ptr, _1); zephir_check_temp_parameter(_2); zephir_check_call_status(); } RETURN_CCTOR(instance); }
/** * Resolves the service * * @param array parameters * @return mixed */ PHP_METHOD(Phalcon_Di_Service, resolve) { zend_class_entry *_1$$15; zend_bool found = 0; zend_long ZEPHIR_LAST_CALL_STATUS; zval *parameters = NULL, parameters_sub, *dependencyInjector = NULL, dependencyInjector_sub, __$true, __$false, __$null, shared, definition, sharedInstance, instance, builder, _0$$15, _2$$22; zval *this_ptr = getThis(); ZVAL_UNDEF(¶meters_sub); ZVAL_UNDEF(&dependencyInjector_sub); ZVAL_BOOL(&__$true, 1); ZVAL_BOOL(&__$false, 0); ZVAL_NULL(&__$null); ZVAL_UNDEF(&shared); ZVAL_UNDEF(&definition); ZVAL_UNDEF(&sharedInstance); ZVAL_UNDEF(&instance); ZVAL_UNDEF(&builder); ZVAL_UNDEF(&_0$$15); ZVAL_UNDEF(&_2$$22); ZEPHIR_MM_GROW(); zephir_fetch_params(1, 0, 2, ¶meters, &dependencyInjector); if (!parameters) { parameters = ¶meters_sub; parameters = &__$null; } if (!dependencyInjector) { dependencyInjector = &dependencyInjector_sub; dependencyInjector = &__$null; } ZEPHIR_OBS_VAR(&shared); zephir_read_property(&shared, this_ptr, SL("_shared"), PH_NOISY_CC); if (zephir_is_true(&shared)) { ZEPHIR_OBS_VAR(&sharedInstance); zephir_read_property(&sharedInstance, this_ptr, SL("_sharedInstance"), PH_NOISY_CC); if (Z_TYPE_P(&sharedInstance) != IS_NULL) { RETURN_CCTOR(&sharedInstance); } } found = 1; ZEPHIR_INIT_VAR(&instance); ZVAL_NULL(&instance); ZEPHIR_OBS_VAR(&definition); zephir_read_property(&definition, this_ptr, SL("_definition"), PH_NOISY_CC); if (Z_TYPE_P(&definition) == IS_STRING) { if (zephir_class_exists(&definition, 1 TSRMLS_CC)) { if (Z_TYPE_P(parameters) == IS_ARRAY) { if (zephir_fast_count_int(parameters TSRMLS_CC)) { ZEPHIR_INIT_NVAR(&instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance_params(&instance, &definition, parameters TSRMLS_CC); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(&instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(&instance, &definition TSRMLS_CC); zephir_check_call_status(); } } else { ZEPHIR_INIT_NVAR(&instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(&instance, &definition TSRMLS_CC); zephir_check_call_status(); } } else { found = 0; } } else { if (Z_TYPE_P(&definition) == IS_OBJECT) { if (zephir_instance_of_ev(&definition, zend_ce_closure TSRMLS_CC)) { if (Z_TYPE_P(dependencyInjector) == IS_OBJECT) { _1$$15 = zephir_fetch_class_str_ex(SL("Closure"), ZEND_FETCH_CLASS_AUTO); ZEPHIR_CALL_CE_STATIC(&_0$$15, _1$$15, "bind", NULL, 0, &definition, dependencyInjector); zephir_check_call_status(); ZEPHIR_CPY_WRT(&definition, &_0$$15); } if (Z_TYPE_P(parameters) == IS_ARRAY) { ZEPHIR_INIT_NVAR(&instance); ZEPHIR_CALL_USER_FUNC_ARRAY(&instance, &definition, parameters); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(&instance); ZEPHIR_CALL_USER_FUNC(&instance, &definition); zephir_check_call_status(); } } else { ZEPHIR_CPY_WRT(&instance, &definition); } } else { if (Z_TYPE_P(&definition) == IS_ARRAY) { ZEPHIR_INIT_VAR(&builder); object_init_ex(&builder, phalcon_di_service_builder_ce); if (zephir_has_constructor(&builder TSRMLS_CC)) { ZEPHIR_CALL_METHOD(NULL, &builder, "__construct", NULL, 0); zephir_check_call_status(); } ZEPHIR_CALL_METHOD(&instance, &builder, "build", NULL, 171, dependencyInjector, &definition, parameters); zephir_check_call_status(); } else { found = 0; } } } if (found == 0) { ZEPHIR_INIT_VAR(&_2$$22); object_init_ex(&_2$$22, phalcon_di_exception_serviceresolutionexception_ce); ZEPHIR_CALL_METHOD(NULL, &_2$$22, "__construct", NULL, 4); zephir_check_call_status(); zephir_throw_exception_debug(&_2$$22, "phalcon/di/service.zep", 186 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } if (zephir_is_true(&shared)) { zephir_update_property_zval(this_ptr, SL("_sharedInstance"), &instance); } if (1) { zephir_update_property_zval(this_ptr, SL("_resolved"), &__$true); } else { zephir_update_property_zval(this_ptr, SL("_resolved"), &__$false); } RETURN_CCTOR(&instance); }
/** * Builds a service using a complex service definition * * @param \Phalcon\DiInterface dependencyInjector * @param array definition * @param array parameters * @return mixed */ PHP_METHOD(Phalcon_Di_Service_Builder, build) { HashTable *_3, *_9; HashPosition _2, _8; zephir_fcall_cache_entry *_1 = NULL, *_7 = NULL, *_12 = NULL; int ZEPHIR_LAST_CALL_STATUS; zval *definition = NULL; zval *dependencyInjector, *definition_param = NULL, *parameters = NULL, *className, *arguments = NULL, *paramCalls = NULL, *methodPosition = NULL, *method = NULL, *methodName = NULL, *methodCall = NULL, *instance = NULL, *propertyPosition = NULL, *property = NULL, *propertyName = NULL, *propertyValue = NULL, *_0 = NULL, **_4, *_5 = NULL, *_6 = NULL, **_10, *_11 = NULL; ZEPHIR_MM_GROW(); zephir_fetch_params(1, 2, 1, &dependencyInjector, &definition_param, ¶meters); definition = definition_param; if (!parameters) { parameters = ZEPHIR_GLOBAL(global_null); } ZEPHIR_OBS_VAR(className); if (!(zephir_array_isset_string_fetch(&className, definition, SS("className"), 0 TSRMLS_CC))) { ZEPHIR_THROW_EXCEPTION_DEBUG_STR(phalcon_di_exception_ce, "Invalid service definition. Missing 'className' parameter", "phalcon/di/service/builder.zep", 140); return; } if (Z_TYPE_P(parameters) == IS_ARRAY) { if (zephir_fast_count_int(parameters TSRMLS_CC)) { ZEPHIR_INIT_VAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance_params(instance, className, parameters TSRMLS_CC); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(instance, className TSRMLS_CC); zephir_check_call_status(); } } else { ZEPHIR_OBS_VAR(arguments); if (zephir_array_isset_string_fetch(&arguments, definition, SS("arguments"), 0 TSRMLS_CC)) { ZEPHIR_CALL_METHOD(&_0, this_ptr, "_buildparameters", &_1, 178, dependencyInjector, arguments); zephir_check_call_status(); ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance_params(instance, className, _0 TSRMLS_CC); zephir_check_call_status(); } else { ZEPHIR_INIT_NVAR(instance); ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(instance, className TSRMLS_CC); zephir_check_call_status(); } } ZEPHIR_OBS_VAR(paramCalls); if (zephir_array_isset_string_fetch(¶mCalls, definition, SS("calls"), 0 TSRMLS_CC)) { if (Z_TYPE_P(instance) != IS_OBJECT) { ZEPHIR_THROW_EXCEPTION_DEBUG_STR(phalcon_di_exception_ce, "The definition has setter injection parameters but the constructor didn't return an instance", "phalcon/di/service/builder.zep", 177); return; } if (Z_TYPE_P(paramCalls) != IS_ARRAY) { ZEPHIR_THROW_EXCEPTION_DEBUG_STR(phalcon_di_exception_ce, "Setter injection parameters must be an array", "phalcon/di/service/builder.zep", 181); return; } zephir_is_iterable(paramCalls, &_3, &_2, 0, 0, "phalcon/di/service/builder.zep", 233); for ( ; zephir_hash_get_current_data_ex(_3, (void**) &_4, &_2) == SUCCESS ; zephir_hash_move_forward_ex(_3, &_2) ) { ZEPHIR_GET_HMKEY(methodPosition, _3, _2); ZEPHIR_GET_HVALUE(method, _4); if (Z_TYPE_P(method) != IS_ARRAY) { ZEPHIR_INIT_NVAR(_5); object_init_ex(_5, phalcon_di_exception_ce); ZEPHIR_INIT_LNVAR(_6); ZEPHIR_CONCAT_SV(_6, "Method call must be an array on position ", methodPosition); ZEPHIR_CALL_METHOD(NULL, _5, "__construct", &_7, 9, _6); zephir_check_call_status(); zephir_throw_exception_debug(_5, "phalcon/di/service/builder.zep", 193 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } ZEPHIR_OBS_NVAR(methodName); if (!(zephir_array_isset_string_fetch(&methodName, method, SS("method"), 0 TSRMLS_CC))) { ZEPHIR_INIT_NVAR(_5); object_init_ex(_5, phalcon_di_exception_ce); ZEPHIR_INIT_LNVAR(_6); ZEPHIR_CONCAT_SV(_6, "The method name is required on position ", methodPosition); ZEPHIR_CALL_METHOD(NULL, _5, "__construct", &_7, 9, _6); zephir_check_call_status(); zephir_throw_exception_debug(_5, "phalcon/di/service/builder.zep", 200 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } ZEPHIR_INIT_NVAR(methodCall); zephir_create_array(methodCall, 2, 0 TSRMLS_CC); zephir_array_fast_append(methodCall, instance); zephir_array_fast_append(methodCall, methodName); ZEPHIR_OBS_NVAR(arguments); if (zephir_array_isset_string_fetch(&arguments, method, SS("arguments"), 0 TSRMLS_CC)) { if (Z_TYPE_P(arguments) != IS_ARRAY) { ZEPHIR_INIT_NVAR(_5); object_init_ex(_5, phalcon_di_exception_ce); ZEPHIR_INIT_LNVAR(_6); ZEPHIR_CONCAT_SV(_6, "Call arguments must be an array ", methodPosition); ZEPHIR_CALL_METHOD(NULL, _5, "__construct", &_7, 9, _6); zephir_check_call_status(); zephir_throw_exception_debug(_5, "phalcon/di/service/builder.zep", 211 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } if (zephir_fast_count_int(arguments TSRMLS_CC)) { ZEPHIR_INIT_NVAR(_5); ZEPHIR_CALL_METHOD(&_0, this_ptr, "_buildparameters", &_1, 178, dependencyInjector, arguments); zephir_check_call_status(); ZEPHIR_CALL_USER_FUNC_ARRAY(_5, methodCall, _0); zephir_check_call_status(); continue; } } ZEPHIR_INIT_NVAR(_5); ZEPHIR_CALL_USER_FUNC(_5, methodCall); zephir_check_call_status(); } } ZEPHIR_OBS_NVAR(paramCalls); if (zephir_array_isset_string_fetch(¶mCalls, definition, SS("properties"), 0 TSRMLS_CC)) { if (Z_TYPE_P(instance) != IS_OBJECT) { ZEPHIR_THROW_EXCEPTION_DEBUG_STR(phalcon_di_exception_ce, "The definition has properties injection parameters but the constructor didn't return an instance", "phalcon/di/service/builder.zep", 241); return; } if (Z_TYPE_P(paramCalls) != IS_ARRAY) { ZEPHIR_THROW_EXCEPTION_DEBUG_STR(phalcon_di_exception_ce, "Setter injection parameters must be an array", "phalcon/di/service/builder.zep", 245); return; } zephir_is_iterable(paramCalls, &_9, &_8, 0, 0, "phalcon/di/service/builder.zep", 279); for ( ; zephir_hash_get_current_data_ex(_9, (void**) &_10, &_8) == SUCCESS ; zephir_hash_move_forward_ex(_9, &_8) ) { ZEPHIR_GET_HMKEY(propertyPosition, _9, _8); ZEPHIR_GET_HVALUE(property, _10); if (Z_TYPE_P(property) != IS_ARRAY) { ZEPHIR_INIT_NVAR(_11); object_init_ex(_11, phalcon_di_exception_ce); ZEPHIR_INIT_LNVAR(_6); ZEPHIR_CONCAT_SV(_6, "Property must be an array on position ", propertyPosition); ZEPHIR_CALL_METHOD(NULL, _11, "__construct", &_7, 9, _6); zephir_check_call_status(); zephir_throw_exception_debug(_11, "phalcon/di/service/builder.zep", 257 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } ZEPHIR_OBS_NVAR(propertyName); if (!(zephir_array_isset_string_fetch(&propertyName, property, SS("name"), 0 TSRMLS_CC))) { ZEPHIR_INIT_NVAR(_5); object_init_ex(_5, phalcon_di_exception_ce); ZEPHIR_INIT_LNVAR(_6); ZEPHIR_CONCAT_SV(_6, "The property name is required on position ", propertyPosition); ZEPHIR_CALL_METHOD(NULL, _5, "__construct", &_7, 9, _6); zephir_check_call_status(); zephir_throw_exception_debug(_5, "phalcon/di/service/builder.zep", 264 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } ZEPHIR_OBS_NVAR(propertyValue); if (!(zephir_array_isset_string_fetch(&propertyValue, property, SS("value"), 0 TSRMLS_CC))) { ZEPHIR_INIT_NVAR(_5); object_init_ex(_5, phalcon_di_exception_ce); ZEPHIR_INIT_LNVAR(_6); ZEPHIR_CONCAT_SV(_6, "The property value is required on position ", propertyPosition); ZEPHIR_CALL_METHOD(NULL, _5, "__construct", &_7, 9, _6); zephir_check_call_status(); zephir_throw_exception_debug(_5, "phalcon/di/service/builder.zep", 271 TSRMLS_CC); ZEPHIR_MM_RESTORE(); return; } ZEPHIR_CALL_METHOD(&_0, this_ptr, "_buildparameter", &_12, 177, dependencyInjector, propertyPosition, propertyValue); zephir_check_call_status(); zephir_update_property_zval_zval(instance, propertyName, _0 TSRMLS_CC); } } RETURN_CCTOR(instance); }