Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请问如何在php MVC框架中为多个文件夹中的任何类控制器动态设置名称空间 Symfony似乎是一个解决方案。您可以应用如下内容(默认情况下是递归的): $finder->files()->in(“”)->name(“”);_Php_Oop_Model View Controller_Namespaces_Composer Php - Fatal编程技术网

请问如何在php MVC框架中为多个文件夹中的任何类控制器动态设置名称空间 Symfony似乎是一个解决方案。您可以应用如下内容(默认情况下是递归的): $finder->files()->in(“”)->name(“”);

请问如何在php MVC框架中为多个文件夹中的任何类控制器动态设置名称空间 Symfony似乎是一个解决方案。您可以应用如下内容(默认情况下是递归的): $finder->files()->in(“”)->name(“”);,php,oop,model-view-controller,namespaces,composer-php,Php,Oop,Model View Controller,Namespaces,Composer Php,我已经在我的评论中写了上述内容,但我想写一个答案,只是为了给你一些建议: 请注意,没有“PHP MVC框架”。相反,您可以说“用于(PHP)MVC应用程序的(PHP)框架”。为什么?因为框架不是MVC应用程序 框架: 框架只是在同一屋檐下聚集在一起的一组库,等待一个或多个MVC应用程序使用。下面是一个库类型列表,其中的链接指向一些个人首选的示例资源,它们应该/可能是框架的一部分: a 一名路线调度员(最可能包括一名司机) 错误处理库(阅读文章) a用于创建和处理所有HTTP消息,例如请求和响应

我已经在我的评论中写了上述内容,但我想写一个答案,只是为了给你一些建议:

请注意,没有“PHP MVC框架”。相反,您可以说“用于(PHP)MVC应用程序的(PHP)框架”。为什么?因为框架不是MVC应用程序

框架:

框架只是在同一屋檐下聚集在一起的一组库,等待一个或多个MVC应用程序使用。下面是一个库类型列表,其中的链接指向一些个人首选的示例资源,它们应该/可能是框架的一部分:

  • a
  • 一名路线调度员(最可能包括一名司机)
  • 错误处理库(阅读文章)
  • a用于创建和处理所有HTTP消息,例如请求和响应
  • 一个用于查找和加载配置文件的库-可以使用类似于已经推荐的配置文件的东西
  • 用于加载和呈现模板文件的库
  • 其他图书馆
MVC应用程序:

另一方面,与框架完全分离的是MVC应用程序。它是一个实际的程序,处理每个用户请求,并按照原则分为三个部分(C、V&M)。因此,MVC应用程序结构确保了表示逻辑(V&C)与业务逻辑(M)的分离。什么应该包含MVC应用程序

  • 表示每个MVC组件的类/接口,例如M、V、C
  • a创建、准备依赖项并将其注入三个MVC组件的类实例中
  • a将每个HTTP请求与预定义的路由列表相匹配,并分派找到的路由
  • 配置文件-包含路由列表,以及DI容器的定义值和参数
  • 客户端资产(模板文件、js&css文件、图像、字体等)
  • 用于处理客户端资产(、等)的库
  • 其他课程/图书馆
您尝试实现自己的框架组件(如路由器)真是太棒了。那样你肯定会学到很多。不过,自己实现框架库需要很长时间。因此,我建议您使用其他人/公司开发的(开源)库,并专注于如何以这样的方式嵌入和扩展它们,使它们适合您对未来MVC应用程序的愿景。通过这样做,您仍然有机会学习与MVC有关的所有知识,您将获得一个可靠的、正确实现的框架,并且最终您将能够集中精力开发MVC应用程序

请注意,一些/许多框架将MVC应用程序组件(M、V和C)的基类包含在其框架代码库中。它们这样做只是为了帮助用户使用驻留在这些类中的helper方法。不过,这些方法不是真的需要,就是应该在基类中定义它们,作为MVC应用程序的一部分。我说的是像
BaseController
BaseView
,等等

也就是说,以下是关于您的代码的一些观察结果:

  • 我建议您完全避免使用静态方法和单例(如果您已经在使用它们)。例如,观看meetup直到结束。之后你可以自己决定

  • 路由器应该只有一个任务要执行:根据HTTP方法(GET、POST等)和当前请求的URI路径,在预定义的路由列表中查找某个路由。然后,它可以按原样返回匹配的路由(例如,作为对象),也可以只返回包含其组件的数组(控制器、方法、参数列表)。因此,通过调用
    call_user\u func_array(['',[])
    ,调度/调用找到的路由(组件)是另一个组件(例如,路由调度器/调用器,甚至是前端控制器本身)的责任

  • 请记住,框架代码应该与MVC应用程序的代码完全分离,您不应该拥有
    framework\Controllers
    。相反,您可以使用
    Framework\Router
    App\Controllers

  • 您应该尽可能避免从PHP代码中打印HTML代码


这是否回答了您的问题?是否存在与给定代码不兼容的内容?那么请解释你面临的问题SYMFONY似乎是一个解决方案。您可以这样应用(默认情况下是递归的):
$finder->files()->in(“”)->name(“”)。也许你也应该考虑一下。Symfony的Finder组件适合我的解决方案。非常感谢。代码没有问题。它很好用。我只需要在Framework\Controllers中添加更多目录,以便更好地组织。
<?php

namespace Application\Core;
use Application\Core\View;


class Router {


    public function __construct() {}
    /**
     method that routes the url
     * @param  [array] $url [contains an array of current url in the browser]
     * @return [object]      [an instance ocontroller being called]
     */
    
    public static function route($url) {
        $controller = (isset($url[0]) && $url[0] !== "") ? ucwords($url[0])."Controller" : "HomeController";
        $controller = "Framework\Controllers\\".$controller;
        array_shift($url);
        $method = (isset($url[0]) && $url[0] !== "") ? $url[0] : "index";
        array_shift($url);
        $arguments = empty($url) ? [] : array_values($url);
        if (self::isValidController($controller) === true) {
            $controller = new $controller;
            if(self::isValidMethod($controller, $method) === true) {
                empty($arguments) ? $controller->{$method}() : call_user_func_array([$controller, $method], $arguments);
            } else {
                http_response_code(404);
                exit(View::render("http", "codes/404", ["title" => "Page Not Found"]));
            }
        }else {
            http_response_code(404);
            exit(View::render("http", "codes/404", ["title" => "Page Not Found"]));
        } 
    }

    private static function isValidController($controller){
        if(!empty($controller)){
            return (preg_match('/\A[a-z]+\z/i', $controller) || class_exists($controller) || strtolower($controller) === "homecontroller") ? true : false;
        }else { 
            return false; 
        }
    }

    private static function isValidMethod($controller, $method){
        if(!empty($method)){
            return (preg_match('/\A[a-z]+\z/i', $method) || method_exists($controller, $method)  || strtolower($method) === "index") ? true : false;
        }else { 
            return false; 
        }
    }

    public static function redirect($location) {
        if (!headers_sent()) {
            header('Location: '.DOMAIN.$location);
        }else {
            echo '<script type="text/javascript">';
            echo 'window.location.href="'.DOMAIN.$location.'";';
            echo '</script>';
            echo '<noscript>';
            echo '<meta http-equiv="refresh" content="0;url='.$location.'" />';
            echo '</noscript>';
            exit;
        }
    }

}
$finder->files()->in('<path-to-controllers-folder>')->name('<name-of-controller-file>');