1
0
mirror of https://github.com/laravel/valet.git synced 2026-02-05 16:40:05 +01:00

Extract basic driver with public/ from basic driver, and simplify both

This commit is contained in:
Matt Stauffer
2022-12-03 18:10:54 -05:00
parent 05150d50ad
commit 59967c3068
16 changed files with 256 additions and 95 deletions

View File

@@ -27,11 +27,7 @@ public function serves($sitePath, $siteName, $uri)
*/
public function isStaticFile($sitePath, $siteName, $uri)
{
if (file_exists($staticFilePath = $sitePath.'/public'.rtrim($uri, '/').'/index.html')) {
return $staticFilePath;
} elseif (file_exists($staticFilePath = $sitePath.'/public'.rtrim($uri, '/').'/index.php')) {
return $staticFilePath;
} elseif (file_exists($staticFilePath = $sitePath.'/public'.$uri)) {
if (file_exists($staticFilePath = $sitePath.rtrim($uri, '/').'/index.html')) {
return $staticFilePath;
} elseif ($this->isActualFile($staticFilePath = $sitePath.$uri)) {
return $staticFilePath;
@@ -54,13 +50,16 @@ public function frontControllerPath($sitePath, $siteName, $uri)
$_SERVER['SERVER_ADDR'] = '127.0.0.1';
$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
$dynamicCandidates = [
$this->asActualFile($sitePath, $uri),
$this->asPhpIndexFileInDirectory($sitePath, $uri),
$this->asHtmlIndexFileInDirectory($sitePath, $uri),
$uri = rtrim($uri, '/');
$candidates = [
$sitePath.$uri,
$sitePath.$uri.'/index.php',
$sitePath.'/index.php',
$sitePath.'/index.html',
];
foreach ($dynamicCandidates as $candidate) {
foreach ($candidates as $candidate) {
if ($this->isActualFile($candidate)) {
$_SERVER['SCRIPT_FILENAME'] = $candidate;
$_SERVER['SCRIPT_NAME'] = str_replace($sitePath, '', $candidate);
@@ -69,90 +68,5 @@ public function frontControllerPath($sitePath, $siteName, $uri)
return $candidate;
}
}
$fixedCandidatesAndDocroots = [
$this->asRootPhpIndexFile($sitePath) => $sitePath,
$this->asPublicPhpIndexFile($sitePath) => $sitePath.'/public',
$this->asPublicHtmlIndexFile($sitePath) => $sitePath.'/public',
];
foreach ($fixedCandidatesAndDocroots as $candidate => $docroot) {
if ($this->isActualFile($candidate)) {
$_SERVER['SCRIPT_FILENAME'] = $candidate;
$_SERVER['SCRIPT_NAME'] = '/index.php';
$_SERVER['DOCUMENT_ROOT'] = $docroot;
return $candidate;
}
}
}
/**
* Concatenate the site path and URI as a single file name.
*
* @param string $sitePath
* @param string $uri
* @return string
*/
protected function asActualFile($sitePath, $uri)
{
return $sitePath.$uri;
}
/**
* Format the site path and URI with a trailing "index.php".
*
* @param string $sitePath
* @param string $uri
* @return string
*/
protected function asPhpIndexFileInDirectory($sitePath, $uri)
{
return $sitePath.rtrim($uri, '/').'/index.php';
}
/**
* Format the site path and URI with a trailing "index.html".
*
* @param string $sitePath
* @param string $uri
* @return string
*/
protected function asHtmlIndexFileInDirectory($sitePath, $uri)
{
return $sitePath.rtrim($uri, '/').'/index.html';
}
/**
* Format the incoming site path as root "index.php" file path.
*
* @param string $sitePath
* @return string
*/
protected function asRootPhpIndexFile($sitePath)
{
return $sitePath.'/index.php';
}
/**
* Format the incoming site path as a "public/index.php" file path.
*
* @param string $sitePath
* @return string
*/
protected function asPublicPhpIndexFile($sitePath)
{
return $sitePath.'/public/index.php';
}
/**
* Format the incoming site path as a "public/index.php" file path.
*
* @param string $sitePath
* @return string
*/
protected function asPublicHtmlIndexFile($sitePath)
{
return $sitePath.'/public/index.html';
}
}

View File

@@ -0,0 +1,75 @@
<?php
namespace Valet\Drivers;
class BasicWithPublicValetDriver extends ValetDriver
{
/**
* Determine if the driver serves the request.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return is_dir($sitePath.'/public/');
}
/**
* Determine if the incoming request is for a static file.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string|false
*/
public function isStaticFile($sitePath, $siteName, $uri)
{
$publicPath = $sitePath.'/public/'.trim($uri, '/');
if ($this->isActualFile($publicPath)) {
return $publicPath;
} elseif (file_exists($publicPath . '/index.html')) {
return $publicPath . '/index.html';
}
return false;
}
/**
* Get the fully resolved path to the application's front controller.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
$_SERVER['PHP_SELF'] = $uri;
$_SERVER['SERVER_ADDR'] = '127.0.0.1';
$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
$docRoot = $sitePath.'/public';
$uri = rtrim($uri, '/');
$candidates = [
$docRoot.$uri,
$docRoot.$uri.'/index.php',
$docRoot.'/index.php',
$docRoot.'/index.html',
];
foreach ($candidates as $candidate) {
if ($this->isActualFile($candidate)) {
$_SERVER['SCRIPT_FILENAME'] = $candidate;
$_SERVER['SCRIPT_NAME'] = str_replace($sitePath.'/public', '', $candidate);
$_SERVER['DOCUMENT_ROOT'] = $sitePath.'/public';
return $candidate;
}
}
}
}

View File

@@ -78,6 +78,7 @@ public static function assign($sitePath, $siteName, $uri)
$drivers[] = 'NeosValetDriver';
$drivers[] = 'Magento2ValetDriver';
$drivers[] = 'BasicWithPublicValetDriver';
$drivers[] = 'BasicValetDriver';
foreach ($drivers as $driver) {

View File

@@ -12,4 +12,69 @@ public function test_it_serves_anything()
$this->assertTrue($driver->serves($projectDir, 'my-site', '/'));
}
}
public function test_it_serves_php_files_from_root()
{
$projectPath = $this->projectDir('basic-no-public');
$driver = new BasicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath.'/file-in-root.php',
$driver->frontControllerPath($projectPath, 'my-site', '/file-in-root.php')
);
}
public function test_it_serves_directory_with_index_php()
{
$projectPath = $this->projectDir('basic-no-public');
$driver = new BasicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath . '/about/index.php',
$driver->frontControllerPath($projectPath, 'my-site', '/about')
);
}
public function test_it_routes_to_index_if_404()
{
$projectPath = $this->projectDir('basic-no-public');
$driver = new BasicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath . '/index.php',
$driver->frontControllerPath($projectPath, 'my-site', '/not-a-real-url')
);
}
public function test_it_serves_directory_with_index_html()
{
$projectPath = $this->projectDir('basic-no-public');
$driver = new BasicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath . '/team/index.html',
$driver->isStaticFile($projectPath, 'my-site', '/team')
);
}
public function test_it_serves_static_files()
{
$projectPath = $this->projectDir('basic-no-public');
$driver = new BasicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath . '/assets/document.txt',
$driver->isStaticFile($projectPath, 'my-site', '/assets/document.txt')
);
}
}

View File

@@ -0,0 +1,98 @@
<?php
use Valet\Drivers\BasicWithPublicValetDriver;
class BasicWithPublicValetDriverTest extends BaseDriverTestCase
{
public function test_it_serves_anything_with_public()
{
$driver = new BasicWithPublicValetDriver();
$this->assertTrue($driver->serves($this->projectDir('public-with-index-non-laravel'), 'my-site', '/'));
}
public function test_it_doesnt_serve_from_not_public()
{
$driver = new BasicWithPublicValetDriver();
$this->assertFalse($driver->serves($this->projectDir('basic-no-public'), 'my-site', '/'));
}
public function test_it_serves_php_files_from_public()
{
$projectPath = $this->projectDir('public-with-index-non-laravel');
$driver = new BasicWithPublicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath . '/public/file-in-public.php',
$driver->frontControllerPath($projectPath, 'my-site', '/file-in-public.php')
);
}
public function test_it_doesnt_serve_php_files_from_root()
{
$projectPath = $this->projectDir('public-with-index-non-laravel');
$driver = new BasicWithPublicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath.'/public/index.php',
$driver->frontControllerPath($projectPath, 'my-site', '/file-in-root.php')
);
}
public function test_it_serves_directory_with_index_php()
{
$projectPath = $this->projectDir('public-with-index-non-laravel');
$driver = new BasicWithPublicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath . '/public/about/index.php',
$driver->frontControllerPath($projectPath, 'my-site', '/about')
);
}
public function test_it_route_to_public_index_if_404()
{
$projectPath = $this->projectDir('public-with-index-non-laravel');
$driver = new BasicWithPublicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath . '/public/index.php',
$driver->frontControllerPath($projectPath, 'my-site', '/not-a-real-url')
);
}
public function test_it_serves_directory_with_index_html()
{
$projectPath = $this->projectDir('public-with-index-non-laravel');
$driver = new BasicWithPublicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath.'/public/team/index.html',
$driver->isStaticFile($projectPath, 'my-site', '/team')
);
}
public function test_it_serves_static_files()
{
$projectPath = $this->projectDir('public-with-index-non-laravel');
$driver = new BasicWithPublicValetDriver();
$_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit';
$this->assertEquals(
$projectPath.'/public/assets/document.txt',
$driver->isStaticFile($projectPath, 'my-site', '/assets/document.txt')
);
}
}

View File

@@ -19,4 +19,12 @@ public function test_it_assigns_drivers_to_given_project()
$this->assertEquals('Valet\Drivers\BedrockValetDriver', get_class($assignedDriver));
}
public function test_it_prioritizes_non_basic_matches()
{
$assignedDriver = ValetDriver::assign($this->projectDir('laravel'), 'my-site', '/');
$this->assertNotEquals('Valet\Drivers\BasicWithPublicValetDriver', get_class($assignedDriver));
$this->assertNotEquals('Valet\Drivers\BasicValetDriver', get_class($assignedDriver));
}
}