PHP MVC架构中public目录静态文件无法加载问题求助
PHP MVC架构静态文件加载异常求助
public目录下的css、js、img等静态文件仅在首页正常加载,其他页面调用时均失效。已通过php -S localhost:8080在public目录启动项目,尝试修改静态文件路径、添加.htaccess文件均无法解决问题,特此求助。
项目结构
- core
- Router.php
- http
- controllers
- index.php
- controllers
- public
- css
- js
- img
- index.php
- views
- routes.php
关键文件代码
public/index.php
<?php use Core\Router; const BASE_PATH = __DIR__ . '/../'; session_start(); require BASE_PATH . 'vendor/autoload.php'; require BASE_PATH . 'Core/functions.php'; require BASE_PATH . 'bootstrap.php'; $router = new Router(); require BASE_PATH . 'routes.php'; $uri = parse_url($_SERVER['REQUEST_URI'])['path']; $method = $_POST['_method'] ?? $_SERVER['REQUEST_METHOD']; try { $router->route($uri, $method); } catch (Exception $e) { echo $e->getMessage(); }
core/Router.php
<?php namespace Core; use Core\Middleware\Middleware; use Exception; use JetBrains\PhpStorm\NoReturn; class Router { protected array $routes = []; public function get($uri, $controller): void { $this->add('GET', $uri, $controller); } public function add($method, $uri, $controller): static { $this->routes[] = [ 'uri' => $uri, 'controller' => $controller, 'method' => $method, 'middleware' => null ]; return $this; } public function post($uri, $controller): void { $this->add('POST', $uri, $controller); } public function delete($uri, $controller): static { return $this->add('DELETE', $uri, $controller); } public function patch($uri, $controller): static { return $this->add('PATCH', $uri, $controller); } public function put($uri, $controller): static { return $this->add('PUT', $uri, $controller); } public function only($key): static { $this->routes[array_key_last($this->routes)]['middleware'] = $key; return $this; } /** * @throws Exception */ public function route($uri, $method) { foreach ($this->routes as $route) { if ($route['uri'] === $uri && $route['method'] === strtoupper($method)) { Middleware::resolve($route['middleware']); return require base_path('Http/controllers/' . $route['controller']); } } $this->abort(); } #[NoReturn] protected function abort($code = 404): void { http_response_code($code); require base_path("views/{$code}.php"); die(); } public function previousUrl() { return $_SERVER['HTTP_REFERER']; } }
routes.php
<?php /** @var Router $router */ use Core\Router; $router->get('/', 'index.php'); $router->get('/contact', 'contact.php'); $router->get('/about', 'about.php'); $router->get('/service', 'service.php'); $router->get('/menu', 'menu.php'); $router->get('/team', 'team.php'); $router->get('/testimonial', 'testimonial.php'); $router->get('/booking', 'booking/booking.php'); $router->get('/register', 'register/create.php'); $router->get('/login', 'session/create.php'); $router->get('/cart', 'cart/index.php');
内容的提问来源于stack exchange,提问作者Mohye Mahmoud
相关产品推荐
相关产品推荐

