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

Laravel框架
500
0
0
2022-04-17
标签   Laravel环境

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日)关停服务器~