框架
<h2><strong>运行流程</strong></h2>
<ul>
<li>用户访问到 <code>/public/admin</code> 下的静态文件, 前端程序会自动请求框架信息, 比如 路由, 配置, 用户信息等</li>
<li>前端程序会根据路由配置, 访问到对应的页面 (默认的页面都是 <code>Amis</code>)</li>
<li>在 <code>Amis</code> 页面中, 会根据路由的路径, 请求对应的 <code>api</code> 从而获取到 <code>amis</code> 的页面结构</li>
<li><code>amis</code> 会根据页面结构, 渲染出页面</li>
</ul>
<p>> 访问前端 → 获取路由 → 获取页面结构 → 渲染页面</p>
<p><br></p>
<h2><strong>Renderer 类的工作原理</strong></h2>
<p>所有的 <code>Renderer</code> 都继承了 <code>BaseRenderer</code></p>
<pre><code class="language-php">&lt;?php
namespace Slowlyo\OwlAdmin\Renderers;
// BaseRenderer 实现了 JsonSerializable 接口
// JsonSerializable 接口的作用是, 当 Renderer 类 被序列化成 JSON, 会自动调用 jsonSerialize() 方法
// 文档: https://www.php.net/manual/zh/class.jsonserializable.php
class BaseRenderer implements \JsonSerializable
{
public string $type;
// 这个属性用于存储页面结构
public array $amisSchema = [];
// make() 方法是一个静态方法, 用于创建一个新的 Renderer 实例
// 作用: 为了方便使用, 你可以直接使用 Renderer::make() 来创建一个新的 Renderer 实例, 而不需要使用 new Renderer()
public static function make(): static
{
return new static();
}
// 通过魔术方法, 实现对 '不存在的方法' 的调用
public function __call($name, $arguments)
{
return $this-&gt;set($name, array_shift($arguments));
}
// 将属性存储到 $amisSchema 中, 并返回当前实例, 以便于链式调用
public function set($name, $value)
{
$this-&gt;amisSchema[$name] = $value;
return $this;
}
// 当你在控制器中, 使用 $this-&gt;response()-&gt;success($schema);
// 将结构返回给前端时, 会自动调用这个方法~
public function jsonSerialize()
{
return $this-&gt;filteredResults(); // 返回过滤后的页面结构
}
// 返回 json 格式的页面结构
public function toJson(): bool|string
{
return json_encode($this-&gt;amisSchema);
}
// 返回数组格式的页面结构
public function toArray(): array
{
return $this-&gt;amisSchema;
}
// 因为所有的 Renderer 都继承了 BaseRenderer, 所以这个方法会被所有的 Renderer 继承
// 等同于给所有的 Renderer 添加了一个 permission() 方法
// 或者说, 给所有的 amis 组件都添加了一个 permission 属性
public function permission($permission)
{
$this-&gt;amisSchema['owl_permission'] = $permission;
return $this;
}
// 过滤掉没有权限的页面结构
public function filteredResults()
{
$permissionKey = 'owl_permission';
if (key_exists($permissionKey, $this-&gt;amisSchema)) {
if (!admin_user()-&gt;can($this-&gt;amisSchema[$permissionKey])) {
return null;
}
}
return $this-&gt;amisSchema;
}
}</code></pre>
<p>这个类其实就是整个 <code>owl</code> 的精华所在</p>
<p>在了解了 <code>Renderer</code> 的原理之后, 只需要把 <code>amis</code> 的 100 多个组件稍微封装一下, 就可以实现 <code>amis</code> 的所有功能了</p>
<p>也就是 <code>vendor/slowlyo/owl-admin/src/Renderers</code> 目录下的那 200 多个文件</p>
<p>是不是很简单呢? 😏</p>