laravel 基础面试题偏交谈20201209主讲laravel事件观察者模式

2020-12-10 14:21 上海php自学中心


1. 什么是 Eloquent Models?

Laravel 附带的 Eloquent ORM 提供了一个漂亮、简单的 ActiveRecord 实现,用于处理数据库。每个数据库表都有一个对应的模型,用于与该表进行交互。通过模型,您可以查询表中的数据,以及将新记录插入表中。

2. 什么是 Laravel 事件?

Laravel 事件提供了一个简单的观察者模式实现,允许订阅和监听应用程序中的事件。事件是程序检测并处理的事故或事情。

以下是 Laravel 中的一些事件示例:

  • 新用户注册

  • 发布新评论

  • 用户登录 / 注销

  • 添加了新产品。

3. 观察者模式

图片

观察者模式是挺常见的一种设计模式,使用得当会给程序带来非常大的便利,使用得不当,会给后来人一种难以维护的想法。

3.1 特点

什么是观察者模式?一个对象通过提供方法允许另一个对象即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。观察者模式是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间紧密耦。看下面例子你就明白了

3.2 使用场景

用户登录,需要写日志,送积分,参与活动 等。可以结合使用消息队列,把用户和日志,积分,活动之间解耦合。

<?php  

/*
观察者接口
*/

interface InterfaceObserver
{
function onListen($sender, $args);
function getObserverName();
}

// 可被观察者接口
interface InterfaceObservable
{
function addObserver($observer);
function removeObserver($observer_name);
}

// 观察者抽象类
abstract class Observer implements InterfaceObserver
{
protected $observer_name;

function getObserverName()
{
return $this->observer_name;
}

function onListen($sender, $args)
{

}
}

// 可被观察类
abstract class Observable implements InterfaceObservable
{
protected $observers = array();

public function addObserver($observer)
{
if ($observerinstanceofInterfaceObserver)
{
$this->observers[] = $observer;
}
}

public function removeObserver($observer_name)
{
foreach ($this->observersas $index => $observer)
{
if ($observer->getObserverName() === $observer_name)
{
array_splice($this->observers, $index, 1);
return;
}
}
}
}

// 模拟一个可以被观察的类
class A extends Observable
{
public function addListener($listener)
{
foreach ($this->observersas $observer)
{
$observer->onListen($this, $listener);
}
}
}

// 模拟一个观察者类
class B extends Observer
{
protected $observer_name = 'B';

public function onListen($sender, $args)
{
var_dump($sender);
echo "<br>";
var_dump($args);
echo "<br>";
}
}

// 模拟另外一个观察者类
class C extends Observer
{
protected $observer_name = 'C';

public function onListen($sender, $args)
{
var_dump($sender);
echo "<br>";
var_dump($args);
echo "<br>";
}
}

$a = new A();
// 注入观察者
$a->addObserver(new B());
$a->addObserver(new C());

// 可以看到观察到的信息
$a->addListener('D');

// 移除观察者
$a->removeObserver('B');

// 打印的信息:
// object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } }
// string(1) "D"
// object(A)#1 (1) { ["observers":protected]=> array(2) { [0]=> object(B)#2 (1) { ["observer_name":protected]=> string(1) "B" } [1]=> object(C)#3 (1) { ["observer_name":protected]=> string(1) "C" } } }
// string(1) "D"

本题来源:www.cnblogs.com/it-abu/p/14032188....

本文章转载自公众号:pyLearnCenter

首页 - php 相关的更多文章: