实战进阶,第一遍初步完成打卡

这篇文章有些本末倒置,因为它写于本书学习之初,目的是:

  1. 学习过程中记录疑惑
    • 可能与本人性格比较有关,碰到问题喜欢自己先钻研、查阅资料、瞎搞一番,实在解决不了再请教老师,
    • 也可能是所在公司于我的成长已经寥寥无几,所以最近有些想再找找机会,有些急于想把所有书先看完,之后再来慢慢研究学习过程中的疑惑,
    • 但也并非是不喜欢被人帮助,还是真心希望有缘看到此篇文章并且对本文中的某个(些)疑惑有一些自己看法的老师不吝赐教 ~ 『不要移开那座大山,请给我力量爬过他』,
    • 所以本书之中的疑惑之处就不记录在每节课下方了,统一汇总也方便学完之后的温习」。
  2. 初步完成后分享作品,
  3. 学完之后的项目完善与部署相关

学习过程中的疑惑:

  1. 邮箱认证 ,本篇文章中:
    L01 Laravel 教程 - Web 开发实战入门 ( Laravel 5.8 ) ,第一遍

  2. SEO 友好的 URL 一文中: app/Models/Topic.phplink 方法的参数 $params 的应用场景在何处?

    <?php
    
    namespace App\Models;
    
    class Topic extends Model
    {
        public function link($params = [])
        {
            return route('topics.show', array_merge([$this->id, $this->slug], $params));
        }
    }
    • 应用场景在此resources/views/users/_replies.blade.php

      <a href="{{ $reply->topic->link(['#reply' . $reply->id]) }}">
          {{ $reply->topic->title }}
      </a>
    • 又引出了一个新问题,link() 方法的定义

      public function link($params = [])
      {
          return route('topics.show', array_merge([$this->id, $this->slug], $params));
      }
    • 查看 Laravel 5.8 的手册中辅助函数 route 的解释,可知,第三个参数为绝对 URL 与相对 URL 的区分标示,既然如此,为什么上文提到的应用场景中 link() 方法所生成的链接会是:http://larabbs.test/topics/982?#reply408 这种结构呢?

  3. 后台访问权限 一文中:

        <?php
        .
        .
        .
        class PagesController extends Controller
        {
            .
            .
            .
    
            public function permissionDenied()
            {
                // 如果当前用户有权限访问后台,直接跳转访问
                if (config('administrator.permission')()) {
                    return redirect(url(config('administrator.uri')), 302);
                }
                // 否则使用视图
                return view('pages.permission_denied');
            }
        }
    • 上方代码片段中:if (config('administrator.permission')()) 这步判断是否多此一举?
    • 根据 问答回复 文中所说的:

      如果不加这个的话 用户登陆后就会留在这个无权限页面 体验很差

    • 经过测试,并不会出现上方场景。
  4. 学习至此:用户最后登录时间

    • 任务调度已经定义了两个定时任务,且每天凌晨 00:00 时分,两个任务会同时进行;
    • 如果后续定时任务达到了一定的量之后,不可避免的多个定时任务会操作同一个表;
    • 这时,凌晨 00:00 时分大多数定时任务都会执行,会出现相互锁死的情况吗?或者是其他的影响呢?

自省方案

  1. 通过申请成为助教,力所能及的解答一些问题来加深自己的印象;

完善目标:

  1. 该作品需支持 Markdown 语法,排版与 UI 参考 LearnKu 社区;
  2. 用户关注功能;
  3. 参照 PHPHub 5 源码,实现 @某个人 功能;
  4. 将项目部署在 Heroku 上;
  5. 将项目部署在阿里云服务器上;
  6. 涉及到的第三方服务尽可能迁移到阿里云上;
  7. 活跃用户和资源推荐的缓存判断有问题,vendor\laravel\framework\src\Illuminate\Cache\Repository.php中:

    public function remember($key, $ttl, Closure $callback)
    {
        $value = $this->get($key);
        if (! is_null($value)) {
            return $value;
        }
        $this->put($key, $value = $callback(), $ttl);
    
        return $value;
    }
    • is_null 判断 collect 是有些问题,需要优化。
刻意练习,日益精进。
翟宇鑫
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

按照文档中的说法是只要加上 implements MustVerifyEmail 就可以了

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // ...
}

可以看下 Illuminate\Contracts\Auth\MustVerifyEmail 文件

<?php

namespace Illuminate\Contracts\Auth;

interface MustVerifyEmail
{
    /**
     * Determine if the user has verified their email address.
     *
     * @return bool
     */
    public function hasVerifiedEmail();

    /**
     * Mark the given user's email as verified.
     *
     * @return bool
     */
    public function markEmailAsVerified();

    /**
     * Send the email verification notification.
     *
     * @return void
     */
    public function sendEmailVerificationNotification();
}

接口 MustVerifyEmail 定义了三个方法,意味着引用这个接口的类要实现这三个方法.而我们在 User 这个类里没有看到这三个方法,而 User 继承自 Authenticatable ,去Illuminate\Foundation\Auth\User 中查看可以看到

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}

在这里加载使用了 MustVerifyEmail 这个trait,在这个 trait 中实现了这三个方法。
到这里还有一个问题,就是既然 User 已经实现了这三个方法,为什么还要去 implements MustVerifyEmailContract ?不加这个程序也是可以用的,继续看文档可以看到:
Contracts《Laravel 5.5 中文文档》

简单性
当所有 Laravel 的服务都使用简洁的接口定义,就很容易判断给定服务提供的功能。 可以将契约视为说明框架功能的简洁文档。
除此之外,当依赖的接口足够简洁时,代码的可读性和可维护性会大大提高。比起搜索一个大型复杂的类中有哪些可用的方法,不如检索一个简单、 干净的接口来参考更妥当。

这可能就是传说中的 OOP 编程原则了吧。(拙见)

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!