Subversion Repositories PHPX

Rev

Rev 51 | Rev 57 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 51 Rev 52
Line 1... Line 1...
1
<?php
1
<?php
2
2
3
namespace PointedEars\PHPX;
3
namespace PointedEars\PHPX;
4
4
-
 
5
function autoload ($class)
-
 
6
{
-
 
7
        if (\strpos($class, '..'))
-
 
8
        {
5
require_once __DIR__ . '/AbstractModel.php';
9
                throw new \InvalidArgumentException(
-
 
10
                        'Refusing to load unsafe class ' . $class);
-
 
11
        }
-
 
12
6
require_once __DIR__ . '/Registry.php';
13
        require_once \preg_replace('#\\\#', '/',
-
 
14
                \preg_replace('#^' . \preg_quote(__NAMESPACE__) .'#', __DIR__, $class)
-
 
15
        ) . '.php';
-
 
16
}
-
 
17
-
 
18
\spl_autoload_register(__NAMESPACE__ . '\\autoload');
7
19
8
/**
20
/**
9
 * Basic application class
21
 * Basic application class
10
 *
22
 *
11
 * @author Thomas Lahn
23
 * @author Thomas Lahn
Line 41... Line 53...
41
   *
53
   *
42
   * @var Application
54
   * @var Application
43
   */
55
   */
44
  private static $_instance;
56
  private static $_instance;
45
57
46
  protected function __construct()
58
  protected function __construct ()
47
  {
59
  {
48
    /* Singleton pattern */
60
    /* Singleton pattern */
49
  }
61
  }
50
62
51
  /**
63
  /**
Line 55... Line 67...
55
   *   The instance to be used as application.  The default is a new
67
   *   The instance to be used as application.  The default is a new
56
   *   application.  This parameter is ignored if the application was
68
   *   application.  This parameter is ignored if the application was
57
   *   already initialized.
69
   *   already initialized.
58
   * @return Application
70
   * @return Application
59
   */
71
   */
60
  public static function getInstance(Application $instance = null)
72
  public static function getInstance (Application $instance = null)
61
  {
73
  {
62
    if (self::$_instance === null)
74
    if (self::$_instance === null)
63
    {
75
    {
64
      self::$_instance = ($instance === null) ? new self() : $instance;
76
      self::$_instance = ($instance === null) ? new self() : $instance;
65
    }
77
    }
Line 72... Line 84...
72
   *
84
   *
73
   * @param string $name
85
   * @param string $name
74
   * @throws ModelPropertyException
86
   * @throws ModelPropertyException
75
   * @return mixed
87
   * @return mixed
76
   */
88
   */
77
  public function __get($name)
89
  public function __get ($name)
78
  {
90
  {
79
    /* Support for Object-Relational Mappers */
91
    /* Support for Object-Relational Mappers */
80
    if (strpos($name, 'persistent') === 0)
92
    if (\strpos($name, 'persistent') === 0)
81
    {
93
    {
82
      $class = get_class($this);
94
      $class = \get_class($this);
83
      return $class::${$name};
95
      return $class::${$name};
84
    }
96
    }
85
97
86
    $method = 'get' . ucfirst($name);
98
    $method = 'get' . \ucfirst($name);
87
99
88
    if (method_exists($this, $method))
100
    if (\method_exists($this, $method))
89
    {
101
    {
90
      return $this->$method();
102
      return $this->$method();
91
    }
103
    }
92
104
93
    if (property_exists($this, "_$name"))
105
    if (\property_exists($this, "_$name"))
94
    {
106
    {
95
      return $this->{"_$name"};
107
      return $this->{"_$name"};
96
    }
108
    }
97
109
98
    return $this->$name;
110
    return $this->$name;
Line 103... Line 115...
103
   *
115
   *
104
   * @param string $name
116
   * @param string $name
105
   * @param mixed $value  The new property value before assignment
117
   * @param mixed $value  The new property value before assignment
106
   * @throws ModelPropertyException
118
   * @throws ModelPropertyException
107
   */
119
   */
108
  public function __set($name, $value)
120
  public function __set ($name, $value)
109
  {
121
  {
110
    $method = 'set' . ucfirst($name);
122
    $method = 'set' . \ucfirst($name);
111
123
112
    if (method_exists($this, $method))
124
    if (\method_exists($this, $method))
113
    {
125
    {
114
      return $this->$method($value);
126
      return $this->$method($value);
115
    }
127
    }
116
128
117
    if (property_exists($this, "_$name"))
129
    if (\property_exists($this, "_$name"))
118
    {
130
    {
119
      $this->{"_$name"} = $value;
131
      $this->{"_$name"} = $value;
120
      return $this->{"_$name"};
132
      return $this->{"_$name"};
121
    }
133
    }
122
134
Line 125... Line 137...
125
137
126
  /**
138
  /**
127
   * Runs the application, setting up session management and
139
   * Runs the application, setting up session management and
128
   * constructing the controller indicated by the URI
140
   * constructing the controller indicated by the URI
129
   */
141
   */
130
  public function run()
142
  public function run ()
131
  {
143
  {
132
    $this->startSession();
144
    $this->startSession();
133
145
134
    $controller = self::getParam('controller', $_REQUEST);
146
    $controller = self::getParam('controller', $_REQUEST);
135
    if (!$controller)
147
    if (!$controller)
136
    {
148
    {
137
      $controller = $this->_defaultController;
149
      $controller = $this->_defaultController;
138
    }
150
    }
139
151
140
    $controller = ucfirst($controller);
152
    $controller = \ucfirst($controller);
141
153
142
    $controller = $controller . 'Controller';
154
    $controller = $controller . 'Controller';
143
    require_once "{$this->_controllerPath}/{$controller}.php";
155
    require_once "{$this->_controllerPath}/{$controller}.php";
144
    $this->_currentController = new $controller();
156
    $this->_currentController = new $controller();
145
157
146
    return $this;
158
    return $this;
147
  }
159
  }
148
160
149
  protected function startSession()
161
  protected function startSession ()
150
  {
162
  {
151
    session_start();
163
    \session_start();
152
  }
164
  }
153
165
154
  /**
166
  /**
155
   * Gets a request parameter
167
   * Gets a request parameter
156
   *
168
   *
Line 161... Line 173...
161
   *   The default is <code>$_GET</code>.
173
   *   The default is <code>$_GET</code>.
162
   * @return mixed
174
   * @return mixed
163
   *   <code>null</code> if there is no such <var>$key</var>
175
   *   <code>null</code> if there is no such <var>$key</var>
164
   *   in <var>$array</var>
176
   *   in <var>$array</var>
165
   */
177
   */
166
  public static function getParam($key, array $array = null)
178
  public static function getParam ($key, array $array = null)
167
  {
179
  {
168
    if ($array === null)
180
    if ($array === null)
169
    {
181
    {
170
      $array = $_GET;
182
      $array = $_GET;
171
    }
183
    }
Line 200... Line 212...
200
  * Sets the current controller for this application
212
  * Sets the current controller for this application
201
  *
213
  *
202
  * @param Controller $controller
214
  * @param Controller $controller
203
  * @return Application
215
  * @return Application
204
  */
216
  */
205
  public function setCurrentController(Controller $controller)
217
  public function setCurrentController (Controller $controller)
206
  {
218
  {
207
    $this->_currentController = $controller;
219
    $this->_currentController = $controller;
208
    return $this;
220
    return $this;
209
  }
221
  }
210
222
211
  /**
223
  /**
212
   * Returns the current controller for this application
224
   * Returns the current controller for this application
213
   *
225
   *
214
   * @return Controller
226
   * @return Controller
215
   */
227
   */
216
  public function getCurrentController()
228
  public function getCurrentController ()
217
  {
229
  {
218
    return $this->_currentController;
230
    return $this->_currentController;
219
  }
231
  }
220
232
221
  /**
233
  /**
222
   * Returns the default database for this application
234
   * Returns the default database for this application
223
   *
235
   *
224
   * @return Database
236
   * @return Database
225
   */
237
   */
226
  public function getDefaultDatabase()
238
  public function getDefaultDatabase ()
227
  {
239
  {
228
    return Registry::get($this->_defaultDatabase);
240
    return Registry::get($this->_defaultDatabase);
229
  }
241
  }
230
242
231
  /**
243
  /**
Line 234... Line 246...
234
   *
246
   *
235
   * @param string[optional] $controller
247
   * @param string[optional] $controller
236
   * @param string[optional] $action
248
   * @param string[optional] $action
237
   * @param int[optional] $id
249
   * @param int[optional] $id
238
   */
250
   */
239
  public function getURL($controller = null, $action = null, $id = null)
251
  public function getURL ($controller = null, $action = null, $id = null)
240
  {
252
  {
241
    /* Apache module */
253
    /* Apache module */
242
    $url = self::getParam('SCRIPT_URL', $_SERVER);
254
    $url = self::getParam('SCRIPT_URL', $_SERVER);
243
    if ($url === null)
255
    if ($url === null)
244
    {
256
    {
Line 246... Line 258...
246
      $url = self::getParam('URL', $_SERVER);
258
      $url = self::getParam('URL', $_SERVER);
247
      if ($url === null)
259
      if ($url === null)
248
      {
260
      {
249
        /* Server/PHP too old, compute URI */
261
        /* Server/PHP too old, compute URI */
250
        $url = self::getParam('REQUEST_URI', $_SERVER);
262
        $url = self::getParam('REQUEST_URI', $_SERVER);
251
        if (preg_match('/^[^?]+/', $url, $matches) > 0)
263
        if (\preg_match('/^[^?]+/', $url, $matches) > 0)
252
        {
264
        {
253
          $url = $matches[0];
265
          $url = $matches[0];
254
        }
266
        }
255
        else
267
        else
256
        {
268
        {
257
          /* Has .php in it, but at least it works */
269
          /* Has .php in it, but at least it works */
258
          $url = self::getParam('SCRIPT_NAME', $_SERVER);
270
          $url = self::getParam('SCRIPT_NAME', $_SERVER);
259
          if ($url === null)
271
          if ($url === null)
260
          {
272
          {
261
            throw new Exception(
273
            throw new \Exception(
262
              'None of $_SERVER["SCRIPT_URL"], $_SERVER["URL"],'
274
              'None of $_SERVER["SCRIPT_URL"], $_SERVER["URL"],'
263
              . ' $_SERVER["REQUEST_URI"], or $_SERVER["SCRIPT_NAME"]'
275
              . ' $_SERVER["REQUEST_URI"], or $_SERVER["SCRIPT_NAME"]'
264
              . ' is available, cannot continue.');
276
              . ' is available, cannot continue.');
265
          }
277
          }
266
        }
278
        }
Line 275... Line 287...
275
  }
287
  }
276
288
277
  /**
289
  /**
278
   * Performs a server-side redirect within the application
290
   * Performs a server-side redirect within the application
279
   */
291
   */
280
  public static function redirect($query = '')
292
  public static function redirect ($query = '')
281
  {
293
  {
282
    $script_uri = self::getParam('SCRIPT_URI', $_SERVER);
294
    $script_uri = self::getParam('SCRIPT_URI', $_SERVER);
283
    if ($script_uri === null)
295
    if ($script_uri === null)
284
    {
296
    {
285
      /* Server/PHP too old, compute URI */
297
      /* Server/PHP too old, compute URI */
286
      if (preg_match('/^[^?]+/',
298
      if (\preg_match('/^[^?]+/',
287
          self::getParam('REQUEST_URI', $_SERVER), $matches) > 0)
299
          self::getParam('REQUEST_URI', $_SERVER), $matches) > 0)
288
      {
300
      {
289
        $query_prefix = $matches[0];
301
        $query_prefix = $matches[0];
290
      }
302
      }
291
      else
303
      else
Line 300... Line 312...
300
                      : 'http://')
312
                      : 'http://')
301
                  . self::getParam('HTTP_HOST', $_SERVER)
313
                  . self::getParam('HTTP_HOST', $_SERVER)
302
                  . $query_prefix;
314
                  . $query_prefix;
303
    }
315
    }
304
316
305
    header('Location: ' . $script_uri
317
    \header('Location: ' . $script_uri
306
      . ($query ? (substr($query, 0, 1) === '?' ? '' : '?') . $query : ''));
318
      . ($query ? (substr($query, 0, 1) === '?' ? '' : '?') . $query : ''));
307
  }
319
  }
308
}
320
}
309
 
321