lithium\core\Libraries::realPath PHP Method

realPath() public static method

Wraps the PHP realpath() function to add support for finding paths to files inside Phar archives.
public static realPath ( string $path ) : string
$path string An unresolved path to a file inside a Phar archive which may or may not exist.
return string If `$path` is a valid path to a file inside a Phar archive, returns a string in the format `'phar:///'`. Otherwise returns `null`.
    public static function realPath($path)
    {
        if (($absolutePath = realpath($path)) !== false) {
            return $absolutePath;
        }
        if (!preg_match('%^phar://([^.]+\\.phar(?:\\.gz)?)(.+)%', $path, $pathComponents)) {
            return;
        }
        list(, $relativePath, $pharPath) = $pathComponents;
        $pharPath = implode('/', array_reduce(explode('/', $pharPath), function ($parts, $value) {
            if ($value === '..') {
                array_pop($parts);
            } elseif ($value !== '.') {
                $parts[] = $value;
            }
            return $parts;
        }));
        if (($resolvedPath = realpath($relativePath)) !== false) {
            if (file_exists($absolutePath = "phar://{$resolvedPath}{$pharPath}")) {
                return $absolutePath;
            }
        }
    }

Usage Example

Example #1
0
 /**
  * Tests that `Libraries::map()` and `Libraries::unmap()`
  *
  */
 public function testMapUnmap()
 {
     $testApp = Libraries::get(true, 'resources') . '/tmp/tests/test_app';
     mkdir($testApp, 0777, true);
     Libraries::add('test_app', array('path' => $testApp));
     mkdir($testApp . '/lib', 0777);
     mkdir($testApp . '/_patch', 0777);
     file_put_contents($testApp . '/lib/LibTest.php', "<?php namespace test_app\\lib;\n\n\t\t\tclass LibTest{ public function testMe() {\n\t\t\t\treturn 'core class';\n\t\t\t}}");
     file_put_contents($testApp . '/_patch/PatchedLibTest.php', "<?php namespace test_app\\lib;\n\n\t\t\tclass LibTest{ public function testMe() {\n\t\t\t\treturn 'patched class';\n\t\t\t}}");
     $expected = $result = Libraries::realPath($testApp . '/lib/LibTest.php');
     $result = Libraries::path('test_app\\lib\\LibTest');
     $this->assertEqual($expected, $result);
     Libraries::map(array('test_app\\lib\\LibTest' => $testApp . '/_patch/PatchedLibTest.php'));
     $expected = $result = Libraries::realPath($testApp . '/_patch/PatchedLibTest.php');
     $result = Libraries::path('test_app\\lib\\LibTest');
     Libraries::unmap(array('test_app\\lib\\LibTest'));
     $expected = $result = Libraries::realPath($testApp . '/lib/LibTest.php');
     $result = Libraries::path('test_app\\lib\\LibTest');
     $this->assertEqual($expected, $result);
     Libraries::map(array('test_app\\lib\\LibTest' => $testApp . '/_patch/PatchedLibTest.php'));
     Libraries::unmap('test_app\\lib\\LibTest');
     $expected = $result = Libraries::realPath($testApp . '/lib/LibTest.php');
     $result = Libraries::path('test_app\\lib\\LibTest');
     Libraries::map(array('test_app\\lib\\LibTest' => $testApp . '/_patch/PatchedLibTest.php'));
     $object = new \test_app\lib\LibTest();
     $result = $object->testMe();
     $this->assertEqual('patched class', $result);
     $this->_cleanUp();
 }
All Usage Examples Of lithium\core\Libraries::realPath