Slim框架-如何自动加载Slim/Slim.php而不是使用require? [英] Slim framework - How to autoload Slim/Slim.php instead of using require?
本文介绍了Slim框架-如何自动加载Slim/Slim.php而不是使用require?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何自动加载Slim/Slim.php而不使用require
?
How can I autoload Slim/Slim.php instead of using require
?
// standard method
//require 'ext/Slim/Slim.php';
// autoload method:
define ('WEBSITE_DOCROOT', str_replace('\\', '/', dirname(__FILE__)).'/');
// Instance of SplAutoload.
$SplAutoload = new SplAutoload();
// Load classes.
$SplAutoload->fetch([
'ext/' // Slim/ is kept under ext/
]);
\Slim\Slim::registerAutoloader();
//Instantiate a Slim application:
$app = new \Slim\Slim();
//Define a HTTP GET route:
$app->get('/', function () {
echo "Hello!";
});
$app->get('/hello/:name/', function ($name) {
echo "Hello, $name";
});
//Run the Slim application:
$app->run();
我收到此错误
致命错误:在C:...中找不到类'Slim \ Slim'.
Fatal error: Class 'Slim\Slim' not found in C:...
SplAutoload类,
the SplAutoload class,
class SplAutoload
{
/**
* Set the property.
*/
public $directories;
public function fetch($directories)
{
// Store the data into the property.
$this->directories = $directories;
// Register the classes that were loaded by __autoload as well.
spl_autoload_register('__autoload');
// When using spl_autoload_register() with class methods, it might seem that it can use only public methods,
// though it can use private/protected methods as well, if registered from inside the class:
spl_autoload_register([$this,'getClass']);
}
private function getClass($className)
{
if(is_array($this->directories)): $mainDirectories = $this->directories;
else: $mainDirectories = array($this->directories); endif;
// Set other vars and arrays.
$subDirectories = [];
//print_r($mainDirectories);
$namespace = "\\";
$isNamespace = false;
// When you use namespace in a class, you get something like this when you auto load that class \foo\tidy.
// So use explode to split the string and then get the last item in the exloded array.
$parts = explode($namespace, $className);
// Check if the current class is a namespace class or not.
if(strpos($className, $namespace) !== false)
{
$isNamespace = true;
}
// Set the class file name.
$filename = end($parts).'.php';
// List any sub dirs in the main dirs above and store them in an array.
foreach($mainDirectories as $mainDirectory)
{
// Check if the directory exists.
// Create it if it doesn't.
if (!file_exists(WEBSITE_DOCROOT.$mainDirectory))
{
mkdir(WEBSITE_DOCROOT.$mainDirectory, 0777);
}
// Must use absolute path to get the files when ajax is used.
foreach(glob(WEBSITE_DOCROOT.$mainDirectory.'*', GLOB_ONLYDIR) as $dir)
{
// Must trim off the WEBSITE_DOCROOT.
$subDirectories[] = preg_replace('~.*?(?=core|local)~i', '', str_replace('\\', '/', $dir)) .'/';
}
}
// Mearge the main dirs with any sub dirs in them.
$mergedDirectories = array_merge($mainDirectories,$subDirectories);
// Loop the merge array and include the classes in them.
foreach($mergedDirectories as $mainDirectory)
{
if(file_exists(WEBSITE_DOCROOT.$mainDirectory.$filename))
{
include_once WEBSITE_DOCROOT.$mainDirectory.$filename;
// Check if the class has existed.
if($isNamespace === false) if (class_exists($className)) break;
}
}
}
}
还是我应该使用的其他任何SPL自动装带器? zend-autoloader?
or any other SPL autoloader that I should go for? zend-autoloader?
推荐答案
使用自动加载器处理名称空间的方式,您将需要使用以下方法:
With the way your autoloader handles namespaces, you'll need to use this:
$SplAutoload->fetch([
'ext/Slim/' // Slim/ is kept under ext/
]);
或更改您的自动加载器,使其包含名称空间作为目录.
or change your autoloader so it includes the namespace as a directory.
这篇关于Slim框架-如何自动加载Slim/Slim.php而不是使用require?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文