在 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 协议》,转载必须注明作者和本文链接
          
                    
                    
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: