在 Laravel Sail 环境下完成 L01 教程第 5 遍的感想(已部署阿里云,欢迎来体验)

4 月初购买了《L01 Laravel 教程 - Web 开发实战入门》(下文简称:L01),到今天为止,断断续续,做了 5 遍。
一开始练习时,搭建环境就花了 3 天,才成功让 Laravel 在电脑上跑起来。
详情可以参考:《历时 3 天,成功搭建 Laravel Sail 环境》
到现在,可以说对 Laravel 开发有一个基本的了解,但是距离课程提到过的挑战: 尝试使用文字将项目的功能写个列表,然后在不看教程的情况下实现整个项目的功能 ,还有一段比较比较远的距离。
所以,第 5 遍并不是终点,还要继续做,继续往下走,直到对每个功能的实现逻辑都心中有数。
然后,再来分享一下,我对这 L01 项目的魔改部分:关于头像。
L01 项目是用 Gravatar 头像作为解决方案的,但是这个网站在国外,被墙挡住了,导致在练习的时候,头像一直无法显示,有些同学还以为自己哪里做错了,其实,你并没有做错什么,只是 Gravatar 读取不到而已。
不过, http://cn.gravatar.org/avatar 这个链接是可以用,也能读取到头像的,可惜, 我不喜欢这个头像
所以,这都第五次练习了,我对这个项目,也算有一定了解了,不如来魔改一下吧。
一开始,我用随机产生的数字来代表指定对应头像,结果发现一个弊端:
每次刷新网页,头像都会变化,甚至同一个用户 id 也会产生不同的头像。
这多不好。
那不如,把指定头像的数据,存到数据库里面吧?
思路瞬间开阔起来,以下是我的实现步骤:
准备工作:

在 weibo\public 目录下,建立 gravatar 文件夹

搜集一些你喜欢的头像,放到 gravatar 文件夹,头像以数字命名,如下所示:

接下来,生成一个 迁移文件 ,为用户表新增 gravatar_id 字段。

这是在 Laravel Sail 环境下的操作,Sail 命令已经经过简单配置,关于配置部分请看文末参考资料。

sail artisan make:migration add_gravatar_id_to_users_table --table=users

最终,我编写迁移文件如下:
文件位置:

database/migrations/[timestamp]_add_gravatar_id_to_users_table.php

文件代码:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddGravatarIdToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('gravatar_id')->default('1');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('gravatar_id');
        });
    }
}

编写完成之后,进行数据库迁移,运行迁移文件:

sail artisan migrate

运行结果如下所示:

接着,更改用户工厂文件,从指定数组里面随机获取元素,作为 gravatar_id :
文件位置:

database/factorise/UserFactory.php

文件代码:

<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
    protected $model = User::class;
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'activated' => true,
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
            'gravatar_id'    => $this->faker->randomElement(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']),
        ];
    }
}

其实,我只是添加了这一行:

'gravatar_id'    => $this->faker->randomElement(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']),

这个数组的写法非常不优雅,我知道,请大家不要骂得太厉害

然后,对数据库进行重置,填充:

sail artisan migrate:refresh --seed

随后,再到用户模型里,修改头像方法的逻辑:
文件位置:

app/Models/User.php

修改 L01项目 生成头像的方法:

<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
  .
  .
  .
class User extends Authenticatable
{
    .
    .
    .
    public function gravatar($size = 140)
    {
        $gravatar = $this->attributes['gravatar_id'];
        return "/gravatar/$gravatar.jpg";
    }
    .
    .
    .
}

至此,那我们生成的用户就都可以随机到头像了。
效果如下:

那么,新注册的用户怎么办呢 ?虽然 gravatar_id 字段的默认值被设定为 1 ,但是新注册的用户,不能随机到其他的头像的话,上面这个半天搞出来的功能岂不是很鸡肋?
在我一番百度+查找社区内的 Laravel 中文文档之后,想到了一个办法,利用辅助函数 Arr::random 从数据中随即返回一个值。
以下是具体实现代码,我选择在用户激活的同时,为他随机一个头像:

<?php
namespace App\Http\Controllers;
use App\Models\User;
.
.
.
use Illuminate\Support\Arr; // 注意引入 Arr
class UsersController extends Controller
{
    .
    .
    .
    public function confirmEmail($token)
    {
        $user = User::where('activation_token', $token)->firstOrFail();
        $user->activated = true;
        $user->activation_token = null;
        $array = range(1, 10);
        $user->gravatar_id = Arr::random($array);
        $user->save();
        Auth::login($user);
        session()->flash('success', '恭喜你,激活成功 2021年5月20日 14:33:07');
        return redirect()->route('users.show', [$user]);
    }
    .
    .
    .
}

至此,我设想的功能已经完成。
以下是新注册用户的效果:

不行,我在最后一定要放一张随机到结衣头像的用户:

以上,就是做完 5 次项目的感想,这个项目还没摸透,还需要继续练习。
如果社区的大家们有更好的方法,也可以提醒我,另外,很想问一下,学到什么样的程度能达到找工作的要求呢
这是我目前最想弄清楚的问题。
参考资料:
关于使用 Laravel Sail 命令

2021年5月23日更新

折腾了一个早上,总算是把 L01 项目部署到阿里云上了,算是交一次作业吧,因为没有开启 QQ 邮箱的功能,激活邮件发送暂时无法实现,在这里给大家提供一个体验账号(随机到了美女头像哦):

体验网址:hongliblog.cn/
体验账号
邮箱:Blcohol@example.com
密码:Blcohol@example.com
大家可以发条留言,证明来过,但是不要改密码,,也不要干坏事哦
预计 7 天后(也就是2021年5月30日)关停服务器~

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

能按Summer要求做5遍,太强了:

2年前 评论
Alcohol (楼主) 2年前

新垣结衣好评。demo 随机头像还行啦,工作上还是要用户自己选择或者后续选择头像。

工作上,问题种类满目琳琅,需要很好的问题搜索,debug 能力,这些都是建立在以往的知识和实践经历上。

2年前 评论

部署过程能来一篇么?

2年前 评论
Alcohol (楼主) 2年前
peryiqiao 2年前
joffy (作者) 2年前
no_pain 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!