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');
        }
  • 相关阅读:
    分类模型之支持向量机
    数据预处理
    数据挖掘基本流程
    【项目】项目95
    【项目】项目94
    【项目】项目93
    【项目】项目92
    【项目】项目91
    【项目】项目90
    【项目】项目89
  • 原文地址:https://www.cnblogs.com/Montauk/p/10189716.html
Copyright © 2011-2022 走看看