请问如何在php MVC框架中为多个文件夹中的任何类控制器动态设置名称空间 Symfony似乎是一个解决方案。您可以应用如下内容(默认情况下是递归的): $finder->files()->in(“”)->name(“”);
我已经在我的评论中写了上述内容,但我想写一个答案,只是为了给你一些建议: 请注意,没有“PHP MVC框架”。相反,您可以说“用于(PHP)MVC应用程序的(PHP)框架”。为什么?因为框架不是MVC应用程序 框架: 框架只是在同一屋檐下聚集在一起的一组库,等待一个或多个MVC应用程序使用。下面是一个库类型列表,其中的链接指向一些个人首选的示例资源,它们应该/可能是框架的一部分:请问如何在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消息,例如请求和响应
- a李>
- 一名路线调度员(最可能包括一名司机)李>
- 错误处理库(阅读文章)李>
- a用于创建和处理所有HTTP消息,例如请求和响应李>
- 一个用于查找和加载配置文件的库-可以使用类似于已经推荐的配置文件的东西李>
- 用于加载和呈现模板文件的库李>
- 其他图书馆
- 表示每个MVC组件的类/接口,例如M、V、C李>
- a创建、准备依赖项并将其注入三个MVC组件的类实例中李>
- a将每个HTTP请求与预定义的路由列表相匹配,并分派找到的路由李>
- 配置文件-包含路由列表,以及DI容器的定义值和参数李>
- 客户端资产(模板文件、js&css文件、图像、字体等)李>
- 用于处理客户端资产(、等)的库
- 其他课程/图书馆
BaseController
,BaseView
,等等
也就是说,以下是关于您的代码的一些观察结果:
- 我建议您完全避免使用静态方法和单例(如果您已经在使用它们)。例如,观看meetup直到结束。之后你可以自己决定
- 路由器应该只有一个任务要执行:根据HTTP方法(GET、POST等)和当前请求的URI路径,在预定义的路由列表中查找某个路由。然后,它可以按原样返回匹配的路由(例如,作为对象),也可以只返回包含其组件的数组(控制器、方法、参数列表)。因此,通过调用
,调度/调用找到的路由(组件)是另一个组件(例如,路由调度器/调用器,甚至是前端控制器本身)的责任call_user\u func_array(['',[])
- 请记住,框架代码应该与MVC应用程序的代码完全分离,您不应该拥有
。相反,您可以使用framework\Controllers
和Framework\Router
App\Controllers
- 您应该尽可能避免从PHP代码中打印HTML代码
$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>');