更新文档
This commit is contained in:
parent
3e58d936ad
commit
4ff833f76a
@ -1,7 +1,7 @@
|
||||
var record = '/record/'
|
||||
export default [
|
||||
// 首页
|
||||
{ text: 'Home', link: '/' },
|
||||
{ text: '首页', link: '/' },
|
||||
// hyperf
|
||||
{
|
||||
text: 'Hyperf',link: '/hyperf'
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2024-02-05 16:56
|
||||
categories: [Laravel]
|
||||
title: Eloquent构造器_1
|
||||
---
|
||||
|
||||
{%quot el:h2 数据库 %}
|
||||
## 数据库
|
||||
`Laravel`的`ORM`是`Eloquent`,`Eloquent`是基于`DB`的查询构建器。
|
||||
> `DB`, `DB`是与PHP底层的`PDO`直接进行交互的,通过查询构建器提供了一个方便的接口来创建及运行数据库查询语句。
|
||||
> `Eloquent Model`, `Eloquent`是建立在`DB`的查询构建器基础之上,对数据库进行了抽象的`ORM`,功能十分丰富让我们可以避免写复杂的SQL语句,并用优雅的方式解决了数据表之间的关联关系。
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2024-02-08 16:56
|
||||
categories: [Laravel]
|
||||
title: Eloquent构造器_2
|
||||
---
|
||||
|
||||
{%quot el:h2 查询构造器 %}
|
||||
## 查询构造器
|
||||
|
||||
当使用`Eloquent`时,我们通常会使用`QueryBuilder`构造器来构建查询,调用语句如下。
|
||||
```php
|
||||
@ -204,7 +200,7 @@ Route::get('/', function (){
|
||||
});
|
||||
```
|
||||
使用`xdebug`,观察调用过程。打开`Illuminate\Database\Query\Builder.php`文件,找到`where`方法。
|
||||
{%image https://oss.xiaokeaii.top/2024/where_array.png%}
|
||||
![](https://oss.xiaokeaii.top/2024/where_array.png)
|
||||
将这一条语句存放到`$this->wheres`数组中,
|
||||
```php
|
||||
$this->wheres[] = compact(
|
||||
@ -261,7 +257,7 @@ Route::get('/', function (){
|
||||
##### 结果
|
||||
刷新首页,`dd()`方法打印当前构建的 SQL 查询语句和绑定的参数,(`dump()`方法同样)
|
||||
|
||||
{%image https://oss.xiaokeaii.top/2024/简单查询sql.png 简单查询sql%}
|
||||
![](https://oss.xiaokeaii.top/2024/简单查询sql.png)
|
||||
|
||||
#### $column为数组时
|
||||
```php
|
||||
@ -309,15 +305,17 @@ public function whereNested(Closure $callback, $boolean = 'and')
|
||||
// return new static($this->connection, $this->grammar, $this->processor);
|
||||
// }
|
||||
```
|
||||
{%note 强调 `$this->forNestedWhere()` 该方法创建一个新的查询构造器`builder`类实例%}
|
||||
:::tip
|
||||
`$this->forNestedWhere()` 该方法创建一个新的查询构造器`builder`类实例
|
||||
:::
|
||||
将断点打到这行`$query->$method($key, '=', $value, $boolean);`,查看`debug`内容
|
||||
{%image https://oss.xiaokeaii.top/2024/column为数组.png%}
|
||||
![](https://oss.xiaokeaii.top/2024/column为数组.png)
|
||||
点击下一步,再次进入`where`方法,此时参数为
|
||||
{%image https://oss.xiaokeaii.top/2024/再次进入where方法.png%}
|
||||
![](https://oss.xiaokeaii.top/2024/再次进入where方法.png)
|
||||
此时,和{%mark color:red $column为字符串时 %} 情况相同,`$this->wheres`数组中,添加该条件,然后进入`addBinding`方法,将`$value`存放到`$this->bindings`数组中。
|
||||
##### 结果
|
||||
查看`dd()`方法的输出, 可以发现跟`$column`为字符串时结果一样。
|
||||
{%image https://oss.xiaokeaii.top/2024/sql输出.png %}
|
||||
![](https://oss.xiaokeaii.top/2024/sql输出.png)
|
||||
|
||||
#### 当$column为闭包且操作符为null时
|
||||
在`where`方法中对应的是以下代码,
|
||||
@ -339,7 +337,7 @@ Route::get('/', function (){
|
||||
});
|
||||
```
|
||||
`debug`如下,
|
||||
{%image https://oss.xiaokeaii.top/2024/闭包.png %}
|
||||
![](https://oss.xiaokeaii.top/2024/闭包.png)
|
||||
|
||||
```php
|
||||
public function whereNested(Closure $callback, $boolean = 'and')
|
||||
@ -372,11 +370,11 @@ public function addNestedWhereQuery($query, $boolean = 'and')
|
||||
}
|
||||
```
|
||||
看`debug`信息可知,闭包中的条件在新的查询构造器`$query`变量中,需要从新查询构造器中取出,添加到当前查询构造器中。
|
||||
{%image https://oss.xiaokeaii.top/2024/新查询构造器.png%}
|
||||
![](https://oss.xiaokeaii.top/2024/新查询构造器.png)
|
||||
而添加的方法就是`addNestedWhereQuery`方法。
|
||||
##### 结果
|
||||
可以发现转成`sql`语句后,结果和`$column`为字符串时一样。但是通过闭包形式可以创建更复杂的查询,代价就是效率会变低。
|
||||
{%image https://oss.xiaokeaii.top/2024/sql输出.png %}
|
||||
![](https://oss.xiaokeaii.top/2024/sql输出.png)
|
||||
|
||||
#### 当$column为闭包且操作符不为null时
|
||||
该方法在`where`方法中对应的是以下代码,这里可以构建更加复杂的子查询。
|
||||
|
@ -1,14 +1,10 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2024-01-21 17:39
|
||||
categories: [Laravel]
|
||||
title: 用户认证
|
||||
---
|
||||
|
||||
{%quot el:h2 安装%}
|
||||
## 安装
|
||||
|
||||
下表列出了`Laravel Auth`系统的核心部件 {%hashtag 重要%}
|
||||
下表列出了`Laravel Auth`系统的核心部件
|
||||
|
||||
| 名称 | 作用 |
|
||||
| ------------- | ------------------------------------------------------------ |
|
||||
|
@ -1,14 +1,11 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-22 16:56
|
||||
title: Facade 门面模式
|
||||
---
|
||||
|
||||
{%quot el:h2 Facade门面模式%}
|
||||
## Facade门面模式
|
||||
参考:
|
||||
Laravel中文社区8.5文档
|
||||
{%link https://learnku.com/docs/laravel/8.5/facades/10367 Laravel中文社区8.5文档%}
|
||||
![](https://learnku.com/docs/laravel/8.5/facades/10367)
|
||||
|
||||
### 环境
|
||||
|
||||
@ -29,7 +26,7 @@ Zend Engine v3.4.0, Copyright (c) Zend Technologies
|
||||
|
||||
#### 什么是静态代理
|
||||
参考官方手册:
|
||||
{%link https://www.php.net/manual/zh/language.oop5.late-static-bindings.php 后期静态绑定%}
|
||||
![](https://www.php.net/manual/zh/language.oop5.late-static-bindings.php)
|
||||
> php静态代理是一种在运行时动态绑定方法的技术。
|
||||
> “后期绑定”的意思是说,`static::` 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
|
||||
|
||||
@ -72,7 +69,7 @@ public static function resolveFacadeInstance($name)
|
||||
}
|
||||
```
|
||||
访问首页,跟我们猜测一致
|
||||
{%image https://oss.xiaokeaii.top/2023/facade.png resolveFacadeInstance()方法%}
|
||||
![](https://oss.xiaokeaii.top/2023/facade.png)
|
||||
|
||||
#### 查看`Facade`类的`resolveFacadeInstance`方法
|
||||
```php
|
||||
|
@ -1,8 +1,4 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-15 16:58
|
||||
categories: [Laravel]
|
||||
title: 入口文件
|
||||
---
|
||||
|
||||
|
@ -1,15 +1,13 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-15 15:58
|
||||
categories: [Laravel]
|
||||
title: 环境配置
|
||||
description: 项目环境配置简要说明
|
||||
---
|
||||
|
||||
## 环境
|
||||
{%radio checked:true php 7.4%}
|
||||
{%radio checked:true laravel 8.x%}
|
||||
:::tip
|
||||
php 7.4
|
||||
|
||||
laravel 8.x
|
||||
:::
|
||||
|
||||
```php
|
||||
php artisan --version
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-17 16:56
|
||||
categories: [Laravel]
|
||||
title: 处理请求
|
||||
---
|
||||
|
||||
{%quot el:h2 处理请求%}
|
||||
## 处理请求
|
||||
在`index.php`文件中,处理请求的实现
|
||||
```php
|
||||
$response = $kernel->handle(
|
||||
@ -373,7 +369,7 @@ protected function dispatchToRouter()
|
||||
};
|
||||
}
|
||||
```
|
||||
##### then()方法 {%hashtag 重要%}
|
||||
##### then()方法
|
||||
这里是`laravel`路由中间件的`洋葱`模型,请求经过第一个、第二、第三..等中间件,到达控制器,执行控制器的方法。在到达控制器之前,如果有未授权、未登录、未验证的异常,则会抛出异常。
|
||||
```php
|
||||
public function then(Closure $destination)
|
||||
@ -388,7 +384,7 @@ public function then(Closure $destination)
|
||||
```
|
||||
###### array_reduce()函数
|
||||
看一下官方解释,
|
||||
{%image https://oss.xiaokeaii.top/2023/array_reduce.png array_reduce()函数%}
|
||||
![](https://oss.xiaokeaii.top/2023/array_reduce.png)
|
||||
第一个参数为数组,第二个参数是一个匿名函数,第三个参数是一个初始值。
|
||||
举个例子,
|
||||
```php
|
||||
@ -511,8 +507,9 @@ function () use ($carry, $item) {
|
||||
5. 第三步的回调函数执行结束,输出`f3 end`,
|
||||
6. 第二步步的回调函数执行结束,输出`f2 end`,
|
||||
7. 第一步的回调函数执行结束,输出`f1 end`
|
||||
|
||||
{%note 由此不难理解,中间件的执行方式,第一个中间件执行完,传递给下一个中间件,依次类推。最终最后一个中间件调用`$this->prepareDestination($destination)`这个方法内的闭包%}
|
||||
::: tip
|
||||
由此不难理解,中间件的执行方式,第一个中间件执行完,传递给下一个中间件,依次类推。最终最后一个中间件调用`$this->prepareDestination($destination)`这个方法内的闭包
|
||||
:::
|
||||
|
||||
###### prepareDestination()查看该方法
|
||||
|
||||
|
@ -1,8 +1,4 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-15 18:56
|
||||
categories: [Laravel]
|
||||
title: 实例化容器类
|
||||
---
|
||||
引入容器类,
|
||||
|
@ -1,7 +1,3 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-15 17:39
|
||||
categories: [Laravel]
|
||||
title: 自动加载实现原理
|
||||
---
|
@ -1,11 +1,7 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-19 20:24
|
||||
categories: [Laravel]
|
||||
title: Application源码
|
||||
---
|
||||
{%quot el:h2 Application源码%}
|
||||
## Application源码
|
||||
|
||||
```php
|
||||
namespace Illuminate\Foundation;
|
||||
@ -1422,7 +1418,7 @@ class Application extends Container implements ApplicationContract, CachesConfig
|
||||
}
|
||||
```
|
||||
|
||||
{%quot el:h2 Container类源码 %}
|
||||
## Container类源码
|
||||
|
||||
```php
|
||||
namespace Illuminate\Container;
|
||||
|
@ -1,13 +1,9 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-20 16:56
|
||||
categories: [Laravel]
|
||||
title: 服务提供者
|
||||
---
|
||||
参考网址:
|
||||
[ 服务提供者](https://learnku.com/docs/laravel/8.5/providers/10366)
|
||||
{%quot el:h2 服务提供者%}
|
||||
## 服务提供者
|
||||
|
||||
### 简介
|
||||
> 服务提供者是所有 Laravel 应用程序的引导中心。你的应用程序,以及通过服务器引导的 Laravel 核心服务都是通过服务提供器引导。
|
||||
@ -111,11 +107,15 @@ public function bootstrapWith(array $bootstrappers)
|
||||
}
|
||||
}
|
||||
```
|
||||
{%note 该方法循环数组`$bootstrappers`的每一个元素,并调用其`bootstrap()`方法。重点看`\Illuminate\Foundation\Bootstrap\RegisterProviders::class`类的`bootstrap()`方法%}
|
||||
::: tip
|
||||
该方法循环数组`$bootstrappers`的每一个元素,并调用其`bootstrap()`方法。重点看`\Illuminate\Foundation\Bootstrap\RegisterProviders::class`类的`bootstrap()`方法
|
||||
:::
|
||||
|
||||
#### RegisterProviders::class类
|
||||
查看该类的`bootstrap()`方法
|
||||
{%note color:warning __这是服务提供者加载的核心方法(重要!)__%}
|
||||
::: warning
|
||||
__这是服务提供者加载的核心方法(重要!)__
|
||||
:::
|
||||
|
||||
```php
|
||||
public function bootstrap(Application $app)
|
||||
@ -338,7 +338,9 @@ class ExampleServiceProvider extends ServiceProvider
|
||||
}
|
||||
}
|
||||
```
|
||||
{%note 分析源码可知,`ExampleServiceProvider`继承了`Illuminate\Support\ServiceProvider`类,当`new`类时,调用了`ServiceProvider`的构造函数,将服务容器绑定到`$this->app`中,并将`example`服务绑定到`ExampleService`实例上。%}
|
||||
::: tip
|
||||
分析源码可知,`ExampleServiceProvider`继承了`Illuminate\Support\ServiceProvider`类,当`new`类时,调用了`ServiceProvider`的构造函数,将服务容器绑定到`$this->app`中,并将`example`服务绑定到`ExampleService`实例上。
|
||||
:::
|
||||
#### 新建服务类
|
||||
新建位于`app/Services`目录下的`ExampleService.php`类,写一个测试方法
|
||||
```php
|
||||
@ -369,7 +371,7 @@ Route::get('/', function () {
|
||||
});
|
||||
```
|
||||
访问首页,可以看到输出`test`以及`ExampleService`对象实例。
|
||||
{%image https://oss.xiaokeaii.top/2023/example类输出.png 输出内容%}
|
||||
![](https://oss.xiaokeaii.top/2023/example类输出.png)
|
||||
|
||||
#### $bindings 和 $singletons属性
|
||||
```php
|
||||
@ -406,7 +408,9 @@ public $singletons = [
|
||||
```
|
||||
注释掉`register`方法中的绑定,访问首页依旧可以正常解析
|
||||
|
||||
{%note 如果有很多简单的绑定,可以使用这两个属性来简化操作%}
|
||||
::: tip
|
||||
如果有很多简单的绑定,可以使用这两个属性来简化操作
|
||||
:::
|
||||
|
||||
#### 延迟加载提供者
|
||||
如果只注册,可以选择延迟加载该服务。延迟加载可以提高应用性能。
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-16 17:39
|
||||
categories: [Laravel]
|
||||
title: 注册基础绑定
|
||||
---
|
||||
|
||||
{%quot el:h2 注册基础绑定%}
|
||||
## 注册基础绑定
|
||||
对应代码
|
||||
```php
|
||||
$this->registerBaseBindings();
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-17 18:56
|
||||
categories: [Laravel]
|
||||
title: 注册服务提供者
|
||||
---
|
||||
|
||||
{%quot el:h2 注册服务提供者%}
|
||||
## 注册服务提供者
|
||||
```php
|
||||
// 对应容器构造函数中的代码
|
||||
$this->registerBaseServiceProviders();
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-17 18:56
|
||||
categories: [Laravel]
|
||||
title: 注册核心别名类
|
||||
---
|
||||
|
||||
{%quot el:h2 注册核心别名类%}
|
||||
## 注册核心别名类
|
||||
对应容器构造函数中
|
||||
```php
|
||||
$this->registerCoreContainerAliases();
|
||||
|
@ -1,11 +1,7 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-20 18:56
|
||||
categories: [Laravel]
|
||||
title: 渲染页面
|
||||
---
|
||||
{%quot el:h2 渲染页面%}
|
||||
## 渲染页面
|
||||
```php
|
||||
$response = $kernel->handle(
|
||||
$request = Request::capture()
|
||||
|
@ -1,35 +0,0 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-21 16:56
|
||||
categories: [Laravel]
|
||||
title: 进度
|
||||
---
|
||||
|
||||
{% okr 目标 %}
|
||||
|
||||
完成 {%hashtag color:red Laravel%} 请求流程的源码分析,理解各组件的实现原理
|
||||
|
||||
<!-- okr kr1 percent:0.58 -->
|
||||
请求流程分析
|
||||
- {% checkbox checked:true 配置环境 %}
|
||||
- {% checkbox checked:true 入口文件 %}
|
||||
- {% checkbox checked:false 实现自动加载 %}
|
||||
- {% checkbox checked:true 实例化容器 %}
|
||||
- {% checkbox checked:true 设置基础目录 %}
|
||||
- {% checkbox checked:true 注册基础绑定 %}
|
||||
- {% checkbox checked:true 注册基础服务提供者 %}
|
||||
- {% checkbox checked:true 注册核心别名类 %}
|
||||
- {% checkbox checked:false 解析HTTP内核 %}
|
||||
- {% checkbox checked:false 处理请求 %}
|
||||
- {% checkbox checked:true symbol:plus color:green 解析路由%}
|
||||
- {% checkbox checked:false 渲染页面 %}
|
||||
- {% checkbox checked:false 终止 %}
|
||||
<!-- okr kr2 percent:0.5 -->
|
||||
核心服务组件原理分析
|
||||
- {%checkbox checked:false 服务容器%}
|
||||
- {%checkbox checked:true 服务提供者%}
|
||||
- {%checkbox checked:true Facade门面模式%}
|
||||
- {%checkbox checked:true symbol:plus color:green Eloquent查询构造器_1%}
|
||||
- {%checkbox checked:true symbol:plus color:green Eloquent查询构造器_2%}
|
||||
{% endokr %}
|
@ -1,11 +1,7 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-20 18:56
|
||||
categories: [Laravel]
|
||||
title: 终止程序
|
||||
---
|
||||
{%quot el:h2 终止程序%}
|
||||
## 终止程序
|
||||
```php
|
||||
$kernel->terminate($request, $response);
|
||||
```
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-16 16:56
|
||||
categories: [Laravel]
|
||||
title: 解析HTTP内核
|
||||
---
|
||||
|
||||
{%quot el:h2 解析HTTP内核%}
|
||||
## 解析HTTP内核
|
||||
在此之前,已经从容器中解析出内核实例
|
||||
```php
|
||||
$kernel = $app->make(Kernel::class);
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-28 16:56
|
||||
categories: [Laravel]
|
||||
title: 解析路由
|
||||
---
|
||||
|
||||
{%quot el:h2 解析路由%}
|
||||
## 解析路由
|
||||
|
||||
上面说到,请求经过中间件之后,最终调用`dispatchToRouter()`方法,接下来分析`dispatchToRouter()`方法的实现。
|
||||
```php
|
||||
|
@ -1,12 +1,8 @@
|
||||
---
|
||||
layout: wiki
|
||||
wiki: laravel #项目名
|
||||
date: 2023-12-16 16:56
|
||||
categories: [Laravel]
|
||||
title: 设置基础目录路径
|
||||
---
|
||||
|
||||
{%quot el:h2 设置基础目录路径%}
|
||||
## 设置基础目录路径
|
||||
给容器变量`$instance`设置基础路径
|
||||
```php
|
||||
public function setBasePath($basePath)
|
||||
@ -88,10 +84,11 @@ public function bound($abstract)
|
||||
$this->isAlias($abstract);
|
||||
}
|
||||
```
|
||||
::: tip
|
||||
第一次进来都是未绑定状态
|
||||
:::
|
||||
|
||||
{%note 第一次进来都是未绑定状态%}
|
||||
|
||||
{%quot el:h2 app()方法实现 %}
|
||||
## app()方法实现
|
||||
在代码中,有几个辅助函数可以快速获取容器中的服务,例如
|
||||
```php
|
||||
if (! function_exists('config_path')) {
|
||||
@ -120,7 +117,9 @@ function app($abstract = null, array $parameters = [])
|
||||
}
|
||||
```
|
||||
### 了解Container类
|
||||
{%note color:red 对于容器类,还需要很多更详细的分析和了解,另外起一篇,这里就不详细分析了%}
|
||||
::: tip
|
||||
对于容器类,还需要很多更详细的分析和了解,另外起一篇,这里就不详细分析了
|
||||
:::
|
||||
|
||||
#### Container::getInstance()方法
|
||||
此处是一个单例模式,如果实例不存在,则创建一个`Container`实例,并返回
|
||||
@ -138,9 +137,9 @@ public static function getInstance()
|
||||
`new static` 使用`static`关键字返回时会返回调用者自身实例
|
||||
##### 延迟静态绑定
|
||||
官网参考地址:
|
||||
{%link https://www.php.net/manual/zh/language.oop5.late-static-bindings.php%}
|
||||
![](https://www.php.net/manual/zh/language.oop5.late-static-bindings.php%)
|
||||
延迟静态绑定是一种特殊的绑定,它会在第一次访问时才绑定实例,并且只绑定一个实例,后续访问将返回相同的实例。
|
||||
{%link https://learnku.com/laravel/t/3844/understanding-php-delayed-static-binding-late-static-bindings#3e8425 社区参考%}
|
||||
![](https://learnku.com/laravel/t/3844/understanding-php-delayed-static-binding-late-static-bindings#3e8425)
|
||||
#### Container::make()方法
|
||||
继续看传值时调用`make()`方法,`getInstance()`返回自身实例,在`Container`类中,找到`make()`方法
|
||||
```php
|
||||
@ -237,7 +236,7 @@ public function getAlias($abstract)
|
||||
: $abstract;
|
||||
}
|
||||
```
|
||||
###### raiseEvents()方法 {%hashtag 待完善可跳过%}
|
||||
###### raiseEvents()方法
|
||||
当使用`make()`方法时,`$raiseEvents`参数值为`true`,一定会执行`fireBeforeResolvingCallbacks`方法,并将`$abstract $parameters`两个参数值传过去
|
||||
```php
|
||||
protected function fireBeforeResolvingCallbacks($abstract, $parameters = [])
|
||||
|
@ -1,11 +1,5 @@
|
||||
---
|
||||
layout: post
|
||||
title: NGINX反向代理服务器
|
||||
date: 2023-11-16 19:49:06
|
||||
tags: [nginx,反向代理]
|
||||
categories: [nginx]
|
||||
description: 总结一下NINGX用于反向代理服务器的配置。
|
||||
keywords: nginx,反向代理
|
||||
---
|
||||
科普时间,反向代理服务器是什么?
|
||||
> 反向代理服务器,是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向。
|
||||
|
@ -1,17 +1,12 @@
|
||||
---
|
||||
layout: post
|
||||
title: env文件读取
|
||||
date: 2024-03-18 10:55:47
|
||||
tags:
|
||||
- env文件
|
||||
- vlucas/phpdotenv库
|
||||
cover: https://oss.xiaokeaii.top/2024/dotenv.png
|
||||
description: vlucas/phpdotenv库源码分析
|
||||
---
|
||||
{%note color:red 库版本 vlucas/phpdotenv : ^5.6 %}
|
||||
::: tip
|
||||
库版本 vlucas/phpdotenv : ^5.6
|
||||
:::
|
||||
`phpdotenv`是一个流行的 PHP 库,用于加载应用程序的环境变量。用来读取本地环境变量,以及在运行时动态设置环境变量。
|
||||
源码地址如下,
|
||||
{%link https://github.com/vlucas/phpdotenv%}
|
||||
![](https://github.com/vlucas/phpdotenv)
|
||||
### Dotenv类
|
||||
`Dotenv`类是`vlucas/phpdotenv`库的核心文件,实现了`.env `文件的加载和解析逻辑,以及环境变量的设置功能。
|
||||
查看该类源码,
|
||||
|
@ -1,29 +1,26 @@
|
||||
---
|
||||
layout: post
|
||||
title: iStoreOS路由系统安装
|
||||
date: 2023-11-30 20:00:51
|
||||
tags: [软路由, iStoreOS]
|
||||
categories: [软路由,iStoreOS]
|
||||
description: iStoreOS路由系统的安装教程
|
||||
---
|
||||
|
||||
{%note `iStoreOS`路由系统是一款基于`OpenWrt`的路由系统,支持`x86`、`ARM`等硬件平台。相对于`OpenWrt`来说,`iStoreOS`更容易上手,而且功能也丰富,更加适合不怎么爱折腾的人使用。可以理解为硬路由的扩展,可以拓展路由器的功能。%}
|
||||
::: tip
|
||||
`iStoreOS`路由系统是一款基于`OpenWrt`的路由系统,支持`x86`、`ARM`等硬件平台。相对于`OpenWrt`来说,`iStoreOS`更容易上手,而且功能也丰富,更加适合不怎么爱折腾的人使用。可以理解为硬路由的扩展,可以拓展路由器的功能。:::
|
||||
> iStoreOS 目标是提供一个人人会用的路由兼轻 NAS 系统,不管是作为路由还是 NAS,你都有相似的操作体验。系统本身开源免费,代码在GitHub上开源,可以自行编译。 --来自官方的介绍
|
||||
{%quot el:h2 iStoreOS安装%}
|
||||
|
||||
### 官网地址
|
||||
官网地址如下
|
||||
{%link https://www.istores.cn/%}
|
||||
![]( https://www.istores.cn/)
|
||||
源代码地址
|
||||
{%link https://github.com/istoreos/istoreos%}
|
||||
![](https://github.com/istoreos/istoreos)
|
||||
|
||||
{%note 如果对此感兴趣,可自行去官网研究,也可以跟着我的步骤,安装`iStoreOS`路由系统%}
|
||||
::: tip
|
||||
如果对此感兴趣,可自行去官网研究,也可以跟着我的步骤,安装`iStoreOS`路由系统
|
||||
:::
|
||||
|
||||
## 选择硬件
|
||||
首先,安装路由系统之前,需要选择硬件设备。
|
||||
|
||||
{%note 硬件选择有以下几种:%}
|
||||
{%image https://oss.xiaokeaii.top/2023/支持的硬件.png 支持的硬件 bg:white%}
|
||||
![](https://oss.xiaokeaii.top/2023/支持的硬件.png 支持的硬件)
|
||||
我这里使用的是友善的`R2S`设备,咸鱼淘的,全套下来240块钱,成色较新,包括设备本身、`TF卡`、网线、电源、读卡器。
|
||||
|
||||
硬件选择好了之后进入下一步。
|
||||
@ -31,22 +28,23 @@ description: iStoreOS路由系统的安装教程
|
||||
## 寻找固件
|
||||
|
||||
通过官网,找到对应的`R2S`固件
|
||||
{%image https://oss.xiaokeaii.top/2023/下载固件.png 下载固件%}
|
||||
![](https://oss.xiaokeaii.top/2023/下载固件.png 下载固件)
|
||||
点击后缀为`img.gz`的固件,下载到本地。(下载下来的文件不需要解压)
|
||||
{%image https://oss.xiaokeaii.top/2023/固件链接.png %}
|
||||
![](https://oss.xiaokeaii.top/2023/固件链接.png)
|
||||
## 刷入固件
|
||||
将`TF`卡插在读卡器上,读卡器插在电脑上
|
||||
{%note color:blue 请到官网下载,以防第三方带有广告%}
|
||||
|
||||
### `Windows`系统
|
||||
使用`Win32 Disk Imager`软件,烧录固件到`TF`卡中
|
||||
{%link https://win32diskimager.org/ Win32 Disk Imager软件官网%}
|
||||
![](https://win32diskimager.org/ Win32 Disk Imager软件官网)
|
||||
### `MAC`系统
|
||||
使用`balenaEtcher`软件,烧录固件到`TF`卡中
|
||||
{%link https://www.balena.io/etcher/ balenaEtcher官网%}
|
||||
{%note 我使用的是`MAC`系统,这里仅演示本系统%}
|
||||
![](https://www.balena.io/etcher/ balenaEtcher官网)
|
||||
:::tip
|
||||
我使用的是`MAC`系统,这里仅演示本系统
|
||||
:::
|
||||
打开`balenaEtcher`软件,选择`istoreos-22.03.5-2023082509-r2s-squashfs.img.gz`文件,选择目标磁盘,点击烧录,等待烧录完成。(文件名日期不一定相同,使用自己下载的文件即可)
|
||||
{%image https://oss.xiaokeaii.top/2023/系统烧录.png 烧录系统%}
|
||||
![](https://oss.xiaokeaii.top/2023/系统烧录.png)
|
||||
|
||||
## 启动软路由
|
||||
将`TF`卡插入软路由,接通电源,将网线一头接在电脑的`LAN`口,另一头接在软路由的`LAN`口。等待红色指示灯闪烁。(首次启动大概1-5分钟)
|
||||
@ -61,13 +59,15 @@ description: iStoreOS路由系统的安装教程
|
||||
如果不知道自家路由器`IP`地址,可通过百度搜索各大品牌的默认`IP`地址。
|
||||
#### 更改默认IP
|
||||
1. 使用电脑打开浏览器,输入`192.168.100.1`,出现`iStoreOS`的登录界面,说明启动成功。
|
||||
{%image https://oss.xiaokeaii.top/2023/istoreos登录.png iStoreOS登录%}
|
||||
![](https://oss.xiaokeaii.top/2023/istoreos登录.png)
|
||||
2. 使用默认的密码登录,进入系统
|
||||
{%image https://oss.xiaokeaii.top/2023/istoreos首页.png istoreos首页%}
|
||||
![](https://oss.xiaokeaii.top/2023/istoreos首页.png)
|
||||
3. 点击左边菜单的网络向导,进入网络设置页面
|
||||
{% note 这里有三种配置,根据自身需要进行选择,这里仅演示配置为`旁路由模式`的方式,其他两种请自行寻找 %}
|
||||
4. 点击`配置为旁路由`按钮,点击手动配置
|
||||
{%image https://oss.xiaokeaii.top/2023/旁路由配置.png 旁路由配置%}
|
||||
{% note `IP`地址填与路由器最后一个点后面不同的数字,可以填一个100以内的。子网掩码就填`255.255.255.0`,网关填写路由器的`IP`地址,DNS填路由器的`IP`地址,点击保存即可。关闭`DHCP`服务,关闭`IPV6`客户端%}
|
||||
![](https://oss.xiaokeaii.top/2023/旁路由配置.png)
|
||||
::: tip
|
||||
`IP`地址填与路由器最后一个点后面不同的数字,可以填一个100以内的。子网掩码就填`255.255.255.0`,网关填写路由器的`IP`地址,DNS填路由器的`IP`地址,点击保存即可。关闭`DHCP`服务,关闭`IPV6`客户端
|
||||
:::
|
||||
5. 点击保存即可
|
||||
6. 拔出接入电脑的网线,将网线插到路由器的`LAN`口上,连接路由器`Wi-Fi`,访问上面给软路由配置的`IP`地址,如果看到登录界面即为安装成功,如果未显示登录界面,请检查以上步骤
|
@ -1,128 +0,0 @@
|
||||
---
|
||||
layout: post
|
||||
title: 主题语法
|
||||
date: 2023-10-20 10:44:07
|
||||
tags:
|
||||
description: stallar的语法使用了markdown的语法,在此基础上进行了扩展,支持一些常用的功能,方便使用。
|
||||
---
|
||||
{%hashtag 官方地址 https://xaoxuu.com/wiki/stellar/tag-plugins/express%}
|
||||
|
||||
## emoji 表情
|
||||
语法 示例 {%emoji qq 微笑%}
|
||||
支持的表情来源在主题配置文件下:
|
||||
![](https://oss.xiaokeaii.top/2023/emoji来源.png)
|
||||
|
||||
```
|
||||
{% emoji [source] name [height:1.75em] %}
|
||||
```
|
||||
|
||||
## mark 行内文本标记
|
||||
多彩标记 示例:{% mark 默认 %}
|
||||
|
||||
```
|
||||
模板: {% mark 类型 %}
|
||||
```
|
||||
|
||||
## tag 标签
|
||||
类似mark标签,支持链接,示例 {%hashtag GitHub https://github.com %}
|
||||
|
||||
模板:
|
||||
|
||||
```
|
||||
{% tag 内容 [链接地址]%}
|
||||
```
|
||||
|
||||
## 主题的image 图片标签
|
||||
可以放置下载按钮,语法格式
|
||||
|
||||
```markdown
|
||||
{% image src [description] [download:bool/string] [width:px] [padding:px] [bg:hex] %}
|
||||
```
|
||||
参数说明
|
||||
```yaml
|
||||
src: 图片地址
|
||||
description: 图片描述
|
||||
download: href # 下载地址,设置此值后鼠标放在图片上会显示下载地址,如果下载地址为图片地址,可以设置为 true
|
||||
width: 200px # 图片宽度
|
||||
padding: 16px # 图片四周填充宽度
|
||||
bg: '#ffffff' # 图片区域背景颜色,16进制
|
||||
```
|
||||
|
||||
## quot 引用
|
||||
居中的引用,示例
|
||||
|
||||
{%quot 主题配置%}
|
||||
|
||||
语法
|
||||
```md
|
||||
{%quot title%}
|
||||
```
|
||||
|
||||
## link 链接卡片
|
||||
外链卡片标签
|
||||
```
|
||||
{% link href [title] [icon:src] [desc:true/false] %}
|
||||
```
|
||||
{%link https://github.com GitHub%}
|
||||
|
||||
参数
|
||||
|
||||
```yaml
|
||||
href: 链接
|
||||
title: 可选,手动设置标题(为空时会自动抓取页面标题)
|
||||
icon: 可选,手动设置图标(为空时会自动抓取页面图标)
|
||||
desc: 可选,是否显示摘要描述,为true时将会显示页面描述
|
||||
|
||||
```
|
||||
|
||||
## radio 单选
|
||||
|
||||
```
|
||||
{% radio 没有勾选的单选框 %}
|
||||
{% radio checked:true 已勾选的单选框 %}
|
||||
```
|
||||
|
||||
参数
|
||||
```yaml
|
||||
checked: true/false
|
||||
color: red/orange/yellow/green/cyan/blue/purple
|
||||
```
|
||||
|
||||
## checkbox 复选
|
||||
### 语法
|
||||
```
|
||||
{% checkbox 普通的没有勾选的复选框 %}
|
||||
{% checkbox checked:true 普通的已勾选的复选框 %}
|
||||
{% checkbox symbol:plus color:green checked:true 显示为加号的绿色的已勾选的复选框 %}
|
||||
{% checkbox symbol:minus color:yellow checked:true 显示为减号的黄色的已勾选的复选框 %}
|
||||
{% checkbox symbol:times color:red checked:true 显示为乘号的红色的已勾选的复选框 %}
|
||||
```
|
||||
### 参数
|
||||
|
||||
```yaml
|
||||
checked: true/false
|
||||
color: red/orange/yellow/green/cyan/blue/purple
|
||||
symbol: plus/minus/times
|
||||
```
|
||||
|
||||
## 文本修饰标签集
|
||||
### 示例
|
||||
- 这是 {% psw 密码 %} 标签
|
||||
- 这是 {% u 下划线 %} 标签
|
||||
- 这是 {% emp 着重号 %} 标签
|
||||
- 这是 {% wavy 波浪线 %} 标签
|
||||
- 这是 {% del 删除线 %} 标签
|
||||
- 这是 {% sup 上角标 color:red %} 标签
|
||||
- 这是 {% sub 下角标 %} 标签
|
||||
- 这是 {% kbd 键盘样式 %} 标签,试一试:{% kbd ⌘ %} + {% kbd D %}
|
||||
### 语法
|
||||
```
|
||||
- 这是 {% psw 密码 %} 标签
|
||||
- 这是 {% u 下划线 %} 标签
|
||||
- 这是 {% emp 着重号 %} 标签
|
||||
- 这是 {% wavy 波浪线 %} 标签
|
||||
- 这是 {% del 删除线 %} 标签
|
||||
- 这是 {% sup 上角标 color:red %} 标签
|
||||
- 这是 {% sub 下角标 %} 标签
|
||||
- 这是 {% kbd 键盘样式 %} 标签,试一试:{% kbd ⌘ %} + {% kbd D %}
|
||||
```
|
Loading…
Reference in New Issue
Block a user