Laravel 进阶笔记 2

防止缓存

为了在开发过程中, 避免由于浏览器缓存造成页面不刷新导致的尴尬, 本来是好事, 变成了开发者的噩梦, 将webpack.mix.js修改一下:

https://laravel-china.org/courses/laravel-intermediate-training/5.7/css-versioning/2911

这样在修改css的时候, 会自动带上版本号信息, 即改变了页面内容,

线上环境中, 使用CDN加速静态资源, 能优化加载速度.(但是CDN加速好贵啊...)CDN也会遇到类似问题, 同样这样解决.

cnpm run watch-poll 重编译一下, 会发现, js跟css的src/href变成了动态.

安装font awesome:

$ yarn add @fortawesome/fontawesome-free

用户认证

使用make创建认证相关

$ php artisan make:auth

注意不要覆盖之前的app.blade.php

本地化

生成了一些路由跟静态view, 这些view里面的内容都是英文的, 一一修改太麻烦, 直接修改翻译文件即可.

首先保证config/app.php里面设置了'local'=>'zh-CN'

然后创建resources/lang/zh-CN.json

{
    "Login": "登录",
    "Password": "密码",
    "Remember Me": "记住我"
}

刷新login页面看看, 发现有些已经是中文了, 继续一一翻译即可.

嘿嘿, 默默翻译几个之后, 发现人家早就有第三方的包把这事儿干了, si不si sa?:

$ composer require "overtrue/laravel-lang:~3.0"

啥? 对他的翻译不满意?

$ php artisan lang:publish zh-CN

在resources/lang/zh-CN文件夹中肆意修改吧.

数据库迁移

因为users的migrate文件早就生成了,所以直接运行命令迁移即可

$ php artisan migrate

刷新数据库发现了larabbs库里面有了三个表

具体表里面的内容, 跟databasemigrations两个php文件有关, 具体的语法, 跟laravel的具体模型构建方法有关, 除了这个, 还有blade都是框架带来方便的同时, 需要学习的地方.

尝试注册一个新用户吧

另外, 有挂/home的路由, 我试了一下跟root一样指向同一个controller的同一个function, 不知道有没有问题.

@guest

用@guest这个判断用户是否登陆, 登陆前, 显示注册/登陆链接, 如果已经登陆, 即不是guest了, 就显示个人资料.

问题是, 这个@guest标签是auth的一部分还是blade的一部分?或者是它们都是一伙的?

在_header.blade.php这个view里面, 加入上面说的@guest逻辑.

图形验证码:

$ composer require "mews/captcha:~2.0"

Laravel的国际化背景, 事实上是开放式的背景, 很多人会编写第三方的包, 这是thinkphp没有的优势吧, 相信.

生成配置文件(因为验证码不像翻译, 还是有些东西要配置一下的):

$ php artisan vendor:publish --provider='MewsCaptchaCaptchaServiceProvider' 

如大家所致, 验证码分为两个部分, 一部分前端请求, 一部分后端验证

首先在注册页面加入, 并保证点击时重新获取.

<img class="thumbnail captcha mt-3 mb-2" src="{{ captcha_src('flat') }}"  onclick="this.src='/captcha/flat?'+Math.random()" title="点击图片重新获取验证码">

有必要的化, 可以用css直接对img .captcha捕捉应用样式, 比如圆角border, 鼠标变手之类.

后端部分, mews/captcha已经为laravel做好了, 修改register的控制器, 加如validator即可

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:6', 'confirmed'],
            'captcha' => ['required', 'captcha'],
        ], [
            'captcha.required' => '验证码不能为空',
            'captcha.captcha' => '请输入正确的验证码',
        ]);
    }

就搞定了...

邮件验证

邮件验证功能作为注册成功时的回调, 是默认开启的.

建一个中间件, 强迫用户注册了才能打开其他页面, 否则就只能看提醒激活邮件的页面.

$ php artisan make:middleware EnsureEmailIsVerified

然后修改User实现MustVerifyEmailContract

class User extends Authenticatable implements MustVerifyEmailContract

其他都是自动配置完成的.

如果要修改点击激活按钮之后, 就要了解一点儿verify的机制, 舰艇verified监听事件

应用监听需要在AppProviderEventServiceProvider里面注册:

    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,

        ],
        IlluminateAuthEventsVerified::class => [AppListenersEmailVerified::class,
        ],
    ];

即向Verified事件, 注册多个监听器, 其中一个我们自建的这个ListnersEmailVeirfied, Java里面应该就是用实现接口方式实现吧, 然后注册一个listener.

$ php artisan event:generate

则App下面多个Listener目录, 里面有EmailVerified这个监听器了.

同样道理, 想要修改密码修改成功后得提示, 是不是也要增加listener?

不是的! 意外吧, 是重写sendResetResponse方法, 在RestPasswordController里面

    protected function sendResetResponse(Request $request, $response)
    {
        session()->flash('success', '密码更新成功,您已成功登录!');
        return redirect($this->redirectPath());
    }

起控制器的命令是:

$ php artisan make:controller UsersController

路由设置为:

Route::get('/users/{user}', 'UsersController@show')->name('users.show');
Route::get('/users/{user}/edit', 'UsersController@edit')->name('users.edit');
Route::patch('/users/{user}', 'UsersController@update')->name('users.update');

{user}的含义是传入的是User的对象, 通常是user的id或者其他索引条件.

例如, 你请求http://larabbs.test/users/1, Laravel就会自动寻找ID为1的用户并赋值到变量$user中, 如果数据库里找不到这个ID为1的用户, 就会返回一个404.

使用migration增加用于新的字段到users表的migration, 即生成一段能alter user表的sql语句:

$ php artisan make:migration add_avatar_and_introduction_to_users_table --table=users

直接修改migrations的up方法:

   public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('avatar')->nullable();
            $table->string('introduction')->nullable();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table->dropColumn('avatar');
            $table->dropColumn('introduction');
        });
    }

然后迁移

$ php artisan migrate

编辑资料的blade入口时:

{{ route('users.edit', Auth::id()) }}

表单验证方法时使用Laravel框架的FormRequest, 首先创建一个UserRequest:

$ php artisan make:request UserRequest

然后修改rules函数, 定义具体的字段的要求, 例如:

    name.required —— 验证的字段必须存在于输入数据中,而不是空。
    name.between —— 验证的字段的大小必须在给定的 min 和 max 之间。
    name.regex —— 验证的字段必须与给定的正则表达式匹配。
    name.unique —— 验证的字段在给定的数据库表中必须是唯一的。
    email.required —— 同上
    email.email —— 验证的字段必须符合 e-mail 地址格式。
    introduction.max —— 验证中的字段必须小于或等于 value。

过不了rules, 就会返回$error, 可以直接把error写到/shared/_error.blade里面, 然后在更新页面引用之, 在更新的时候, 如果不符合rules, 就会提示说出错在哪...

如果不满意自动的出错信息, 可以在UserRequest.php里面新增message()方法, 重写关于错误的中文翻译:

 public function messages()
    {
        return [
            'name.unique' => '用户名已被占用,请重新填写',
            'name.regex' => '用户名只支持英文、数字、横杠和下划线。',
            'name.between' => '用户名必须介于 3 - 25 个字符之间。',
            'name.required' => '用户名不能为空。',
        ];
    }

本质上, 更牛逼的做法时前端直接js控制对吧. 不过前后端都要控制这是对的.

然后把introduction在User类里面设置成fillable的

在users/show的view里面, 显示create_at, 并以人类语言表示

  {{ $user->created_at->diffForHumans() }}

但是要显示中文则要修改app/Providers/AppServiceProvider.php

    public function boot()
    {
        CarbonCarbon::setLocale('zh');
    }
原文地址:https://www.cnblogs.com/Montauk/p/10189716.html