>我正在阅读一篇有关参数化中间件的文章,而我在想参数的奇怪语法。它看起来像是静态方法调用中的错字,someclass :: class。':: somemethod'。
如果该参数比字符串更复杂,例如基本枚举。
,所以我查看了中间件方法的代码。
/**
* get or set the middlewares attached to the route.
*
* @param array|string|null $middleware
* @return $this|array
*/
public function middleware($middleware = null)
{
if (is_null($middleware)) {
return (array) ($this->action['middleware'] ?? []);
}
if (! is_array($middleware)) {
$middleware = func_get_args();
}
foreach ($middleware as $index => $value) {
$middleware[$index] = (string) $value;
}
$this->action['middleware'] = array_merge(
(array) ($this->action['middleware'] ?? []), $middleware
);
return $this;
}
为什么这会发生?
>
return (new pipeline($this->container))
->send($request)
->through($middleware)
->then(fn ($request) => $this->prepareresponse(
$request, $route->run()
));
public function then(closure $destination)
{
$pipeline = array_reduce(
array_reverse($this->pipes()), $this->carry(), $this->preparedestination($destination)
);
return $pipeline($this->passable);
}
} elseif (! is_object($pipe)) {
[$name, $parameters] = $this->parsepipestring($pipe);
// if the pipe is a string we will parse the string and resolve the class out
// of the dependency injection container. we can then build a callable and
// execute the pipe function giving in the parameters that are required.
$pipe = $this->getcontainer()->make($name);
$parameters = array_merge([$passable, $stack], $parameters);
}
protected function parsepipestring($pipe)
{
[$name, $parameters] = array_pad(explode(':', $pipe, 2), 2, []);
if (is_string($parameters)) {
$parameters = explode(',', $parameters);
}
return [$name, $parameters];
}
>这种方法带来的额外条件是参数是用逗号识别的。因此,someclass :: class。':[a,b]'将导致['[a'','b]']。
在这次潜水中,我找到了三个地方,在三个地方执行了字符串类型
>
路由中间件方法
管道携带方法,因为它隐含地期望字符串
final readonly class pipelineclass {
public function __constructor(public string $class, public mixed $options) {
$this->validate($class);
}
private function validate(string $class) {
if(!is_callable($class)) {
throw new \exception("$class is not callable.");
}
}
}
if (is_callable($pipe)) {
// code
} elseif (! is_object($pipe)) {
// code
} else {
// code
}
>
if($pipe instanceof PipelineClass){
// code
} elseif (is_callable($pipe)) {
// code
} elseif (is_string($pipe)) {
// code
} else {
// code
}
在代码中还有其他几个地方检查了类和参数语法。因此他们也需要更改。
我想知道参数语法是否足以容纳使用该功能的人,还是创建自己的参数语法以使提供更多信息成为可能?
以上就是Laravel参数化中间件深入潜水的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号