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/
体验账号
大家可以发条留言,证明来过,但是不要改密码,,也不要干坏事哦
预计 7 天后(也就是2021年5月30日)关停服务器~