模型视图控制器-实现';登录';检查PHP中的MVC


model view controller - Most efficient way to implement a 'logged-in' check with MVC in PHP?

我知道有人问过类似的问题,但我一直在互联网上搜索,似乎找不到我想要的确切内容。

最常见的答案是将其放入控制器中。我喜欢stackoverflow的一个特殊解决方案,它有一个SessionControllerNonSessionController,都扩展了主控制器,但SessionController检查用户是否在调度前登录。

这是否意味着控制器看起来像这样?

class SessionController
{
    ...
    function view()
    {
         //view thread stuff
    }
    function post()
    {
         if loggedin then
         {
              //post thread stuff
         }
    }
{

在这种情况下,看起来NonSessionController是无用的,并且只有当控制器处理的每个操作都是严格针对用户或非用户时,才使用该模型,这与本论坛示例不同。

所以我想我的问题是,当使用MVC时,上面控制器的一般概念是处理登录检查的最有效方法吗?

我认为应该有一个控制器来检查会话和登录,另一个则不检查。

我会把登录检查放在会话控制器的构造函数中,这样每个扩展它的控制器都会检查登录。

会话控制器看起来像

class SessionController
{
    public function __construct()
    {
       if ( ! AuthenticationHelper::isLoggedIn() )
       {
           // User is not logged in
           // Do something, maybe a redirect to login page
       }
    }
}

然后你可以像一样扩展控制器

class HomeController extends SessionController
{
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        print "This page checks login status";
    }
}

我会制作一个组件。如果你正在编写自己的MVC框架,那么看看你是如何实现它的将是一件有趣的事情。

但是,基本上您需要一个类来检查会话状态。但是,如果你把自己绑在扩展一个用于登录的类和一个用于注销的类上,我会觉得你有太多重复的代码。我个人也不认为这很直观。我可能最终会忘记控制器是否应该扩展Session或NotSession。

事实上,我正在编写自己的MVC框架,并思考了如何解决这个问题。我还没有真正实现代码,所以在这一点上,它更像是一个可行的理论。:(

  1. 有一个控制器基类。那个类有一个我们称之为$components的属性。让我们把它做成一个数组,它可以为你想在很多控制器中做的事情保存类的名称,但并不真正属于控制器本身。

  2. 由于在调用请求的操作之前我使用的是Front Controller设计模式,因此我将收集$components数组,并为每个条目加载适当的类文件。

  3. 在加载每个$component文件时,我将动态地将该组件对象添加到控制器属性中。因此,名称为Session的组件可能引用名为SessionComponent的类,并且您可以使用$this->Session->do_something()$this->SessionComponent->do_something() 在控制器中访问它

我有点剽窃了CakePHP的想法。我使用Cake作为我的生产PHP框架,我正在开发的定制框架的很多想法显然都受到了Cake的启发。

对不起,没有英语:

基本控制器

class Controller{

function handleLogin()
{
    if(!Authentication::isLoggedIn())
    {
        //do stuff - redirect to login page?
    }
}
}

someController

class someController extends Controller{

function someAction()
{
    //check login
    $this->handleLogin();
    //do someAction stuff
}
}