是否有可能在PHP中使用等效的.NET方法属性,或以某种方式模拟这些属性?
Context
我们非常喜欢内部URL路由类。今天的工作方式是,我们首先必须向中央路线管理器注册所有路线,如下所示:
$oRouteManager->RegisterRoute('admin/test/', array('CAdmin', 'SomeMethod'));
$oRouteManager->RegisterRoute('admin/foo/', array('CAdmin', 'SomeOtherMethod'));
$oRouteManager->RegisterRoute('test/', array('CTest', 'SomeMethod'));
无论何时遇到路由,都会调用回调方法(在上述情况下,它们是静态类方法)。但是,这至少在代码中将路由与方法分开。
我正在寻找某种使路线更接近该方法的方法,就像您可能在C#中所做的那样:
<Route Path="admin/test/">
public static void SomeMethod() { /* implementation */ }
我现在看到的选项是创建某种phpDoc扩展,使我可以执行以下操作:
/**
* @route admin/test/
*/
public static function SomeMethod() { /* implementation */ }
但是那将需要为phpDoc编写/重用解析器,并且很可能会很慢。
另一种选择是将每条路由分成自己的类,并具有如下所示的方法:
class CAdminTest extends CRoute
{
public static function Invoke() { /* implementation */ }
public static function GetRoute() { return "admin/test/"; }
}
但是,这仍然需要注册每个类,并且会有很多这样的类(更不用说额外的代码了。)]
那么我在这里有什么选择?使路由保持接近其调用方法的最佳方法是什么?
是否有可能在PHP中为.NET方法属性使用等效项,或者以某种方式模拟这些属性?上下文我们有一个非常喜欢的内部URL路由类。今天的工作方式是...
这就是我最终解决这个问题的方式。 article provided by Kevin是一个巨大的帮助。通过使用ReflectionClass和ReflectionMethod :: getDocComment,我可以非常轻松地浏览phpDoc注释。一个小的正则表达式可以找到任何@route
,并注册到该方法中。
使用PHP 5.3,您可以使用closures
这里是一种可能适合您的方法。每个包含路由的类都必须实现一个接口,然后在所有实现该接口的已定义类中循环以收集路由列表。接口包含单个方法,该方法期望返回UrlRoute对象的数组。然后使用您现有的URL路由类进行注册。
我将使用接口和单例类的组合来动态注册路由。
您可以最靠近函数定义(IMHO)的路径就在类定义之前。所以你有
有一个建议,但被拒绝。在此处查看RFC:Attributes RFC at php.net我对这种愿望的解决方案是这样的: