0%

1
2
3
4
5
6
7
// 前缀
$prefix = 'abc';

// 需要在前面连接上应用的缓存前缀
$keys = app('redis')->keys(config('cache.prefix') . $prefix . '*');

app('redis')->del($keys);

  • 只有 $sku->{attribute} != $sku->getOriginal({attribute}) 不一致的时候才会触发   getDirty() 不为空的时候才触发, 而且不会比较数据类型(判断是否 dirty 使用的是 == 而不是 ===)

  • 直接 app(Model::class)->where()->update() 不会触发   $sku = app(Sku::class), $sku->has_stock = 1; $sku->save() 这样才会触发

  • 这是因为,使用 app(Model::class)->where()->update() 的时候,调用的是 Query/Builder 的 update 方法,这里面是没法触发 update 事件的。

  • 使用 $sku = app(Sku::class), $sku->has_stock = 1; $sku->save() 的时候,使用的 update 方法是 Eloquent/Model 里面的 update 方法。

https://github.com/laravel/framework/issues/11777#issuecomment-170384117

比如 LumenConsoleServiceProvider 里面的 register 做了下面的处理:

\Laravel\Lumen\Console\ConsoleServiceProvider::register

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->registerCommands(array_merge(
$this->commands, $this->devCommands
));
}

/**
* Register the given commands.
*
* @param array $commands
* @return void
*/
protected function registerCommands(array $commands)
{
foreach (array_keys($commands) as $command) {
call_user_func_array([$this, "register{$command}Command"], []);
}

$this->commands(array_values($commands));
}

/**
* Register the package's custom Artisan commands.
*
* @param array|mixed $commands
* @return void
*/
public function commands($commands)
{
$commands = is_array($commands) ? $commands : func_get_args();

Artisan::starting(function ($artisan) use ($commands) {
$artisan->resolveCommands($commands);
});
}


// \Illuminate\Console\Application::resolveCommands

/**
* Resolve an array of commands through the application.
*
* @param array|mixed $commands
* @return $this
*/
public function resolveCommands($commands)
{
$commands = is_array($commands) ? $commands : func_get_args();

foreach ($commands as $command) {
$this->resolve($command);
}

return $this;
}

/**
* Add a command, resolving through the application.
*
* @param string $command
* @return \Symfony\Component\Console\Command\Command
*/
public function resolve($command)
{
return $this->add($this->laravel->make($command));
}

注意看上面的最后一个方法,这是所有命令 register 的时候都要做的一件事,也就是实例化, 也就是说,在我们命令行任何的 handle 方法运行之前,就需要实例化所有的 Command 了。 因为 Command 里面的 signaturedescription 都是实例属性,需要实例化才能获取,要不然我们运行 php artisan 的时候就获取不到命令列表了。

因此,如果我们在 Command__construct 里面做了一些影响全局的操作,有可能我们不会察觉得到,比如:

1
\Cache::setPrefix('abc');

虽然你是在一个 Command 里面设置了 Cacheprefix,但实际上你在其他 Command 里面的缓存前缀也会是你设置的这个。

简单地说,我们运行 php artisan 的时候,会把所有定义的 Command 实例化,如果我们需要做一些命令行初始化操作,最好放在 handle() 里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

查看原文

  1. 在 composer.json 添加下面的配置
1
2
3
4
5
6
"repositories": [
{
"type": "path",
"url": "/full/or/relative/path/to/development/package"
}
]
  1. 执行 require 操作
1
composer require "vendorname/packagename @dev"

@dev 和包名中间的空格要有

查看原文