zoukankan      html  css  js  c++  java
  • 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');
        }
  • 相关阅读:
    钱多多软件制作04
    团队项目01应用场景
    HDU 4411 arrest
    HDU 4406 GPA
    HDU 3315 My Brute
    HDU 3667 Transportation
    HDU 2676 Matrix
    欧拉回路三水题 POJ 1041 POJ 2230 POJ 1386
    SPOJ 371 BOXES
    POJ 3422 Kaka's Matrix Travels
  • 原文地址:https://www.cnblogs.com/Montauk/p/10189716.html
Copyright © 2011-2022 走看看