热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Laravel框架开发是什么样的体验

在程序界的远古时期,大神们手持键盘敲着机器语言跟庞大的机器打着交道,那时候机器语言还没有语义和语法,更没有封装的概念。后来进化到汇编语言,C语言时期,基础的功能特性就已经能满足当时

《使用 Laravel 框架开发是什么样的体验》

在程序界的远古时期,大神们手持键盘敲着机器语言跟庞大的机器打着交道,那时候机器语言还没有语义和语法,更没有封装的概念。后来进化到汇编语言,C语言时期,基础的功能特性就已经能满足当时的需求了,比如函数封装使其得于复用,但随着计算机的普及,操作系统的到来,面向过程语言已无法继续满足复杂的需求。

历史的变迁促使了高级语言的诞生,到了我们这个阶段,已经是高级语言百花齐放的时代,Java、Python、Ruby、PHP、Javascript、Objective-C、Android 等等都在各自领域中发挥着重要的作用。而各大语言的框架更是集自身语言和其他优秀语言特性之大成者,以PHP来说,Laravel、Symfony、CodeIgniter、ThinkPHP 等都是其优秀的思想结晶之一,其中的 Laravel 就是其创始人 Taylor Otwell 结合了 Ruby on Rails 的思想开发出来的,并且以强大的框架生态和组件化思想成为全世界最热门的PHP框架没有之一。

随着近两年中文文档的完善,Laravel 渐渐被国内的开发者所使用,去年我们开始采用「组件化」思路来建设整个服务,业务重构选择了 Laravel 来作为后端的业务框架,到现在已经一年时间,我对 Laravel 框架也有了一些了解,从路由到单元测试,Laravel 几乎无所不能,它不局限于“神圣”的MVC模式,让开发者发挥自己的想象力去搭建自己想要的业务架构,不用再想着什么类要放在Model文件夹,而是怎么划分层次,每个层次需要干什么,就像是乐高积木,你可以根据图纸或者自己想象出的变形金刚的样子一层层的搭建出最后的模型。

在 Laravel 中,高级积木(组件)可以用 Composer 管理工具来引入,Composer 作为PHP中最好用的依赖管理工具之一(或许没有之一)已经被很多框架使用,就不详述它的故事了。绝大多数的 Laravel 组件都能在 Github 上找到,如果找不到肯定是你的搜索方式有问题,换了搜索方式还找不到,那就自己写一个。Composer 有这么一些常用指令:

  • composer install – 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖; composer update – 从 composer.json 安装最新扩展包和依赖;

  • composer update vendor/package – 从 composer.json 或者对应包的配置,并更新到最新;

  • composer require new/package – 添加安装 new/package, 可以指定版本,如: composer require new/package ~2.5.

我在引入和更新组件时都是使用 composer require ,这样子做的原因是因为在生产环境中使用其他两种方法来引入的话,会把其他组件也给更新了,导致不兼容的情况发生,具体看这篇文章:「正确的 Composer 扩展包安装方法」。

如果是 Composer 的「组件化」让我采用了这个框架来重构,那你就大错特错了,真正让我着迷的是 Laravel 的核心「Ioc容器」,它有效解决了对象依赖的问题,举个栗子:

要实例化一个孩子对象出来,必须要实例化出爸爸对象和妈妈对象,用原本的对象依赖调用方式就是这样的:

$father = new Father();
$mother = new Mother();
$child = new Child($father, $mother);

从编程角度来说,依赖关系越复杂,可变性就会越低,而且这么写等于暴露了三个对象给用户,是不可取的。

从现实角度来看,我只想知道你叫什么名字,你连你爸妈的信息都告诉我了,这……不合适吧。

上面的代码用 Laravel 来写会是这样:

$child = app()->make(‘Child’);

接着 Ioc 就会帮你调用依赖于 Child 的所有类,并且赋予 Child 对象,整个过程只需要一句代码,甚至能更简洁:

$child = app(‘Child’);

Ioc 的好用之处还有很多,基本上 Laravel 的基础服务都是围绕着 Ioc 来搭建的,Router、Middleware、Eloquent ORM等等等等,如果你想感受下 Ioc 的魔力,看源码吧。

在 Ioc 的基础上,各个子系统也有着自己的闪光点,Router 的 RESTful 定义,Eloquent ORM 的预加载查询优化等等让整个框架生态变得多样化和易用。但也因为应有尽有使得框架的性能比其他高性能框架低了些,Laravel 为此给了几个解决方案:

  • 路由缓存;经有关部门研究,路由缓存可有效加快访问速度500ms以上。

  • 源码缓存;把源码集合在一个类中,减少资源调用耗费的时间。

  • 数据查询优化;就是上面提到的 Eloquent ORM 的预加载查询优化。

这些都做了的话,性能不会差到哪里去,我认为中小体量的网站的瓶颈是在数据IO,PHP性能还不用太纠结,如果真达不到你的性能要求,请转用 Lumen 或者其他框架。

有朋友说 PHP 框架最重要的东西是路由,我倒认为最重要的是框架中异于其他框架且能解决痛点的东西,如 Laravel 的 Ioc。让我们改变编程思维是很少框架能做到的,Laravel 能做到这点,正所谓框架常有,好框架难求,如果你问我 Laravel 好不好,是不是最好,我只能用邓小平爷爷的名言告诉你:

不管黑猫白猫,捉到老鼠就是好猫。

点此查看我的更多文章。


推荐阅读
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • Python Selenium WebDriver 浏览器驱动详解与实践
    本文详细介绍了如何使用Python结合Selenium和unittest构建自动化测试框架,重点解析了WebDriver浏览器驱动的配置与使用方法,涵盖Chrome、Firefox、IE/Edge等主流浏览器。 ... [详细]
  • 本文档涵盖了多个 Python 编程练习题,包括使用 while 和 for 循环处理数字序列、字符串操作以及简单的算法实现等。每道题目都提供了详细的代码示例,旨在帮助初学者加深对 Python 基础知识的理解。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 本文探讨了在 Python 2.7 环境下,如何有效地对大量数据(如几百 KB 的字符串)进行加密和压缩,并确保能够准确无误地解密回原始数据。 ... [详细]
  • Python环境下OpenCV的安装与验证方法
    本文介绍了如何在Python环境中安装OpenCV库及其额外模块,并提供了验证安装是否成功的具体步骤和代码示例。 ... [详细]
  • Java中提取字符串的最后一部分
    本文介绍了如何使用Java中的substring()和split()方法来提取字符串的最后一部分,特别是在处理包含特殊字符的路径时的方法与技巧。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
author-avatar
民海育来仁湖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有