0%

历时13周,终于成为了 LearnKu 社区 Laravel 分区 的正式版主。能够一路坚持下来十分不易,借此机会写一篇文章来记录我的编程之旅。

开端

在今年4月中旬的时候,读了一本书——《软技能:代码之外的生存准则》。这本书虽然属于鸡汤,但是我个人觉得还是蛮不错的。比如,程序员要学会自我营销。在程序员的世界中,除了实实在在的编程硬实力之外还有其他的技能也不容忽视。比如,写作能力,情商,沟通技巧和营销能力等等。在读完《软技能》一书之后我决定开始实施自我营销。

自我营销简单来说就是这么几点,博客,播客,视频,参加演讲或者交流会来提升自己的知名度。那么结论就很简单了,我目前能做的就只有能够写博客了。幸运的是我们已经有了LearnKu社区,如果文章质量还可以的话,那么点赞量和讨论数量就能够上去。也会让更多的人认识到我自己。

所以从这时起,我给自己定下了一个任务,每周写一篇技术文章,然后发布到社区(和自己的博客中)。当然这其中最重要的就是坚持了,早在2018年的时候我也想要开始坚持写博客,但是坚持了半个月之后无疾而终。庆幸的是这次坚持到了现在。

实习版主之旅

在五六月的时候,站长 Summer 推出了版主计划。于是进行申请加入了见习版主,并为了成为正式版主而努力。在这期间,我做的事情包括,翻译社区文章,回答别人提出的问题,继续写自己的文章,以及撰写Wiki等内容。在这13周中,有些周达成目标比较简单,有些周就完成的很艰难了。不过,最终还是终于达成了目标,成为了版主。

在撰写自己的文章回答别人的问题的时候,经常需要查看 Laravel 的源码。因此,在这期间我也对Laravel有了更深的认识。

自我成长

其实成为版主仅仅是个开始,我还需要更加扩大自己的影响力。除此之外,还需要提升自己的写作和表达能力,技术实力等内容。

技术方面

  • PHP 继续提升PHP的能力,毕竟是我目前的主力语言,还是需要去多多深入了解的。当然源码应该是不会去看了😂
  • Laravel 继续阅读Laravel的源码,深入理解Laravel的原理
  • Redis 更多了解Redis的使用
  • Linux 服务器的相关内容也是不可缺少的。

其实,最近由于沉迷于Rails作者DHH的相关理念,沉迷于 Ruby 和 Rails 中无法自拔😂,于是开始学习这个了。😂

其他方面

  • UI设计 虽然写代码还行,但是如果是自己写页面,没有设计弄出来的看着就是很丑啊😂。所以后续打算对UI设计进行一些了解
  • 表达能力 不管是通过说话还是文字,表达能力一定是非常重要的。比如这篇文章,我写出来的和我想表达的完全是两个方向。。。

总结

学习如逆水行舟,不进则退。作为程序员我们应当不断的学习,否则终有一天我们会被淘汰的。

PS:有没有什么入门的UI指南可以推荐给我啊😂

在这篇文章中,我们分析一下 Laravel 中的“记住我” 功能是怎样实现的。

在 Laravel 为我们提供的默认登录中,为我们提供了“记住我”的选项,那么这一逻辑是怎样实现的呢?

阅读全文 »

本文翻译自 4 Ways The Laravel Service Container Helps Us Managing Our Dependencies

在Laravel的世界里,服务容器(Service Container)是一个很复杂的话题,我看到有许多人在尝试搞清楚它到底是怎样的一个原理,但是我们仍然不太懂。对我来说也一样,这是因为很多的文章在解释怎样去“使用”服务容器。在这篇文章中,我将给大家解释“什么”是服务容器以及“何时”服务容器能帮助我们处理我们的依赖。

阅读全文 »

在我们日常开发的过程中,一定会碰上和货币打交道的代码。那么这时候就会有一个问题?我们怎样在数据库中存储货币单位呢?

阅读全文 »

本文翻译自 Dynamic relationships in Laravel using subqueries

当我在使用 Laravel 写程序的时候,我脑海中一直有两个目标:

  1. 尽可能少的使用数据库查询
  2. 尽可能少的使用内存

我们可能很容易的解决第一个问题。比如我们熟知的 N+1 问题可以通过懒加载进行解决。但是,我们对第二个问题却不太注意,有时候我们可能会做的更糟糕。

阅读全文 »

本文翻译自 APP_KEY And You

可能每个 Laravel 开发者新建或者克隆一个 Laravel 程序的时候,composer install之后最可能以及最重要的的第一步操作就是生成 APP_KEY

在这篇文章中我们会讨论APP_KEY能做的和不能做的,有些人会把用户密码的哈希处理与APP_KEY相关联(实际上它们毫无关联)。

什么是 APP_KEY

每一个 Laravel 程序都会生成一个随机的32位长度的字符串存储在.env文件中的APP_KEY键值中,当我们新建 Laravel 项目的时候会自动为你创建一个,只有在克隆的时候你才有可能发现它没有被设定。

你可能看到过下面的错误,说明APP_KEY没有设定

app_key error

你可以自己手动生成或者使用 php artisan key:generate 来进行创建 APP_KEY

当你的应用程序执行的时候,只有一个地方会用到APP_KEYcookies。Laravel 使用它来加密所有的cookies,在将cookie返回给用户之前 Laravel 会对 cookie进行加密,然后再返回给用户,这样客户端就无法自己修改cookie来伪装成管理员或者其他用户了。

所以的加密和解密都在 [Encrypter](https://laravel.com/docs/master/encryption#using-the-encrypter)中进行处理,其中主要使用了 [openssl_encrypt](https://secure.php.net/manual/en/function.openssl-encrypt.php) 进行加密。

有很多用户都会有一个误解,那就是APP_KEY是用来处理用户哈希密码的。事实上不是这样的。Laravel的密码使用了 Hash::make() 或者 bcrypt() 来进行哈希处理,其中并没有用到APP_KEY

加密 VS 哈希

在 Laravel 中有两个主要的加密 Facade,分别是 Crypt(对称加密) 和 Hash(单向加密哈希)。密码是哈希,而cookie则是对称加密

对称加密

假设我想发送一条加密的信息给我的好友A。我们商议好了一个用于加密和解密的key:

1
$key = "dont-panic";

当我想要发送一条只有上面的key能解锁的信息时,我们可以使用openssl_encrypt()(Laravel 的 Crypt 也是使用的这个方法),具体如下:

1
2
3
4
5
6
$message = "So long and thanks for all the fish";
$key = "dont-panic";
$cipher = "AES-256-CBC";
echo openssl_encrypt($message, $cipher, $key);

// JJEK8L4G3BCfY0evXDRxUke2zqAzq6i7wL/Px4SjaEHXqt3x7hsj4+PhVQaH4ujX

此时,你就可以把这段加密的代码发送给A,然后他可以进行解密了。

1
2
3
4
5
6
$secret = "JJEK8L4G3BCfY0evXDRxUke2zqAzq6i7wL/Px4SjaEHXqt3x7hsj4+PhVQaH4ujX";
$key = "dont-panic";
$cipher = "AES-256-CBC";
echo openssl_decrypt($secret, $cipher, $key);

// So long and thanks for all the fish

Laravel的cookie加密解密也是同理,只不过key使用的是APP_KEY

单向哈希

当我们使用密码的时候,我们应当从不使用对称加密的方法,来避免用户可能解密密码。这表示Crypt无法胜任,因此我们需要使用哈希方法,具有如下的特点:

  1. 快速:计算机能够快速的生成哈希值
  2. 确定性:针对同样的输入,输出是固定的
  3. 随机性:即使只更改一位字符串,哈希之后的输出应该十分不同
  4. 唯一性:碰撞概率应该非常非常的小
  5. 难于被暴力破解: 哈希之后的值应当难以被暴力破解

你应当听说过许多的单向哈希算法,例如md5SHA-1。在Laravel中使用了PHP的原生方法password_hash(),它使用的哈希算法叫bcrypt

1
2
3
4
5
6
use Illuminate\Support\Facades\Hash;

$password = "dont-panic";
echo Hash::make($password);

// $2y$10$hEEF0lv4spxnvw5O4XyLZ.QjCE1tCu8HjMpWhmCS89J0EcSW0XELu

如果你曾经查看过users数据表,那么上面的输出你可能会似曾相识。下面解释一下其中的含义:

  1. $2y$表示我们使用了blowfish算法(bcrypt)
  2. 10$表示算法使用的 cost(值越高表示生成哈希的时间越长)
  3. hEEF0lv4spxnvw5O4XyLZ.表示一个22位的随机“盐”
  4. QjCE1tCu8HjMpWhmCS89J0EcSW0XELu 哈希结果

由于这是一个单向哈希,因此我们无法进行解密,我们能做的只是去验证其是否匹配。

1
2
3
4
5
6
7
use Illuminate\Support\Facades\Hash;

$input = request()->get('password'); // "dont-panic"
$hash = '$2y$10$hEEF0lv4spxnvw5O4XyLZ.QjCE1tCu8HjMpWhmCS89J0EcSW0XELu';
return Hash::check($input, $hash);

// true

因此我们可以看到,在对称加密中我们使用到了APP_KEY,而在密码哈希的时候我们是不需要使用它的。

总结

  • 更改 APP_KEY 不会使用户的密码失效
  • 更改 APP_KEY 会使session 和 cookie 失效,导致当前已登录用户退出登录
  • 不要害怕你的 APP_KEY
  • 如果你在其他地方使用了Laravel的加密方法,那么你需要制定一个计划来应对APP_KEY的更改

我们都知道,在 Laravel5.5 版本以后加入了一项新功能——自动发现扩展包。简单来说就是之前我们在引入第三方扩展的时候需要在config/app.php中将对应的 Provider 和 Facade 进行注册,而在5.5之后我们就无需进行这样的操作了。下面我们分析一下它的实现原理。

阅读全文 »

Laravel Prequel是由Quinten Justus开发的一款在网页端进行数据库管理的扩展包。

使用方法

1
2
3
$ $ composer require protoqol/prequel
$ php artisan vendor:publish --tag=config
$ php artisan vendor:publish --tag=public

之后访问你的Laravel地址/prequel即可查看。目前此软件包处于beta版本,仅支持mysql。有需要的可以在开发的时候进行体验。

参考

Laravel Prequel is a Web-Based Database Management GUI