Delete custom autoloader

Change-Id: Ib63e4aa7507987e89ed9ed63f0130d4f8d3e5c90
This commit is contained in:
Jamie Hannaford 2014-06-04 12:58:42 +02:00
parent 061a3b784a
commit b54de957d4
8 changed files with 21 additions and 228 deletions

View File

@ -52,13 +52,7 @@
* The super-simple stream API:
*
* <?php
* // This is only required if you don't have a PSR-4
* // autoloader to do the hard work for you.
* require 'OpenStack/Autoloader.php';
*
* // If you aren't using a PSR-4 autoloader,
* // you might want to use this:
* \OpenStack\Autoloader::useAutoloader();
* require 'vendor/autoload.php';
*
* // Turn on stream wrappers.
* \OpenStack\Bootstrap::useStreamWrappers();
@ -101,13 +95,7 @@
* to log in and then dump a list of services that are available to you:
*
* <?php
* // This is only required if you don't have a PSR-4
* // autoloader to do the hard work for you.
* require 'OpenStack/Autoloader.php';
*
* // If you aren't using a PSR-4 autoloader,
* // you might want to use this:
* \OpenStack\Autoloader::useAutoloader();
* require 'vendor/autoload.php';
*
* use \OpenStack\Identity\v1\IdentityService;
*

View File

@ -1,13 +1,10 @@
<?php
require_once __DIR__ . '/../src/OpenStack/Autoloader.php';
require_once __DIR__ . '/../vendor/autoload.php';
use \OpenStack\Autoloader;
use \OpenStack\Identity\v2\IdentityService;
use \OpenStack\ObjectStore\v1\ObjectStorage;
use \OpenStack\ObjectStore\v1\ObjectStorage\Object;
Autoloader::useAutoloader();
// Load these from an ini file.
$ini = parse_ini_file(getenv('HOME') . '/.OpenStack.ini');
$username = $ini['username'];

View File

@ -85,36 +85,22 @@ The first thing to do in your application is make sure the OpenStack
library is bootstrapped. When we say "bootstrap", what we really mean is
letting the library initialize itself.
Bootstrapping does not always involve any manual interaction on your
part. If you are using an PSR-4 autoloader that knows of the OpenStack
directory, that is enough for the system to initialize itself.
Sometimes, though, you will need to bootstrap OpenStack in your own code,
and this is done as follows:
The only thing you will need to do is require Composer's PSR-compliant
autoloader, like so:
<?php
require_once 'OpenStack/Autoloader.php';
require 'vendor/autoload.php';
use \OpenStack\Autoloader;
use \OpenStack\Bootstrap;
use \OpenStack\Identity\v2\IdentityService;
use \OpenStack\ObjectStore\v1\ObjectStorage;
use \OpenStack\ObjectStore\v1\Resource\Object;
\OpenStack\Autoloader::useAutoloader();
?>
The first line should be self-explanatory: we require the main autoloader file
which is generated by Composer.
The first line should be self-explanatory: We require the main
`Bootstrap.php` file (which contains the `Bootstrap` class).
After that, we declare a list of namespaced objects that we will use.
This way we can refer to them by their short name, rather than by their
fully qualified name.
The last line initializes the built-in OpenStack autoloader. What does
this mean? It means that this is the only `require` or `include`
statement you need in your code. The library does the rest of the
including for you, on demand, in a performance-sensitive way.
After that, we declare a list of namespaces that we will use. This way we can
refer to classes by their short name, rather than by their fully qualified name.
There are some other fancy things that OpenStack::Bootstrap can do for
you. Most notably, you can pass configuration parameters into it. But

View File

@ -1,9 +1,8 @@
<?php
require_once __DIR__ . '/../src/OpenStack/Autoloader.php';
require_once __DIR__ . '/../vendor/autoload.php';
use \OpenStack\Autoloader;
use \OpenStack\Bootstrap;
Autoloader::useAutoloader();
Bootstrap::useStreamWrappers();
$ini = parse_ini_file(getenv('HOME') . '/.OpenStack.ini');

View File

@ -51,24 +51,17 @@ What we will do is first load the PHP-Client Bootstrap.php file, and then
use the autoloader in that file to load the rest of the library:
<?php
require_once '/OpenStack/Autoloader.php';
require 'vendor/autoload.php';
use \OpenStack\Autoloader;
use \OpenStack\Bootstrap;
Autoloader::useAutoloader();
Bootstrap::useStreamWrappers();
?>
The first thing the example above does is require the Autoloader.php
Bootstrap::useStreamWrappers();
The first thing the example above does is require Composer's autoloader
file, which contains code necessary to autoload anything else we will need.
Next, we call two static methods:
- Autoloader::useAutoLoader(): This tells the PHP-Client to load any other
classes on demand. Since we use this, we don't need any more `require`
or `include` statements.
- Bootstrap::useStreamWrappers(): This tells OpenStack to register its
stream wrapper classes.
Next, we call Bootstrap::useStreamWrappers(), which tells OpenStack to register
its stream wrapper classes.
In a nutshell, PHP allows libraries to map a particular URL pattern to a
stream wrapper. PHP-Client registers the `swift://` URL prefix. So any
@ -181,11 +174,10 @@ tokens in a database and re-using them).
Here's how a stream context is used:
<?php
require_once __DIR__ . '/../src/OpenStack/Autoloader.php';
require __DIR__ . '/../vendor/autoload.php';
use \OpenStack\Autoloader;
use \OpenStack\Bootstrap;
Autoloader::useAutoloader();
Bootstrap::useStreamWrappers();
$cxt = stream_context_create(array(

View File

@ -1,120 +0,0 @@
<?php
/* ============================================================================
(c) Copyright 2014 Hewlett-Packard Development Company, L.P.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
============================================================================ */
/**
* An Autoloader to use for the case Composer isn't available.
*/
namespace OpenStack;
/**
* Autoload the OpenStack library.
*
* The OpenStack library is natively designed to be available via Composer. When
* Composer is not available and there is not another PSR-4 compatible autoloader
* to use, this one can be used.
*
* The autoloader can be used like:
*
* Autoloader::useAutoloader();
*
* The structure of the OpenStack file hierarchy is PSR-4 compliant.
* This means that you can use any standard PSR-4 classloader to
* load all of the classes here.
*
* That said, many projects rely upon packages to handle their own
* class loading. To provide this, this package contains a custom
* classloader that will load JUST the OpenStack classes. See
* the Autoloader::useAutoloader() static method.
*
* @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4.md
*/
Class Autoloader {
/**
* @var string The directory where OpenStack is located.
*/
public static $basedir = __DIR__;
/**
* Add the autoloader to PHP's autoloader list.
*
* This will add the internal special-purpose
* autoloader to the list of autoloaders that PHP will
* leverage to resolve class paths.
*
* Because OpenStack is PSR-4 compliant, any
* full PSR-4 classloader should be capable of loading
* these classes witout issue. You may prefer to use
* a standard PSR-4 loader instead of this one.
*
* @see https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4.md
*/
public static function useAutoloader()
{
spl_autoload_register(__NAMESPACE__ . '\Autoloader::autoload');
}
/**
* OpenStack autoloader.
*
* An implementation of a PHP autoload function. Use
* OpenStack::useAutoloader() if you want PHP to automatically
* load classes using this autoloader.
*
* // Enable the autoloader.
* Autoloader::useAutoloader();
*
* This is a special-purpose autoloader for loading
* only the OpenStack classes. It will not attempt to
* autoload anything outside of the OpenStack namespace.
*
* Because this is a special-purpose autoloader, it
* should be safe to use with other special-purpose
* autoloaders (and also projects that don't
* rely upon autoloaders).
*
* @param string $klass The fully qualified name of the class to be autoloaded.
*/
public static function autoload($klass)
{
$components = explode('\\', $klass);
if (empty($components[0])) {
array_shift($components);
}
// This class loader ONLY loads
// our classes. A general purpose
// classloader should be used for
// more sophisticated needs.
if ($components[0] != 'OpenStack') {
return;
}
// We need the path up to, but not including, the root OpenStack dir:
$loc = DIRECTORY_SEPARATOR . 'OpenStack';
$local_path = substr(self::$basedir, 0, strrpos(self::$basedir, $loc));
array_unshift($components, $local_path);
$path = implode(DIRECTORY_SEPARATOR, $components) . '.php';
if (file_exists($path)) {
require $path;
return;
}
}
}

View File

@ -21,7 +21,7 @@
*/
$base = dirname(__DIR__);
require_once $base . '/vendor/autoloader.php';
require_once $base . '/vendor/autoload.php';
use \OpenStack\ObjectStore\v1\ObjectStorage;
use \OpenStack\Identity\v2\IdentityService;
@ -33,7 +33,6 @@ $config = [
'transport.ssl.verify' => 0,
];
\OpenStack\Autoloader::useAutoloader();
\OpenStack\Bootstrap::setConfiguration($config);
$help = "Authenticate against OpenStack Identity Service.

View File

@ -1,48 +0,0 @@
<?php
/* ============================================================================
(c) Copyright 2014 Hewlett-Packard Development Company, L.P.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
============================================================================ */
/**
* Unit tests for the Autoloader.
*/
namespace OpenStack\Tests;
require_once 'src/OpenStack/Autoloader.php';
class AutoloaderTest extends TestCase
{
/**
* Test the BaseDir.
*/
public function testBasedir()
{
$basedir = \OpenStack\Autoloader::$basedir;
$this->assertRegExp('/OpenStack/', $basedir);
}
/**
* Test the autoloader.
*/
public function testAutoloader()
{
\OpenStack\Autoloader::useAutoloader();
// If we can construct a class, we are okay.
$test = new \OpenStack\Common\Exception("TEST");
$this->assertInstanceOf('\OpenStack\Common\Exception', $test);
}
}