MVC项目中Controller中的私有方法

时间:2017-09-15 20:01:01

标签: php model-view-controller

如果我在MVC项目中的控制器中有私有方法,那可以吗?我的意思是,这是一个好习惯吗?

这就是我的意思:

我的用户控制器中有一个方法public function settings($settings) { /** * Check if the user is logged in */ $auth = new Authenticate($this->user_type); if(!$auth->isUser()) { redirect(SITE_ADDR.'/public/home'); } switch ($settings) { default: error_404(); break; case "email": self::change_email(); break; case "password": self::change_password(); break; } } ,用于更改电子邮件和密码。

http://localhost/MVC/public/user/change_email

正如您所看到的,此方法中的开关调用来自同一类的其他方法是私有的。原因是我不希望有人手动修改URL并访问方法,然后出现各种错误:http://localhost/MVC/public/user/settings/email 正确的网址具有以下结构:settings

目前有2个私人方法 - 用于更改电子邮件和密码但我计划更多 - 添加个人资料详细信息(如真实姓名,描述等),可能连接Facebook或其他社交媒体帐户等。我不&# 39;我希望我的<!DOCTYPE html> <html> <head> <title>Prototype</title> <script type="text/javascript" src="https://yourserver/javascripts/api/tableau-2.min.js"></script> <script type="text/javascript"> var viz, containerDiv function initViz() { containerDiv = document.getElementById("vizContainer"), url = "https://yourserver/views/yourworkbook/yourdashboard", options = { onFirstInteractive: function () { console.log("Run this code when the viz has finished loading."); mainWorkbook = viz.getWorkbook(); } }; // end options // Create a viz object and embed it in the container div. viz = new tableau.Viz(containerDiv, url, options); viz.addEventListener(tableauSoftware.TableauEventName.FILTER_CHANGE, function(e){ if (e.getFieldName() == 'Filter1'){ e.getFilterAsync().then(function(filter) { var values = filter.getAppliedValues(); var value = values[0]['value']; // Value of the parameter if "All" is selected in the filter. if (values.length > 1) { value = 'All'; } viz.getWorkbook().changeParameterValueAsync('Parameter1', value); }); } // end if statement }); // end event listener } // end initViz </script> 方法太长。

那你怎么看?这是个好主意吗?

3 个答案:

答案 0 :(得分:0)

在任何OO环境中都可以使用私有方法。像protectedprivate这样的可见性修饰符用于保持代码的模块化和封装。它们防止其他代码被写入,而类外的其他代码会调用这些方法。关键在于你可以更好地控制什么调用什么,并且你更有信心在以后重构代码,而不必确定是否需要保留某种方法以便不破坏其他代码。 private方法只能在同一个类中调用,这大大减少了重写该方法时需要检查的代码量。

这与公开调用的URL有何关系是一个完全独立的问题。我认为可见性修饰符不应该是区分作为HTTP端点公开的方法和内部实现细节的主要方法。可见性修饰符用于控制代码耦合,HTTP端点应由配置单独定义。许多框架使用可见性修饰符作为隐式映射的HTTP端点的便利“安全”功能,不一定是一个好的模式。

  1. 以任何必要的方式编写好的OO代码;如果将某些代码分成不需要公开的方法是有意义的,那么请务必使用private方法。
  2. 以合理的方式配置URL如何映射到类方法。
  3. 不一定要将这两个完全不同的东西混为一谈。

答案 1 :(得分:0)

是的,只要项目需要它,这是一个好的做法

答案 2 :(得分:0)

在大多数情况下,这可能是一个不好的做法,因为控制器应该使用服务来共享逻辑,并使用依赖注入接收这些服务,这不是MVC模式固有的,但是最新的MVC框架使用它。

当你的控制器只调用服务而不是自己做很多低级逻辑时,从你的控制器上创建快捷方式私有方法到那些服务或它们的动作,真的没有什么好处。

尽管在任何地方复制所有代码似乎都是可取的,特别是如果有很多代码行。

但如果你在你的控制器中拥有那么多的逻辑,这可能表明你应该把一些东西转移到服务类。

相关问题