I have two classes, Router and Sammy, both are in different namespaces, but i need to call Sammy class in Router class, but it gives me an error
Notice: Undefined index: GlobeAPI\Classes\Router\Sammy in /opt/lampp/htdocs/web/globeapi/GlobeAPI/Classes/Autoloader/Autoloader.php on line 151
error its self is irelavent right now, i cant figure it out how to call properly Sammy class.
here is Router.php code
namespace GlobeAPI\Classes\Router;
class Router
{
public static $call = null;
function __construct()
{
}
public static function get($route, $call) {
self::$call = $call;
Sammy::process($route, 'GET');
}
public static function post($route, $call) {
self::$call = $call;
Sammy::process($route, 'POST');
}
public static function put($route, $call) {
self::$call = $call;
Sammy::process($route, 'PUT');
}
public static function delete($route, $call) {
self::$call = $call;
Sammy::process($route, 'DELETE');
}
public static function ajax($route, $call) {
self::$call = $call;
Sammy::process($route, 'XMLHttpRequest');
}
public static function dispatch()
{
$call = explode('#', self::$call);
$controller = $call[0];
$function = $call[1];
self::loadController($controller);
self::loadFunction($controller, $function);
}
public static function loadController($controller)
{
$path = APP_PATH . 'controllers/' . ucfirst($controller) . '.php';
if(file_exists($path))
{
include_once($path);
}else
{
return false;
}
}
public static function loadFunction($controller, $function)
{
$cls = ucfirst($controller);
if(class_exists($cls))
{
$tmp = new $cls();
if(is_callable(array($tmp, $function)))
{
$tmp->$function();
}else
{
echo 0;
}
}
}
}
and here is Sammy.php code
namespace GlobeAPI\Classes\Sammy;
class Sammy {
public static $route_found = false;
public $uri = '';
public $segments = '';
public $method = '';
public $format = '';
public static function instance() {
static $instance = null;
if( $instance === null ) {
$instance = new Sammy;
}
return $instance;
}
public static function run() {
if( !static::$route_found ) {
echo 'Route not defined!';
}
ob_end_flush();
}
public static function process($route, $type) {
$sammy = static::instance();
// Check for ajax
if( $type == 'XMLHttpRequest' )
$sammy->method = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : 'GET';
if( static::$route_found || (!preg_match('@^'.$route.'(?:\.(\w+))?$@uD', $sammy->uri, $matches) || $sammy->method != $type) ) {
return false;
}
// Get the extension
$extension = $matches[count($matches)-1];
$extension_test = substr($sammy->uri, -(strlen($extension)+1), (strlen($extension)+1));
if( $extension_test == '.' . $extension )
$sammy->format = $extension;
static::$route_found = true;
Router::dispatch();
}
public function __construct() {
ob_start();
$this->uri = $this->get_uri();
$this->segments = explode('/', trim($this->uri, '/'));
$this->method = $this->get_method();
}
public function segment($num) {
$num--;
// Remove the extension
$this->segments[$num] = isset($this->segments[$num]) ? rtrim($this->segments[$num], '.' . $this->format) : null;
return isset($this->segments[$num]) ? $this->segments[$num] : null;
}
protected function get_method() {
return isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
}
protected function get_uri($prefix_slash = true) {
if( isset($_SERVER['PATH_INFO']) ) {
$uri = $_SERVER['PATH_INFO'];
}elseif( isset($_SERVER['REQUEST_URI']) ) {
$uri = $_SERVER['REQUEST_URI'];
if( strpos($uri, $_SERVER['SCRIPT_NAME']) === 0 ) {
$uri = substr($uri, strlen($_SERVER['SCRIPT_NAME']));
}elseif( strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0 ) {
$uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME'])));
}
// This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct
// URI is found, and also fixes the QUERY_STRING server var and $_GET array.
if( strncmp($uri, '?/', 2) === 0 ) {
$uri = substr($uri, 2);
}
$parts = preg_split('#\?#i', $uri, 2);
$uri = $parts[0];
if( isset($parts[1]) ) {
$_SERVER['QUERY_STRING'] = $parts[1];
parse_str($_SERVER['QUERY_STRING'], $_GET);
}else {
$_SERVER['QUERY_STRING'] = '';
$_GET = array();
}
$uri = parse_url($uri, PHP_URL_PATH);
}else {
// Couldn't determine the URI, so just return false
return false;
}
// Do some final cleaning of the URI and return it
return ($prefix_slash ? '/' : '').str_replace(array('//', '../'), '/', trim($uri, '/'));
}
public function format($name, $callback) {
$sammy = static::instance();
if( !empty($sammy->format) && $name == $sammy->format )
echo $callback($sammy);
else
return false;
}
}
$sammy = Sammy::instance();
As the two files are not on the same namespace, you have to specify which class you want to use by adding the word use followed by the complete class namespace after the namespace declaration on your Router.php:
use GlobeAPI\Classes\Sammy\Sammy;
You can see on the documentation for more explanations.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With