簡體   English   中英

Slim框架-如何自動加載Slim / Slim.php而不是使用require?

[英]Slim framework - How to autoload Slim/Slim.php instead of using require?

如何自動加載Slim / Slim.php而不是使用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'

SplAutoload類,

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的,自動加載磁帶機?

通過自動加載器處理名稱空間的方式,您需要使用以下代碼:

$SplAutoload->fetch([
    'ext/Slim/' // Slim/ is kept under ext/
]);

或更改您的自動裝帶器,使其包含名稱空間作為目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM