/Dispatcher/Visit.php

https://bitbucket.org/wl-framework-dev/weblab-framework · PHP · 126 lines · 93 code · 26 blank · 7 comment · 15 complexity · 4aa524636d337da287a32400497e4b1d MD5 · raw file

  1. <?php
  2. /**
  3. *
  4. * @author Jorgen Evens <jorgen@wlab.be>
  5. * @package WebLab
  6. * @subpackage Dispatcher
  7. *
  8. */
  9. class WebLab_Dispatcher_Visit implements WebLab_Dispatcher
  10. {
  11. protected static $_config;
  12. protected static $_param;
  13. protected static function _setup() {
  14. if( isset( self::$_config ) ) {
  15. return;
  16. }
  17. self::$_config = WebLab_Config::getApplicationConfig()->get( 'Application.Dispatcher.Visit', WebLab_Config::OBJECT, false );
  18. if( !isset( self::$_config->default ) || !isset( self::$_config->prefix ) ) {
  19. throw new WebLab_Exception_Dispatcher( 'Incomplete configuration.' );
  20. }
  21. self::$_param = WebLab_Parser_URL::getForRequest()->parameters;
  22. }
  23. public function __construct() {
  24. self::_setup();
  25. }
  26. public function execute() {
  27. $alias = WebLab_Config::getApplicationConfig()->get( 'Application.Dispatcher.Aliasses', WebLab_Config::RAW, false );
  28. $path = $this->_parsePath();
  29. $default_namespace = isset( self::$_config->default_namespace ) ? self::$_config->default_namespace . NAMESPACE_SEPARATOR : '';
  30. $i = count( $path );
  31. if( empty( $path ) && isset( $alias[""] ) ) {
  32. $module = $default_namespace. self::$_config->prefix . '_' . $alias[""];
  33. } else {
  34. $module = $default_namespace . self::$_config->prefix . '_' . self::$_config->default;
  35. }
  36. while( $i-- > 0 ) {
  37. $module_name = $this->_generateModule( $path );
  38. if( $module_name !== false ) {
  39. $module = $module_name;
  40. break;
  41. }
  42. $root_controller = ( $i == 0 ) ? array('Index') : array_slice( $path, 1 );
  43. $module_name = $this->_generateModule( $root_controller, $path[0] );
  44. if( $module_name !== false ) {
  45. $module = $module_name;
  46. break;
  47. }
  48. if( !empty( $default_namespace ) ) {
  49. $module_name = $this->_generateModule( $path, $default_namespace );
  50. if( $module_name !== false ) {
  51. $module = $module_name;
  52. break;
  53. }
  54. }
  55. array_pop( $path );
  56. }
  57. return new $module();
  58. }
  59. protected function _generateModule( $path, $ns=null ) {
  60. $alias = WebLab_Config::getApplicationConfig()->get( 'Application.Dispatcher.Aliasses', WebLab_Config::RAW, false );
  61. $module_name = empty( $ns ) ? '' : $ns . NAMESPACE_SEPARATOR;
  62. $module_name .= implode( '_', $path );
  63. if( isset( $alias[$module_name] ) ) {
  64. $module_name = $alias[$module_name];
  65. }
  66. $module_namespace = explode( NAMESPACE_SEPARATOR, trim( $module_name, NAMESPACE_SEPARATOR ) );
  67. $module_name = array_pop( $module_namespace );
  68. $module_namespace = implode( NAMESPACE_SEPARATOR, $module_namespace );
  69. if( !empty( $module_namespace ) )
  70. $module_namespace .= NAMESPACE_SEPARATOR;
  71. $module_name = $module_namespace . self::$_config->prefix . '_' . $module_name;
  72. if( class_exists( $module_name ) )
  73. return $module_name;
  74. return false;
  75. }
  76. protected function _parsePath() {
  77. $path = array();
  78. $i = 0;
  79. while( isset( self::$_param[$i] ) )
  80. if( !is_numeric( self::$_param[$i++] ) )
  81. $path[] = ucfirst( self::$_param[$i-1] );
  82. return $path;
  83. }
  84. protected function _parseParam( $param ) {
  85. $param = preg_replace_callback( '#-+(.)#', create_function( '$m', 'return strtoupper( $m[1] );'), $param );
  86. return ucfirst( $param );
  87. }
  88. public function setPattern( $pattern ) {
  89. $this->_pattern = $pattern;
  90. }
  91. public function getPattern() {
  92. return $this->_pattern;
  93. }
  94. public function setDefault( $class ) {
  95. $this->_default = $class;
  96. }
  97. public function getDefault() {
  98. return $this->_default;
  99. }
  100. }