php htaccess重写失败

时间:2020-06-10 10:11:41

标签: php .htaccess url-routing spl-autoload-register

我建立了一个php mvc框架,这是我的htaccess文件。它可以找到,但是,当我返回索引页面后,它找不到默认的平台,控制器和方法,而其他链接可以找到,只是找到了索引页面。我尝试在获取值后取消设置默认平台,控制器和方法,但仍无法正常工作


    RewriteEngine on
    Options -Indexes
    Options -Multiviews
    RewriteCond %{REQUEST_URI} !-f
    RewriteCond %{REQUEST_URI} !-d
    RewriteCond %{REQUEST_URI} !-l
    #RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
    RewriteRule ^([a-zA-Z_-]*)/?([a-zA-Z_-]*)?/?([a-zA-Z_-]*)$ index.php?platform=$1&controller=$2&action=$3 [NC,L]
    RewriteRule ^([a-zA-Z_-]*)/?([a-zA-Z_-]*)?/?([a-zA-Z_-]*)/?([0-9]*)$ index.php?platform=$1&controller=$2&action=$3&id=$4 [NC,L]

在我的控制器中,URL正在工作,可以传递参数并打开链接。 我在浏览器中的网址:blog.com/admin/products/list



    $id = (int)$_GET['id'];
    echo  'i am del';
    echo 'my id is :'.$id;
    echo '<br>';
    echo "<a href='/'>index</a>";
    echo '<br>';
    echo "<a href='/admin/products/list'>List</a>";

但是当我单击索引(blog.com)时,出现消息:致命错误:未捕获的错误:找不到类'\ Controller \ Controller';如果可以,则应类似于“ \ Controller ** Admin **** ProductsController **** list **” 默认的平台,控制器和方法不见了; 这是我的php文件:


     private static function initRoutes()
        {
            //unset($p);
            $p = $_GET['platform'] ?? "Admin";
            $c = $_GET['controller'] ?? "Products";
            $a = $_GET['action'] ?? "list";
            $p = ucfirst(strtolower($p));
            $c = ucfirst(strtolower($c));        
            $a = strtolower($a);            
            define('PLATFROM_NAME', $p);   
            define('CONTROLLER_NAME', $c);  
            define('ACTION_NAME', $a);      
            define('__URL__', CONTROLLER_PATH . $p . DS);  
            define('__VIEW__', VIEW_PATH . $p . DS);     //view path

        }

加载课程:



    private static function initAutoLoad()
        {
            spl_autoload_register(function ($class_name) {[enter image description here][1]
                $namespace = dirname($class_name);   
                $class_name = basename($class_name); 
                if (in_array($namespace, array('Core', 'Lib')))   
                    $path = FRAMEWORK_PATH . $namespace . DS . $class_name . '.class.php';
                elseif ($namespace == 'Model')     
                    $path = MODEL_PATH . $class_name . '.class.php';
                elseif ($namespace == 'Traits')    
                    $path = TRAITS_PATH . $class_name . '.class.php';
                else   
                    $path = CONTROLLER_PATH . PLATFROM_NAME . DS . $class_name . '.class.php';
                if (file_exists($path) && is_file($path))
                    require $path;
            });
        }

对象:



    private static function initDispatch()
        {
            $controller_name = '\Controller\\' . PLATFROM_NAME . '\\' . CONTROLLER_NAME . 'Controller';    
            $action_name = ACTION_NAME . 'Action';    
            $obj = new $controller_name();
            $obj->$action_name();
        }

url

1 个答案:

答案 0 :(得分:0)

initAutoLoad.htaccess文件无关:

  • 该错误告诉我initDispatch没有创建正确的 类名(在自动加载之前)
  • 中没有任何重写规则 htaccess文件匹配“ /”,并且可能默认情况下调用索引文件而不进行重写

\Controller\\Controller是一个类名,它告诉我PLATFROM_NAMECONTROLLER_NAME都是空的。

initRoutes定义了这两个变量。我能想到的唯一解释:

initDispatchinitRoutes之前被调用

安装XDebug并将断点设置为initRoutes是找出答案的最快方法。