Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修复临时关闭布局的用法,导致返回template对象的问题; #8

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

augushong
Copy link

如改问题描述:
top-think/think-template#25

使用链式调用方法,通过layout方法设置布局时,从view的魔术方法调用template的layout方法,但此时返回的$this是template类,而不是view类,这将导致后续联系调用对象错误。

本次提交意为修复该错误。

@augushong
Copy link
Author

实际上,及时本次提交修复了think-view的问题,但整个框架预期表现仍然有问题。

当使用think-view扩展时,一共有3处fetch方法,分别是framework的view的fetch方法,think-view的view的fetch方法,think-template的fetch方法。

本次提交虽然可以让layout方法返回think-view的$this,但却不能返回framework的view实例。

实际上,当用户通过facade的view条用方法时,链式调用返回的$this,都应当是framework下的实例。

因此更彻底的改法,应当是调整framework的Manager类的__call方法,使其明确返回$this,而不是魔术方法所返回实例。

vendor\topthink\framework\src\think\Manager.php

/**
 * 动态调用
 * @param string $method
 * @param array  $parameters
 * @return mixed
 */
public function __call($method, $parameters)
{
    return $this->driver()->$method(...$parameters);
}

@augushong
Copy link
Author

但是,由于manager下的__call调用后,返回的不一定是driver的实例,而是某些方法的返回值,返回结果,所以又不能简单的直接在__call中返回$this。
所以可能需要在__call中判断driver的返回值,如果返回driver实例时,则返回当前framework的$this实例,但此时$this为manager,并非实际的调用类。

@augushong
Copy link
Author

augushong commented Sep 9, 2023

之所以做这些调整,是因为通过链式调用layout后,三处fetch的表现极其不一致。

在framework下,fetch 会 return 内容。
在think-view下,fetch会输出内容。
在think-template下,fetch会输出内容,但所有配置和解析目录都发生变,比如无法定位到正确的控制器视图目录。

经过layout链式调用临时关闭布局,就会明显的感受到fetch表现不一致。
如下面代码所示,我希望通过layout关闭布局后,仍然能返回内容并向上层返回,但不行,只能通过ob_get_clean方法回去渲染的内容。
图片

另一种简单的解决方法是,在framework下的view定义一个layout方法,返回$this view实例,但layout并非视图的通用方法,此举不合适。

或者在__call中统一定义一个exception,当捕捉到该exception时,表示正常执行,返回当前实例。但是这又会导致被调用的类如何判断返回$this或抛出exception的问题。

@augushong
Copy link
Author

但仍然,本次修复仍有意义,可以使layout的链式调用正确执行下去。
关于fetch表现不一致的问题,也有更直接的办法,升级think-template大版本,新版的fetch使用return结果,display直接输出结果。同时升级think-view和framework,直接获取返回内容,而不需要通过ob_get_clean获取内容。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant