Re: Namespaced code with SabreDAV
| From: | Tommy Pham | Date: | Fri, 07 Oct 2011 03:52:58 +0000 |
| Subject: | Re: Namespaced code with SabreDAV | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-315160@lists.php.net to get a copy of this message | ||
On Thu, Oct 6, 2011 at 1:45 PM, Tommy Pham <tommyhp2@gmail.com> wrote:
> On Thu, Oct 6, 2011 at 7:37 AM, Andrew Mason <slackmase2@gmail.com> wrote:
>
>> Hello all,
>> I am trying to use the wonderful SabreDAV library to create a webdav
>> share. I have a demo up and running however the framework / class i'm
>> using is namespaced, and SabreDAV unfortunately does not have a 5.3
>> style namespace declaration.
>>
>> I have an spl_autoload function registered in my base controller and
>> so long as I prefix the classname with a \ it all works:
>>
>>
>> $rootDirectory = new \Sabre_DAV_FS_Directory($rootDir);
>>
>> // The server object is responsible for making sense out of the WebDAV
>> protocol
>> $server = new \Sabre_DAV_Server($rootDirectory);
>>
>>
>> However, SabreDAV it's self has a large amount of other PHP classes
>> which it calls which obviously aren't prefixed with '\'
>>
>> Is there a way i can tell PHP any class name that get's instanciated
>> with 'Sabre_' should resolve to '\Sabre' ?
>>
>> Many thanks
>> Andrew
>>
>>
> If my memory serves regarding PHP's namespace, you could build something
> like this
>
> $file = APP_DIR.'\'.$class;
> if( file_exists( $file ) ) require_once $file;
>
> into your autoloader. You may have to adjust '/' to/from '\\' depending on
> your platform or you can use the constant DIRECTORY_SEPARATOR in the full
> path to the class. Then you don't need add \ before your class to
> instantiate. I don't know how the SabreDAV framework looks like but you may
> want to look at how Zend framework loads their class as to give you some
> idea what you may need to do in your autoload to circumvent SabreDAV being
> not 5.3 namespace declaration. You may also want to take a look at
> CodeIgniter's autoloading mechanism.
>
> Regards,
> Tommy
>
Here's another idea that you could do with the autoloader. The autoloader
is slightly modified from PureMVC's site to suit my needs. Using namespace
and everything that's PHP v5.3+, this is part of PureMVC framework that I've
ported over from the original Flash code a while back.
define( 'PMVC_BASE_DIR', str_replace( '\\', '/', __DIR__
).'/' );
function __autoload( $class )
{
if( stristr( $class, '\\' ) )
{
$file = APP_DIR.str_replace( '\\', '/', $class ).EXT;
if( file_exists( $file ) ) require_once $file;
else throw new \Exception( 'Unable to find class '.$class.
' in the expected location '.$file );
} else
{
$_basePaths = array(
PMVC_BASE_DIR.'org/puremvc/php/patterns/facade/',
PMVC_BASE_DIR.'org/puremvc/php/interfaces/',
PMVC_BASE_DIR.'org/puremvc/php/core/',
PMVC_BASE_DIR.'org/puremvc/php/patterns/',
PMVC_BASE_DIR.'org/puremvc/php/patterns/command/',
PMVC_BASE_DIR.'org/puremvc/php/patterns/mediator/',
PMVC_BASE_DIR.'org/puremvc/php/patterns/observer/',
PMVC_BASE_DIR.'org/puremvc/php/patterns/proxy/' );
$classPaths = array_merge( explode( PATH_SEPARATOR,
get_include_path() ), $_basePaths );
foreach( $classPaths as $classPath )
{
$path = $classPath.$class.EXT;
if( file_exists( $path ) )
{
require_once $path;
return;
}
}
throw new \Exception( 'Unable to find class '.$class.' in '.
implode( PATH_SEPARATOR, $classPaths ) );
}
}