公共文件夹中的静态文件在 PHP MVC 架构中不起作用

static files inside public folder not working in PHP MVC Archteicture

提问人:Mohye Mahmoud 提问时间:10/13/2023 最后编辑:Mohye Mahmoud 更新时间:11/22/2023 访问量:39

问:

我的项目结构

  • 核心

    路由器.php

  • HTTP的

    • 控制器

      索引:.php

  • 公共

    CSS的

    js

    IMG的

    索引:.php

  • 视图

路由:.php

索引 .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();
}

路由器:.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'];
    }


}

路由:.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');

当我调用它们时,公用文件夹中存在的所有静态文件和库在项目的其他页面中都不起作用。

我使用 php -S lcoalhost:8080 在公共文件夹中运行该项目

我尝试更改静态文件的路径,但它不起作用,我也尝试将 .htaccess 添加到项目中,但也不起作用

JavaScript PHP CSS 文件 模型视图控制器

评论

2赞 Repox 10/13/2023
“doesn't work” 是什么意思?
0赞 Mohye Mahmoud 10/19/2023
我的意思是,当我调用它们时,公共文件夹中显示的静态文件 JS CSS LIB 图像在其他页面中不起作用

答:

0赞 tereško 11/22/2023 #1

那是因为你 php 内置的“服务器”不是真正的服务器(因为缺乏更好的描述)。您应该学习如何使用 docker 设置 nginx/fpm 服务器。

Buuut,简而言之,您可以创建一个单独的文件,该文件尝试加载现有文件,然后再对 .index.php

将服务器初始化命令更改为如下所示:
php -S 127.0.0.1:8080 ./public/built-in.php

有点像这个练习(它有点过时了,但应该解释这个想法)。