Php 如何处理不断增长的控制器类?

Php 如何处理不断增长的控制器类?,php,model-view-controller,library-design,Php,Model View Controller,Library Design,当然,它会增长,并且变得无法维持 首先,泛型控件类是什么?一个网站应该有多个控制器(我假设它在某种程度上与MVC有关,因为“控制器”一词就是从这里来的),通常每个“页面”有一个控制器(粒度可能会变化,取决于架构模式) 下一个问题是大的开关语句。每个案例都应该在控制器中有一个单独的方法。由于设计错误,您最终会重复部分代码。您直接进入了反模式 控制器只不过是粘合逻辑。它将数据从请求(GET、POST等)传递到任何知道如何处理它的模型,格式化模型返回的任何结果,并将其分配给要渲染的视图 至少这是应该发

当然,它会增长,并且变得无法维持

首先,泛型
控件
类是什么?一个网站应该有多个控制器(我假设它在某种程度上与MVC有关,因为“控制器”一词就是从这里来的),通常每个“页面”有一个控制器(粒度可能会变化,取决于架构模式)


下一个问题是大的
开关
语句。每个
案例
都应该在控制器中有一个单独的方法。由于设计错误,您最终会重复部分代码。

您直接进入了反模式

控制器只不过是粘合逻辑。它将数据从请求(GET、POST等)传递到任何知道如何处理它的模型,格式化模型返回的任何结果,并将其分配给要渲染的视图

至少这是应该发生的

开发人员经常用应用程序逻辑填充控制器,使模型只剩下CRUD对象来访问数据库。这不是开发MVC应用程序的方法。模型应该是“领域专家”。除了存储应用程序正在使用的数据外,它们还需要知道该数据的含义、给定数据集的有效行为等。这使得模型具有可重用性、松散耦合性和高度一致性。您可以使用具有许多不同视图/控制器组合的丰富模型,而不会遇到困难

如果应用程序逻辑在控制器中,那么您将无法使用该控制器执行应用程序逻辑,或者更糟糕的是,您将最终将相同的代码复制并粘贴到不同的控制器中


如果控制器充满了应用程序逻辑,那么这肯定是一个迹象,表明您需要重新考虑您的设计和重构

为什么不让您的案例成为一个类方法(当它不存在时使用处理程序)?当它不存在时,处理程序是什么意思?类似于
如果(!method_exists('calledmethod'){header('Location:404.php');退出;}
我最终摆脱了依赖注入模式和工厂模式…为了将这个类减少一半…我还将文件调用拉到了另一个类中…我仍然不明白你在说什么…你是说使用header进行类/对象调用吗?没关系…除了ajax调用之外,我删除了所有调用…请查看我发布的新代码文件调用由另一个类处理。
$object_cin = new CIO( ); 
$object_cin->invoke( $_POST[ 'model' ] );

class CIO
{
    private function invoke( $model )
    {
        switch( $model ) 
        {
            case 'user_try':
                $model = new MUserTry();  
                $this->send( $model->invoke( 1 ) );
                break;
            case 'user_new':
                $model = new MUserNew( new IUniversals() , new IText(), new IMessage() ); 
                $this->send( $model->invoke() );
                break;
            case 'user_exist':
                $model = new MUserExist( new IUniversals() , new IText(), new IMessage() );  
                $this->send( $model->invoke() );
                break;
            case 'tweet':
                $model = new MTweet( new IUniversals() , new IText(), new IMessage() );
                $this->send( $model->invoke() );
                break; 
            default:
                echo "Incorrect Ajax Type provided";
        }
    }
    private function send( $string )
    {
        echo "|P|" . $string;
    }
}