【问题标题】:Using `__destruct` to implement default routing?使用`__destruct`实现默认路由?
【发布时间】:2016-10-14 14:56:09
【问题描述】:

我正在更新我编写的 PHP 框架。它过去只是使用默认行为进行路由。例如考虑请求转到domain.com/package/controller/method...的情况。

$url = ["package", "controller", "method"];
//Check if package exists...
//Check if controller exists in package...
//Check if method exists in controller...

这一切都很好,而且效果很好。但是,我想为我的路由器添加一些额外的功能。该功能是能够定义自定义路由,并传递一个匿名函数来做任何你想做的事情。

但是,假设请求不匹配任何用户定义的路由,我想使用我现在拥有的默认功能来检查是否还有其他可能的路由。这样我就可以用新框架更新旧项目而不会破坏它们,此外......我只是喜欢这种默认行为,因为大多数时候路由并不那么复杂,定义路由对我来说就像违反 DRY。

问题是我不想将用户定义的路由作为数组传递给对象构造函数。相反,我希望用户将它们作为基础应用程序对象上的方法调用,类似于 laravel 或 express 的处理方式。

问题是我希望在用户定义的路由之前没有检查过之后进行默认路由检查。这个准代码可能会帮助你理解我的意思......

class App
{
  __construct
  {
    //Check Default Routing
  }
  private function get()
  {
    //Get Request
  }
  private function post()
  {
    //Post Request
  }
  private function put()
  {
    //Put Request
  }
  private function delete()
  {
    //Delete Request
  }
}

app::get();

在上述情况下,默认路由将在调用用户定义的路由之前发生。我查看了at the PHP consrtuctor/destructor page 并了解了__destruct。但是,在阅读 this question 之后,我有点不确定这是否可行。

PHP.net 说...

只要没有其他方法,就会调用析构方法 对特定对象的引用,或在关机期间以任何顺序引用 顺序。

该解释的第一部分听起来正是我想要的。 IE。一旦在应用程序对象上调用了所有方法,我们将运行__destruct 函数,该函数将检查用户定义的路由是否有效,如果没有,则检查默认路由系统是否产生任何结果。

问题是我不确定这是否是不好的做法,或者根本行不通。我可以要求一个文件,设置我的控制器,然后从__destruct 中调用该控制器上的方法吗?是否存在会影响这些控制器中的代码的限制?假设以这种方式使用__destruct 时出现问题,我的替代方案是什么,请记住我不喜欢这两种解决方案...

  • 让用户在脚本末尾调用默认路由作为方法。
  • 将路由作为数组传递给构造函数。

【问题讨论】:

    标签: php url-routing destructor


    【解决方案1】:

    我认为您在这里感到困惑。从 PHP 手册中记下这一点

    一旦没有其他对特定对象的引用,或在关闭序列期间以任何顺序调用,将立即调用析构函数。

    换一种说法,调用析构函数有两个原因

    1. 正在对该类进行垃圾收集。换句话说,您已经覆盖或unset 对类实例的所有引用。这意味着你不能再直接调用这个类了
    2. PHP 脚本已结束,线程正在关闭。

    换句话说,班级无事可做。但是在你自己的陈述中你是这么说的

    该解释的第一部分听起来正是我想要的。 IE。一旦在应用程序对象上调用了所有方法,我们将运行 __destruct 函数,该函数将检查用户定义的路由是否有效,如果没有,则检查默认路由是否有效系统产生任何结果。

    这里没有“和”可以使用。这才是重点。其实there's very few places you would use this

    你需要的是分层思考。所以你会有一个控制器层,你可以调用它来检查方法。反过来,该控制器会打开一个新层来检查用户功能。如果失败,该类或方法应该返回一些东西或抛出Exception。如果失败,它可以尝试使用默认方法。这就是您构建程序所需的方式。试图使用析构函数来做到这一点可能只会让人们感到困惑。使数据流显式,而不是隐式(这是魔术方法的作用)。

    【讨论】:

    • 我对如何实现这一点有点困惑。我能想到的唯一方法是让应用程序成为某个更大对象的属性,这对我来说没有多大意义。此外,对象不应该是独立的功能吗?您能否提供某种准代码?如果您不建议将该对象添加为更大对象的属性,那么您的回答似乎只是让我回到我的问题。 “在评估了涉及对象的所有其他方法之后,如何调用方法?”
    • 那么你的程序应该有一个合乎逻辑的步骤。否则你将设置/取消设置对象只是为了弄清楚它们是否会做你想让他们做的事情
    • 我听不懂你的意思。
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多