diff --git a/cli/Valet/Drivers/BasicValetDriver.php b/cli/Valet/Drivers/BasicValetDriver.php index 5b9f01958..a45b9b973 100644 --- a/cli/Valet/Drivers/BasicValetDriver.php +++ b/cli/Valet/Drivers/BasicValetDriver.php @@ -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'; } } diff --git a/cli/Valet/Drivers/BasicWithPublicValetDriver.php b/cli/Valet/Drivers/BasicWithPublicValetDriver.php new file mode 100644 index 000000000..1c473b053 --- /dev/null +++ b/cli/Valet/Drivers/BasicWithPublicValetDriver.php @@ -0,0 +1,75 @@ +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; + } + } + } +} diff --git a/cli/Valet/Drivers/ValetDriver.php b/cli/Valet/Drivers/ValetDriver.php index f5bc58f5a..3a4cd3766 100644 --- a/cli/Valet/Drivers/ValetDriver.php +++ b/cli/Valet/Drivers/ValetDriver.php @@ -78,6 +78,7 @@ public static function assign($sitePath, $siteName, $uri) $drivers[] = 'NeosValetDriver'; $drivers[] = 'Magento2ValetDriver'; + $drivers[] = 'BasicWithPublicValetDriver'; $drivers[] = 'BasicValetDriver'; foreach ($drivers as $driver) { diff --git a/tests/Drivers/BaseDriverTestCase.php b/tests/Drivers/BaseDriverTestCase.php index d48359fc0..8bbc2c6f3 100644 --- a/tests/Drivers/BaseDriverTestCase.php +++ b/tests/Drivers/BaseDriverTestCase.php @@ -2,6 +2,11 @@ class BaseDriverTestCase extends Yoast\PHPUnitPolyfills\TestCases\TestCase { + public function set_up(): void + { + $_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit'; + } + public function projects(): array { return Filesystem::scanDir(__DIR__.'/projects'); diff --git a/tests/Drivers/BasicValetDriverTest.php b/tests/Drivers/BasicValetDriverTest.php index a33368427..49a4a96c4 100644 --- a/tests/Drivers/BasicValetDriverTest.php +++ b/tests/Drivers/BasicValetDriverTest.php @@ -12,4 +12,59 @@ 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(); + + $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(); + + $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(); + + $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(); + + $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(); + + $this->assertEquals( + $projectPath.'/assets/document.txt', + $driver->isStaticFile($projectPath, 'my-site', '/assets/document.txt') + ); + } } diff --git a/tests/Drivers/BasicWithPublicValetDriverTest.php b/tests/Drivers/BasicWithPublicValetDriverTest.php new file mode 100644 index 000000000..51a7ed2a5 --- /dev/null +++ b/tests/Drivers/BasicWithPublicValetDriverTest.php @@ -0,0 +1,86 @@ +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(); + + $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(); + + $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(); + + $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(); + + $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(); + + $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(); + + $this->assertEquals( + $projectPath.'/public/assets/document.txt', + $driver->isStaticFile($projectPath, 'my-site', '/assets/document.txt') + ); + } +} diff --git a/tests/Drivers/BedrockValetDriverTest.php b/tests/Drivers/BedrockValetDriverTest.php index 39613acaf..75ef6d585 100644 --- a/tests/Drivers/BedrockValetDriverTest.php +++ b/tests/Drivers/BedrockValetDriverTest.php @@ -22,8 +22,6 @@ public function test_it_gets_front_controller() { $driver = new BedrockValetDriver(); - $_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit'; - $projectPath = $this->projectDir('bedrock'); $this->assertEquals($projectPath.'/web/index.php', $driver->frontControllerPath($projectPath, 'my-site', '/')); } diff --git a/tests/Drivers/CraftValetDriverTest.php b/tests/Drivers/CraftValetDriverTest.php index 19c0dc935..1a75479d2 100644 --- a/tests/Drivers/CraftValetDriverTest.php +++ b/tests/Drivers/CraftValetDriverTest.php @@ -22,8 +22,6 @@ public function test_it_gets_front_controller() { $driver = new CraftValetDriver(); - $_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit'; - $projectPath = $this->projectDir('craft'); $this->assertEquals($projectPath.'/public/index.php', $driver->frontControllerPath($projectPath, 'my-site', '/')); } diff --git a/tests/Drivers/DrupalValetDriverTest.php b/tests/Drivers/DrupalValetDriverTest.php index 6253b27ea..b992793c5 100644 --- a/tests/Drivers/DrupalValetDriverTest.php +++ b/tests/Drivers/DrupalValetDriverTest.php @@ -22,8 +22,6 @@ public function test_it_gets_front_controller() { $driver = new DrupalValetDriver(); - $_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit'; - $projectPath = $this->projectDir('drupal'); $this->assertEquals($projectPath.'/public/index.php', $driver->frontControllerPath($projectPath, 'my-site', '/')); } diff --git a/tests/Drivers/JoomlaValetDriverTest.php b/tests/Drivers/JoomlaValetDriverTest.php index 7a86f2ac2..0807aa9c9 100644 --- a/tests/Drivers/JoomlaValetDriverTest.php +++ b/tests/Drivers/JoomlaValetDriverTest.php @@ -22,8 +22,6 @@ public function test_it_gets_front_controller() { $driver = new JoomlaValetDriver(); - $_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit'; - $projectPath = $this->projectDir('joomla'); $this->assertEquals($projectPath.'/index.php', $driver->frontControllerPath($projectPath, 'my-site', '/')); } diff --git a/tests/Drivers/KirbyValetDriverTest.php b/tests/Drivers/KirbyValetDriverTest.php index f37a72c5d..b6759d51d 100644 --- a/tests/Drivers/KirbyValetDriverTest.php +++ b/tests/Drivers/KirbyValetDriverTest.php @@ -22,8 +22,6 @@ public function test_it_gets_front_controller() { $driver = new KirbyValetDriver(); - $_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit'; - $projectPath = $this->projectDir('kirby'); $this->assertEquals($projectPath.'/index.php', $driver->frontControllerPath($projectPath, 'my-site', '/')); } diff --git a/tests/Drivers/ValetDriverTest.php b/tests/Drivers/ValetDriverTest.php index 86ce32d4b..ba707d231 100644 --- a/tests/Drivers/ValetDriverTest.php +++ b/tests/Drivers/ValetDriverTest.php @@ -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)); + } } diff --git a/tests/Drivers/WordPressValetDriverTest.php b/tests/Drivers/WordPressValetDriverTest.php index 5f0d493e4..e45875237 100644 --- a/tests/Drivers/WordPressValetDriverTest.php +++ b/tests/Drivers/WordPressValetDriverTest.php @@ -22,8 +22,6 @@ public function test_it_gets_front_controller() { $driver = new WordPressValetDriver(); - $_SERVER['HTTP_HOST'] = 'this is set in Valet requests but not phpunit'; - $projectPath = $this->projectDir('wordpress'); $this->assertEquals($projectPath.'/index.php', $driver->frontControllerPath($projectPath, 'my-site', '/')); } diff --git a/tests/Drivers/projects/basic-no-public/about/index.php b/tests/Drivers/projects/basic-no-public/about/index.php new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/basic-no-public/assets/document.txt b/tests/Drivers/projects/basic-no-public/assets/document.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/basic-no-public/file-in-root.php b/tests/Drivers/projects/basic-no-public/file-in-root.php new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/basic-no-public/index.php b/tests/Drivers/projects/basic-no-public/index.php new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/basic-no-public/team/index.html b/tests/Drivers/projects/basic-no-public/team/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/public-with-index-non-laravel/file-in-root.php b/tests/Drivers/projects/public-with-index-non-laravel/file-in-root.php new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/public-with-index-non-laravel/public/about/index.php b/tests/Drivers/projects/public-with-index-non-laravel/public/about/index.php new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/public-with-index-non-laravel/public/assets/document.txt b/tests/Drivers/projects/public-with-index-non-laravel/public/assets/document.txt new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/public-with-index-non-laravel/public/file-in-public.php b/tests/Drivers/projects/public-with-index-non-laravel/public/file-in-public.php new file mode 100644 index 000000000..e69de29bb diff --git a/tests/Drivers/projects/public-with-index-non-laravel/public/team/index.html b/tests/Drivers/projects/public-with-index-non-laravel/public/team/index.html new file mode 100644 index 000000000..e69de29bb