PageRenderTime 23ms CodeModel.GetById 34ms RepoModel.GetById 0ms app.codeStats 0ms

/routes/yaf_route_simple.c

https://gitlab.com/oytunistrator/yaf
C | 257 lines | 160 code | 46 blank | 51 comment | 40 complexity | a17f91a331b7f8fa3adb6b4b769707d5 MD5 | raw file
  1. /*
  2. +----------------------------------------------------------------------+
  3. | Yet Another Framework |
  4. +----------------------------------------------------------------------+
  5. | This source file is subject to version 3.01 of the PHP license, |
  6. | that is bundled with this package in the file LICENSE, and is |
  7. | available through the world-wide-web at the following url: |
  8. | http://www.php.net/license/3_01.txt |
  9. | If you did not receive a copy of the PHP license and are unable to |
  10. | obtain it through the world-wide-web, please send a note to |
  11. | license@php.net so we can mail you a copy immediately. |
  12. +----------------------------------------------------------------------+
  13. | Author: Xinchen Hui <laruence@php.net> |
  14. +----------------------------------------------------------------------+
  15. */
  16. #ifdef HAVE_CONFIG_H
  17. #include "config.h"
  18. #endif
  19. #include "php.h"
  20. #include "php_yaf.h"
  21. #include "yaf_namespace.h"
  22. #include "yaf_exception.h"
  23. #include "yaf_application.h" /* for yaf_application_is_module_name */
  24. #include "yaf_request.h"
  25. #include "yaf_router.h"
  26. #include "routes/yaf_route_interface.h"
  27. #include "routes/yaf_route_simple.h"
  28. #include "ext/standard/php_smart_str.h" /* for smart_str */
  29. zend_class_entry *yaf_route_simple_ce;
  30. /** {{{ ARG_INFO
  31. */
  32. ZEND_BEGIN_ARG_INFO_EX(yaf_route_simple_construct_arginfo, 0, 0, 3)
  33. ZEND_ARG_INFO(0, module_name)
  34. ZEND_ARG_INFO(0, controller_name)
  35. ZEND_ARG_INFO(0, action_name)
  36. ZEND_END_ARG_INFO()
  37. /* }}} */
  38. /** {{{ int yaf_route_simple_route(yaf_route_t *route, yaf_request_t *request TSRMLS_DC)
  39. */
  40. int yaf_route_simple_route(yaf_route_t *route, yaf_request_t *request TSRMLS_DC) {
  41. zval *module, *controller, *action;
  42. zval *nmodule, *ncontroller, *naction;
  43. nmodule = zend_read_property(yaf_route_simple_ce, route, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_MODULE), 1 TSRMLS_CC);
  44. ncontroller = zend_read_property(yaf_route_simple_ce, route, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_CONTROLLER), 1 TSRMLS_CC);
  45. naction = zend_read_property(yaf_route_simple_ce, route, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_ACTION), 1 TSRMLS_CC);
  46. /* if there is no expect parameter in supervars, then null will be return */
  47. module = yaf_request_query(YAF_GLOBAL_VARS_GET, Z_STRVAL_P(nmodule), Z_STRLEN_P(nmodule) TSRMLS_CC);
  48. controller = yaf_request_query(YAF_GLOBAL_VARS_GET, Z_STRVAL_P(ncontroller), Z_STRLEN_P(ncontroller) TSRMLS_CC);
  49. action = yaf_request_query(YAF_GLOBAL_VARS_GET, Z_STRVAL_P(naction), Z_STRLEN_P(naction) TSRMLS_CC);
  50. if (ZVAL_IS_NULL(module) && ZVAL_IS_NULL(controller) && ZVAL_IS_NULL(action)) {
  51. return 0;
  52. }
  53. if (Z_TYPE_P(module) == IS_STRING && yaf_application_is_module_name(Z_STRVAL_P(module), Z_STRLEN_P(module) TSRMLS_CC)) {
  54. zend_update_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_MODULE), module TSRMLS_CC);
  55. }
  56. zend_update_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_CONTROLLER), controller TSRMLS_CC);
  57. zend_update_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_ACTION), action TSRMLS_CC);
  58. return 1;
  59. }
  60. /* }}} */
  61. /** {{{ yaf_route_t * yaf_route_simple_instance(yaf_route_t *this_ptr, zval *module, zval *controller, zval *action TSRMLS_DC)
  62. */
  63. yaf_route_t * yaf_route_simple_instance(yaf_route_t *this_ptr, zval *module, zval *controller, zval *action TSRMLS_DC) {
  64. yaf_route_t *instance;
  65. if (this_ptr) {
  66. instance = this_ptr;
  67. } else {
  68. MAKE_STD_ZVAL(instance);
  69. object_init_ex(instance, yaf_route_simple_ce);
  70. }
  71. zend_update_property(yaf_route_simple_ce, instance, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_MODULE), module TSRMLS_CC);
  72. zend_update_property(yaf_route_simple_ce, instance, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_CONTROLLER), controller TSRMLS_CC);
  73. zend_update_property(yaf_route_simple_ce, instance, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_ACTION), action TSRMLS_CC);
  74. return instance;
  75. }
  76. /* }}} */
  77. /** {{{ proto public Yaf_Route_Simple::route(Yaf_Request $req)
  78. */
  79. PHP_METHOD(yaf_route_simple, route) {
  80. yaf_request_t *request;
  81. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, yaf_request_ce) == FAILURE) {
  82. return;
  83. } else {
  84. RETURN_BOOL(yaf_route_simple_route(getThis(), request TSRMLS_CC));
  85. }
  86. }
  87. /* }}} */
  88. /** {{{ zval * yaf_route_simple_assemble(zval *info, zval *query TSRMLS_DC)
  89. */
  90. zval * yaf_route_simple_assemble(yaf_route_t *this_ptr, zval *info, zval *query TSRMLS_DC) {
  91. smart_str tvalue = {0};
  92. zval *nmodule, *ncontroller, *naction;
  93. zval *uri;
  94. MAKE_STD_ZVAL(uri);
  95. smart_str_appendc(&tvalue, '?');
  96. nmodule = zend_read_property(yaf_route_simple_ce, this_ptr, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_MODULE), 1 TSRMLS_CC);
  97. ncontroller = zend_read_property(yaf_route_simple_ce, this_ptr, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_CONTROLLER), 1 TSRMLS_CC);
  98. naction = zend_read_property(yaf_route_simple_ce, this_ptr, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_ACTION), 1 TSRMLS_CC);
  99. do {
  100. zval **tmp;
  101. if (zend_hash_find(Z_ARRVAL_P(info), ZEND_STRS(YAF_ROUTE_ASSEMBLE_MOUDLE_FORMAT), (void **)&tmp) == SUCCESS) {
  102. smart_str_appendl(&tvalue, Z_STRVAL_P(nmodule), Z_STRLEN_P(nmodule));
  103. smart_str_appendc(&tvalue, '=');
  104. smart_str_appendl(&tvalue, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
  105. smart_str_appendc(&tvalue, '&');
  106. }
  107. if (zend_hash_find(Z_ARRVAL_P(info), ZEND_STRS(YAF_ROUTE_ASSEMBLE_CONTROLLER_FORMAT), (void **)&tmp) == FAILURE) {
  108. yaf_trigger_error(YAF_ERR_TYPE_ERROR TSRMLS_CC, "%s", "You need to specify the controller by ':c'");
  109. break;
  110. }
  111. smart_str_appendl(&tvalue, Z_STRVAL_P(ncontroller), Z_STRLEN_P(ncontroller));
  112. smart_str_appendc(&tvalue, '=');
  113. smart_str_appendl(&tvalue, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
  114. smart_str_appendc(&tvalue, '&');
  115. if(zend_hash_find(Z_ARRVAL_P(info), ZEND_STRS(YAF_ROUTE_ASSEMBLE_ACTION_FORMAT), (void **)&tmp) == FAILURE) {
  116. yaf_trigger_error(YAF_ERR_TYPE_ERROR TSRMLS_CC, "%s", "You need to specify the action by ':a'");
  117. break;
  118. }
  119. smart_str_appendl(&tvalue, Z_STRVAL_P(naction), Z_STRLEN_P(naction));
  120. smart_str_appendc(&tvalue, '=');
  121. smart_str_appendl(&tvalue, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
  122. if (query && IS_ARRAY == Z_TYPE_P(query)) {
  123. uint key_len;
  124. char *key;
  125. ulong key_idx;
  126. for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(query));
  127. zend_hash_get_current_data(Z_ARRVAL_P(query), (void **)&tmp) == SUCCESS;
  128. zend_hash_move_forward(Z_ARRVAL_P(query))) {
  129. if (IS_STRING == Z_TYPE_PP(tmp)
  130. && HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(Z_ARRVAL_P(query), &key, &key_len, &key_idx, 0, NULL)) {
  131. smart_str_appendc(&tvalue, '&');
  132. smart_str_appendl(&tvalue, key, key_len - 1);
  133. smart_str_appendc(&tvalue, '=');
  134. smart_str_appendl(&tvalue, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
  135. }
  136. }
  137. }
  138. smart_str_0(&tvalue);
  139. ZVAL_STRING(uri, tvalue.c, 1);
  140. smart_str_free(&tvalue);
  141. return uri;
  142. } while (0);
  143. smart_str_free(&tvalue);
  144. ZVAL_NULL(uri);
  145. return uri;
  146. }
  147. /* }}} */
  148. /** {{{ proto public Yaf_Route_Simple::__construct(string $module, string $controller, string $action)
  149. */
  150. PHP_METHOD(yaf_route_simple, __construct) {
  151. zval *module, *controller, *action;
  152. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzz", &module, &controller, &action) == FAILURE) {
  153. YAF_UNINITIALIZED_OBJECT(getThis());
  154. return;
  155. }
  156. if (IS_STRING != Z_TYPE_P(module)
  157. || IS_STRING != Z_TYPE_P(controller)
  158. || IS_STRING != Z_TYPE_P(action)) {
  159. YAF_UNINITIALIZED_OBJECT(getThis());
  160. yaf_trigger_error(YAF_ERR_TYPE_ERROR TSRMLS_CC, "Expect 3 string parameters", yaf_route_simple_ce->name);
  161. RETURN_FALSE;
  162. } else {
  163. (void)yaf_route_simple_instance(getThis(), module, controller, action TSRMLS_CC);
  164. }
  165. }
  166. /* }}} */
  167. /** {{{ proto public Yaf_Route_Simple::assemble(array $info[, array $query = NULL])
  168. */
  169. PHP_METHOD(yaf_route_simple, assemble) {
  170. zval *info, *query = NULL;
  171. zval *return_uri;
  172. if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|a", &info, &query) == FAILURE) {
  173. return;
  174. } else {
  175. if ((return_uri = yaf_route_simple_assemble(getThis(), info, query TSRMLS_CC))) {
  176. RETURN_ZVAL(return_uri, 0, 1);
  177. }
  178. }
  179. }
  180. /* }}} */
  181. /** {{{ yaf_route_simple_methods
  182. */
  183. zend_function_entry yaf_route_simple_methods[] = {
  184. PHP_ME(yaf_route_simple, __construct, yaf_route_simple_construct_arginfo, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
  185. PHP_ME(yaf_route_simple, route, yaf_route_route_arginfo, ZEND_ACC_PUBLIC)
  186. PHP_ME(yaf_route_simple, assemble, yaf_route_assemble_arginfo, ZEND_ACC_PUBLIC)
  187. {NULL, NULL, NULL}
  188. };
  189. /* }}} */
  190. /** {{{ YAF_STARTUP_FUNCTION
  191. */
  192. YAF_STARTUP_FUNCTION(route_simple) {
  193. zend_class_entry ce;
  194. YAF_INIT_CLASS_ENTRY(ce, "Yaf_Route_Simple", "Yaf\\Route\\Simple", yaf_route_simple_methods);
  195. yaf_route_simple_ce = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
  196. zend_class_implements(yaf_route_simple_ce TSRMLS_CC, 1, yaf_route_ce);
  197. yaf_route_simple_ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
  198. zend_declare_property_null(yaf_route_simple_ce, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_CONTROLLER), ZEND_ACC_PROTECTED TSRMLS_CC);
  199. zend_declare_property_null(yaf_route_simple_ce, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_MODULE), ZEND_ACC_PROTECTED TSRMLS_CC);
  200. zend_declare_property_null(yaf_route_simple_ce, ZEND_STRL(YAF_ROUTE_SIMPLE_VAR_NAME_ACTION), ZEND_ACC_PROTECTED TSRMLS_CC);
  201. return SUCCESS;
  202. }
  203. /* }}} */
  204. /*
  205. * Local variables:
  206. * tab-width: 4
  207. * c-basic-offset: 4
  208. * End:
  209. * vim600: noet sw=4 ts=4 fdm=marker
  210. * vim<600: noet sw=4 ts=4
  211. */