【问题标题】:Slim 3 container undefined method when creating custom container function创建自定义容器函数时的 Slim 3 容器未定义方法
【发布时间】:2017-10-25 02:39:55
【问题描述】:

我正在尝试在容器中创建带有参数的自定义函数,但我所做的一切都以失败告终。我当前的代码如下:

$container['myFunction'] = function($container) {
    return function($arg) {
        return $arg;
    };
};

// Called from a route:
echo $this->myFunction("test"); // Call to undefined method Slim\Container::myFunction()

我做错了吗?根据我在网上阅读的内容,这应该是使用 Slim 3 定义自定义容器函数的正确方法。任何帮助都会很棒,谢谢!

【问题讨论】:

  • 你能发布确切的错误信息吗?并提供容器和应用实例化的代码和路由代码。
  • @aendeerei 查看更新后的帖子。
  • 好的。请注意,settings 中有 2x 'displayErrorDetails'。
  • @aendeerei 哎呀,我的错。

标签: php slim slim-3


【解决方案1】:

您需要先创建容器服务的实例,然后才能使用它。

$myFunc = $this->myFunction;
echo $myFunc('test');

或单行:

echo ($this->myFunction)('test');

【讨论】:

  • 这行得通,但有没有办法绕过它?容器在 slim 中的工作方式有点模糊。
  • @aendeerei 该问题的公认答案似乎不正确,我尝试了该代码并引发了与 Joe 提到的相同的错误。
  • @JoeScotto 其实和 Slim 没有关系,你只需要以 OOP 的方式解决你的主要问题,而不是程序的方法。在 cmets 中编写代码不是一个好主意,但仅举个例子:class MyService { function myFunction($arg){ return $arg;}} 然后$container['myService'] = function($c){return new MyService;}; 和你的路线$this->myService->myFunction('some arguments');
  • @aendeerei Slim 使用 Pimple 作为其 DIC,因此我们不能指望 Slim 团队提供太多文档,但幸运的是,Pimple 本身就有很好的文档记录。如果您有兴趣,请看这里pimple.symfony.com。关于魔术__call 函数的观点,请注意它是在Slim\App 类而不是Pimple\Container 中定义的,并且在路由回调中$this 是Container not App 的一个实例。 我不确定,但我猜 $app->myFunction(...) 工作正常,但不是$this->myFunction(...)
  • @Nima 确实,我看错了地方,因为我对闭包处理/范围没有太多实践。是的,路由是用$app->get(...)添加的,它调用map(),它用bindTo()将闭包绑定到容器。因此$this 指的是容器。谢谢;-)
猜你喜欢
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多