加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

大型项目该如何分层架构,该和MVC说再见了

发布时间:2019-10-15 15:12:42 所属栏目:优化 来源:Limancheng123
导读:副标题#e# 最近用laravel做自己的个人博客,过程中也思考了一些问题,如何把自己的代码写的更优雅呢,为什么laravel没有models目录呢,逻辑代码,数据库查询代码要怎样放置呢? 我们一直以来都被灌输的设计思想,即M-V-C,模型(Model)、视图(view)、控制器(C

举个例子,与其在业务逻辑类里面直接获取 Web 请求,不如把 Web 请求通过控制器传递给业务逻辑类。这个简单的改动会将你的业务逻辑类和「Web」层解耦,并且不必担心怎么去模拟 Web 请求,就可以轻松测试业务逻辑类:

  1. class BillingController extends BaseController 
  2.   
  3.  public function __construct(BillerInterface $biller) 
  4.  { 
  5.  $this->biller = $biller; 
  6.  } 
  7.   
  8.  public function postCharge(Request $request) 
  9.  { 
  10.  $this->biller->chargeAccount(Auth::user(), $request->input('amount')); 
  11.  return view('charge.success'); 
  12.  } 
  13.   

现在 chargeAccount 方法更容易测试了,由于我们不再需要在 BillerInterface 实现类中使用 User 和 Request 类,只需将用户和金额传递到该方法即可。

编写可维护性应用程序的关键之一,就是职责分离。要时常检查一个类是否管得太宽,知道一些它不该知道的。你要常常问自己「这个类是否需要关心X?」如果答案是否定的,那么就要把这块逻辑提取出来放到另一个类里面,然后用依赖注入的方式将其注入进来。

如何判断一个类是否管得太宽?一个有用的方法就是检查你为什么要改这块代码。举个例子,当我们想调整通知逻辑的时候,是否需要修改 Biller 的实现代码?当然不需要,Biller 实现只关注支付,它与通知逻辑应当仅通过契约来进行交互。在处理代码时使用这种思路,可以帮助你快速找出应用中需要改进的地方。

东西都放哪儿?

当通过 Laravel 开发应用时,你可能会困惑于应该把各种「东西」放在哪里。例如,辅助函数要放在哪里?事件监听器要放在哪里?视图组件要放在哪里?答案可能出乎你的意料 —— 「随便,放哪儿都行!」Laravel 并没有很多关于这方面的文件系统上的约定。不过,这个答案的确不能让人满意,所以下面我们就这个问题展开讨论,一起探讨这些「东西」究竟可以放在哪里。

辅助函数

我们可以在 app 目录下创建一个 helpers.php 文件,然后将自定义的辅助函数都放到这个文件中。当然,由于这个文件里面包含的不是类,不适合通过命名空间引用其中的函数,需要在 composer.json 中全局注册它:

  1. "autoload": { 
  2.  ... 
  3.  "files": [ 
  4.  "app/helpers.php" 
  5.  ] 
  6. }, 

然后运行 composer dump-auto 重新注册自动加载映射关系。然后就可以在应用中使用 app/helpers.php 中定义的辅助函数了。

事件监听器

事件监听器当然不该放到 routes.php 文件里面,所以我们要找另外的地方来存放。事实上,在 Laravel 5.* 中,当我们通过 php artisan make:listener 命令创建时间监听器时,系统会自动在 app 目录下创建 Listeners 子目录,并将生成的监听器类放到该目录下。所以我们对于自定义的事件监听器类,放到该目录下即可。

错误处理器

在 Laravel 5.* 版本中,默认情况下所有的异常都是通过 AppExceptionsHandler 来处理的,你也可以通过自定义的异常类来处理,自定义异常类可以放到 app/Exceptions 目录下。

其他

通常,只要遵循 PSR-4 规范就可以在应用目录结构中保持类的整齐。结合你目前为止学习到的知识,对于什么代码要放在什么地方这个问题,应当可以给出一个有理有据的答案了。但永远不要拒绝试验。Laravel 的美妙之处就是你可以做出最适合你自己应用的约定。去探索和发现最适合你自己应用的结构吧,别忘了和他人分享你的见解!

例如,你可能受到我们之前例子的启发,在 QuickBill 中创建一个 Providers 目录来存放所有你自定义的服务提供者,目录结构类似这样:

  1. // app 
  2.  // QuickBill 
  3.  // Billing 
  4.  // Extensions 
  5.  //Pagination 
  6.  -> Environment.php 
  7.  // Providers 
  8.  -> EventPusherServiceProvider.php 
  9.  // Repositories 
  10.  User.php 
  11.  Payment.php 

注意上面的例子,我们有 Providers 和 Extensions 两个命名空间。所有你自定义的服务提供者都可以放到 Providers 命名空间下,而 Extensions 命名空间可以用来存放你对框架核心进行扩展的类。

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!