类似于PHP中的类的模型

时间:2016-04-28 08:08:17

标签: php

我想描述一下我想做什么。我正在创建自己的框架,对于每个视图(即。http://localhost/admin/article/images/1),它将在文件夹ArticleController()中调用新类admin/article,然后在带有参数的cal函数images()中调用这个例子是id = 1

这很好用,但现在我想让我的框架更容易阅读。例如ArticleController有很多功能,因为你可以制作新文章,编辑,删除,添加图像,更改类别等等,文件越来越大。现在它有超过520行代码,很难阅读。我想做的就像模特一样。因此,在同一目录中,可以有ModelImages这样的文件,它将包含getImagesuploadImage等函数...

可以有更多模型文件(Model*.php),然后所有模型文件都应该作为其父级访问ArticleController。我知道,我可以class ModelImages extends ArticleController...然后new ModelImages()代替new ArticleController(),但其他型号呢?

你见过类似的东西吗?或者,它甚至可能吗?

2 个答案:

答案 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");
        }
}