我知道有人问过类似的问题,但我一直在互联网上搜索,似乎找不到我想要的确切内容。
最常见的答案是将其放入控制器中。我喜欢stackoverflow的一个特殊解决方案,它有一个SessionController
和NonSessionController
,都扩展了主控制器,但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框架,并思考了如何解决这个问题。我还没有真正实现代码,所以在这一点上,它更像是一个可行的理论。:(
-
有一个控制器基类。那个类有一个我们称之为
$components
的属性。让我们把它做成一个数组,它可以为你想在很多控制器中做的事情保存类的名称,但并不真正属于控制器本身。 -
由于在调用请求的操作之前我使用的是Front Controller设计模式,因此我将收集$components数组,并为每个条目加载适当的类文件。
-
在加载每个
$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
}
}