Slim框架-如何自动加载Slim/Slim.php而不是使用require? [英] Slim framework - How to autoload Slim/Slim.php instead of using require?

查看:187
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆