将变量传递给匿名函数而不使用use关键字

时间:2014-05-26 19:10:21

标签: php dependency-injection

我有一个Router课程:

$router->
    get($pattern, $callback); // creates a new route
    [...]

Application班级:

$app->
    get($pattern, $callback); // calls the router `get()` method
    [...]

问题是,当我设置回调时,在每个函数中我需要$app实例。我知道我可以使用use关键字,但是对于每个路由使用它,每次回调都会令人烦恼且毫无意义。

示例:

变化:

$app->get('here/is/my/pattern', function () use ($app) {
    $app->controller('just_an_example');
});

要:

$app->get('here/is/my/pattern', function () {
    $app->controller('just_an_example');
});

如何在没有use关键字的情况下将变量传递给匿名函数?

2 个答案:

答案 0 :(得分:2)

简答

变量中只有use

长答案

说真的,只有use变量。

替代答案

可以重新绑定回调,如果它是一个闭包:

function rebind(App $app, Closure $closure) {
    return $closure->bindTo($app);
}

$app->get('here/is/my/pattern', rebind($app, function () {
    $this->controller('just_an_example');
}));

$this现已绑定到$app$this始终可用于非静态闭包。

但除了不必要的间接之外,这并没有让你受益匪浅;请参阅简答和/或长答案

答案 1 :(得分:0)

你的设计错了。

调用Controller不是路由器的工作。相反,您的路由器应该return某些东西(通常是Route对象)对应于匹配路由。一般如此:

$router = new Router($reuqest->getURI()); //The request URI
$router->addRoute("some/pattern", "SomeController");
$router->addRoute("some/other/pattern", "SomeOtherController");
$route = $router->route(); //$route now has a Route object.

$controllerClass = $route->getResource();
$app->$controllerClass($request); //Pass the Request object with GET and POST and whatever into the controller

这样,路由器不知道它会进入某个控制器,控制器也不知道它来自路由。这两个组件现在完全可以重复使用。