我有一个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
关键字的情况下将变量传递给匿名函数?
答案 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
这样,路由器不知道它会进入某个控制器,控制器也不知道它来自路由。这两个组件现在完全可以重复使用。