Laravel技巧库

Trait与验证码生效的原理

此课程是收费课程,请先购买或加入会员后再访问。

Trait

这一集我们先学习一点小知识再来继续开发项目。知识点就是trait,我们来举例说明。

class Animal {
    function eat(){
        echo '我会吃东西';
        echo '<br>';
    }
}

这里我定义了一个动物的类,所有动物的共同点就是,他们都会吃东西。接着我们再定义三个类,分别叫做PigBirdButterfly,它要继承于Animal类。

class Pig extends Animal
{
}

class Bird extends Animal
{
}

class Butterfly extends Animal
{
}

//new一下
$pig = new Pig();
$bird = new Bird();
$butterfly = new Butterfly();

//分别调用
$pig->eat();
$bird->eat();
$butterfly->eat();

相信你学过面向对象,并且已经完全明白继承是怎么回事了。子类哪怕不定义任何内容,也是可以调用eat方法的。这里可以看到它们三个都是会吃东西的。

但是鸟和蝴蝶,有一个最重要的和猪不一样的地方,那就是他们会飞,猪是不会飞的。
所以我们可以在BirdButterfly中,添加这样的方法

class Bird extends Animal
{
    function fly()
    {
        echo '我会飞';
        echo '<br>';
    }
}

class Butterfly extends Animal
{
    function fly()
    {
        echo '我会飞';
        echo '<br>';
    }
}

$bird->fly();
$butterfly->fly();

这是当然可以使用的,但就有一点问题了,这里出现了两个完全一模一样的代码。
那这里最简单的方法就是使用trait来解决。

trait Fly
{
    function fly()
    {
        echo '我会飞';
        echo '<br>';
    }
}

class Bird extends Animal
{
    use Fly;
}

class Butterfly extends Animal
{
    use Fly;
}

定义个trait,在其他类中use一下就好,一样的访问到fly方法。需要注意的是,这里的use是在类里面,和namespaceuse是不一样的,命名空间是在类的外部use

这是一个很简单的概念,相信你听我一说就明白了。
再来修改一下Bird中的代码,里面我们也定义一个fly。再来访问看看。

class Bird extends Animal
{
    use Fly;

    function fly()
    {
        echo '我飞的很高';
        echo '<br>';
    }
}

现在Bird中显示的就会是我飞的很高了,这也就说明你可以很方便的覆盖掉trait中的方法。

验证码部分代码的原理

这个概念搞明白了之后,我们再来看看之前做的用户登录。

LoginController中,有一个

use AuthenticatesUsers;

laravel其实把登录的实际操作代码都写在这里面了。phpstorm中,mac机按住command键,win同学用ctrl键,点进去。这里就都是实际登录的一些代码了。

我们需要关注的是validateLogin这个方法,这里就是用来做登录验证的。

学了trait知识后,你应该知道了,我把这一段代码复制到LoginController中,然后自己加上验证码的验证。
那么我写的验证方法就会覆盖掉laravel默认提供的方法,这样不就实现了验证码的判断了吗?

我们接着马上要学习的用户名登录,也是要利用这种方法来实现的。