我想描述一下我想做什么。我正在创建自己的框架,对于每个视图(即。http://localhost/admin/article/images/1
),它将在文件夹ArticleController()
中调用新类admin/article
,然后在带有参数的cal函数images()
中调用这个例子是id = 1
。
这很好用,但现在我想让我的框架更容易阅读。例如ArticleController
有很多功能,因为你可以制作新文章,编辑,删除,添加图像,更改类别等等,文件越来越大。现在它有超过520行代码,很难阅读。我想做的就像模特一样。因此,在同一目录中,可以有ModelImages
这样的文件,它将包含getImages
或uploadImage
等函数...
可以有更多模型文件(Model*.php
),然后所有模型文件都应该作为其父级访问ArticleController
。我知道,我可以class ModelImages extends ArticleController...
然后new ModelImages()
代替new ArticleController()
,但其他型号呢?
答案 0 :(得分:1)
您可以利用PHP 5.4中引入的PHP Traits的功能。 它们可以包含您可以无缝地注入每个类的功能。
在这里阅读更多相关信息: http://php.net/manual/en/language.oop5.traits.php
答案 1 :(得分:1)
对URL中的每个斜杠使用namespace。例如,/admin/article/images/1
可能会Admin\Article\Images::callController()
处理lib/Admin/Article/Images.php
。在这种情况下,文件系统可能看起来像namespace Admin\Article {
class Images {
public function test() {echo __CLASS__;}
}
}
namespace {
class RootController {
public static function getClassByUri($uri) {
$uri_parts = explode('/', $uri);
array_pop($uri_parts);
$parts = [];
foreach ($uri_parts as $part) {
$parts[]= static::_toCamelCase($part);
}
$class = implode('\\', $parts);
if (!class_exists($class)) {
throw new \RuntimeException("Can not find class for uri $uri");
}
return $class;
}
private static function _toCamelCase($string) {
return str_replace(' ', '',
ucwords(preg_replace('/[^a-z\d]/', ' ', strtolower($string))));
}
}
$uri = '/admin/article/images/1';
$class = RootController::getClassByUri($uri);
$obj = new $class();
$obj->test();
}
。
可能有根控制器将URI字符串转换为类名。例如:
$scope.collapsePanel = function(variable) {
if(document.getElementById(variable).className=="collapse in") {
document.getElementById(variable).className="collapse";
document.getElementById(variable).setAttribute("aria-expanded","false");
} else {
document.getElementById(variable).className="collapse in";
document.getElementById(variable).setAttribute("aria-expanded","true");
}
}