我有关于php中前端控制器实现的"概念"问题.
我见过的大多数前端控制器是用Singleton实现的,我不是单例模式的忠实粉丝,我创建了一个具有静态属性的Container,它将存储一个前端控制器的单一实例.
使用singleton,我必须将初始化代码放在构造函数(或构造函数调用的方法)中:
$fc = FrontController::getInstance();
Run Code Online (Sandbox Code Playgroud)
使用容器我可以将配置放在FrontController之外,这是我的目标,我仍然有一个简单的方法来检索FrontController.
$fc = Container->getFrontController();
Run Code Online (Sandbox Code Playgroud)
这段代码看起来更干净,我可以得到干净的子类,而不关心父构造函数.
在'bootstrap'时间这是完全相同的事情,但实际上与我之前的实现的区别在于,现在我可以在应用程序的任何地方(在DAO内部或Action内部)创建FrontControllers,因为构造函数不再是私有/受保护的.
我的问题是: 给我的类用户提供在应用程序的任何地方创建FrontController实例的可能性是一种"不好的做法"吗?我会写文档并与其他类交付容器,但我仍然想知道我是否应该防止奇怪的用途.
对于PHP MVC应用程序,index.php文件和前端控制器的作业有什么区别?是前控制器index.php,还是在单独的文件中?我如何将两者分开并让它们一起工作?前端控制器应该是一个类(或者像它自己的实体一样)吗?(如果是这种情况,那么index.php会实例化前端控制器吗?)
我知道他们必须"设置环境",其中包括定义一些常量等,但是什么呢?( - 自动加载器,调试东西等)
我已经看到了这一点:MVC与前端控制器混淆,但这并没有解决index.php前端控制器之间的区别问题.
在我希望到达当前控制器的函数中:
$front = Zend_Controller_Front::getInstance();
Run Code Online (Sandbox Code Playgroud)
这只给出了一个处理程序但不是当前控制器.
我将代码从函数更改为控制器内部.并询问他们的起源是我从getInstance得到的处理程序和这个
var_dump(get_class($front), get_class($this));
Run Code Online (Sandbox Code Playgroud)
我明白了:
string 'Zend_Controller_Front' (length=21)
string 'IndexController' (length=15)
Run Code Online (Sandbox Code Playgroud)
如何才能到达真正启动的前端控制器?
我不能作为参数传递,因为这个函数使用了数万亿次.
我目前正在使用Java开发一些web开发项目,我已经实现了一个前端控制器,该工作是根据路径实例化新控制器.
那么当用户运行时?q = user/login ex.前端控制器应该实现UserController,我正在尝试使用这段代码.
String q = request.getParameter("q");
try {
String[] page = q.split("/");
// Make first char upper, to match class name conventions.
page[0] = (page[0].substring(0, 1).toUpperCase() + page[0].substring(1).toLowerCase()).trim();
Class contDes = Class.forName("dk.elvar.rocks." + page[0]+ "Controller");
Constructor co = contDes.getConstructor();
co.newInstance(request, response, page);
Run Code Online (Sandbox Code Playgroud)
这导致了
java.lang.NoSuchMethodException: dk.elvar.rocks.UserController.<init>()
at java.lang.Class.getConstructor0(Class.java:2706)
at java.lang.Class.getConstructor(Class.java:1657)
at dk.elvar.rocks.FrontController.doGet(FrontController.java:35)
Run Code Online (Sandbox Code Playgroud)
我试着在google上查找它,并且bug,因为在加载对象中声明构造函数,使类公开,已经存在.
UserController的:
public class UserController extends HttpServlet {
private final String USERNAME = "Martin";
private final String PASSWORD = "David";
private static final long serialVersionUID = …Run Code Online (Sandbox Code Playgroud) 在Spring MVC中,Dispatcher servlet用作"前端控制器"来处理所有应用程序请求并适当地路由它们.
是否可以在Rails中使用这种方法,或者是否需要为每种类型的操作编写单独的控制器而不需要"交通警察"(前端控制器)指导流程?
在我的控制器中,我有一个postDispatch来整合我的FlashMessenger消息:
public function postDispatch()
{
$messages = $this->_helper->getHelper ( 'FlashMessenger' )
->getMessages ();
if ( $this->_helper->getHelper ( 'FlashMessenger' )
->hasCurrentMessages () )
{
$messages = array_merge ( $messages, $this->_helper->getHelper ( 'FlashMessenger' )
->getCurrentMessages () );
$this->_helper->getHelper ( 'FlashMessenger' )
->clearCurrentMessages ();
}
$this->view->alert = $messages;
}
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个Controller插件.
更新:我意识到为什么我需要这个 - 我希望在JSON上下文调用时以JSON方式传递我的flash消息.除非将消息添加到View对象,否则我不会收到消息.
我能够将消息放入数组中,但我不知道如何将它们传递给视图:
class Plugin_FlashMessenger extends Zend_Controller_Plugin_Abstract
{
public function postDispatch($request)
{
$flashmessenger = Zend_Controller_Action_HelperBroker::getStaticHelper ( 'FlashMessenger' );
$messages = $flashmessenger->getMessages ();
if ( $flashmessenger->hasCurrentMessages () )
{
$messages = array_merge ( …Run Code Online (Sandbox Code Playgroud) 我正在开发一个基于Martin Fowler(链接)模式的HTTP前端控制器.在我的情况下,控制器具有以下职责: - 解组封装的数据 - 授权请求 - 记录 - 将请求中继/转发到另一台服务器
以下是可能的解决方案: - (同步)IHttpHandler,使用WebClient或HttpWebRequest类转发请求 - (异步)IHttpListener(非IIS解决方案) - (异步)IHttpAsyncHandler
理想的情况是FC可以处理大量并发请求(> 10000 TPS)而不会烧毁CPU.
为了测试解决方案,我创建了一个小型框架,其中有3个客户端发出请求,一个位于中间的前端控制器和两个响应FC传递的请求的服务器.框架基准测试3场景,首先测试具有小有效载荷的快速响应,其次:具有大有效载荷(> 100KB)的快速响应以及最后具有慢响应(> 3秒)和小有效载荷的测试.
使用同步HTTP处理程序进行的最后一次测试,每秒事务数(TPS)降至最低值(<25 TPS).我的猜测是,这是由于处理程序在等待响应时阻塞线程.为了克服这个问题,我开始实现一个异步处理程序(参见下面的代码).问题是,它简单无效.
想到的最后一个(未经测试的)解决方案是使用HttpListener类.猜测这是一个更轻量级的解决方案,具有良好的粒度控制并发性.我已经看过使用JoséF.Romaniello(链接)的RX框架的示例实现.
我的问题是这样,为什么处理程序代码不起作用?,这是最有效的方法吗?或者我应该赞成HttpListener解决方案.
异步HTTP处理程序代码:
public class ForwardRequestHandler : IHttpAsyncHandler
{
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
var uri = GetForwardUriFor(context.Request.Url.PathAndQuery);
var proxy = HttpWebRequest.Create(uri) as HttpWebRequest;
return proxy.BeginGetResponse(new AsyncCallback(EndProcessRequest), new ForwardedRequestContext(context, proxy));
}
public void EndProcessRequest(IAsyncResult result)
{
var proxy = result.AsyncState as ForwardedRequestContext;
proxy.TransferResponse(result);
}
public bool IsReusable …Run Code Online (Sandbox Code Playgroud) 我正在研究一个简单的前端控制器,主要用于学习目的.
我喜欢Symfony的路由方式,在你的地图中有这样的模式:/news/{category}/{id}并将类别和id变量传递给控制器.但我的问题是 - 因为我无法使用RegEx - 我不知道,如何将模式匹配到URI.
我该怎么配?
/news/{category}/{id}
Run Code Online (Sandbox Code Playgroud)
至
/news/tech/5784
Run Code Online (Sandbox Code Playgroud)
我应该允许这样的模式:/news/*- 哪里*匹配一切?或者变量与某些垃圾混合在一起,像这样/news/{category}_ex/14{id}?
获取变量和值并不是问题,但是为匹配编写正则表达式是.
提前谢谢你的帮助
我正在尝试为我的网站创建一个漂亮的网址结构.
我的路由器类只有在url的样式为?something = value时才有效.
我怎么得到它所以它会像:
/something/value
Run Code Online (Sandbox Code Playgroud)
在我的.htaccess中我有:
Options FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(js|txt|gif|jpg|png)$ index.php?$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)
在我的路由器类中,我正在制作:
class init {
function __construct()
{
$URL = substr($_SERVER['REQUEST_URI'], 19) ;
$URLElements = explode('/', $URL) ; // Adjust if needed.
$class = $URLElements[0] ;
$method = $URLElements[1] ;
if(($t = substr_count($URL, '/')) > 1)
{
for($i=2;$i<$t+1;$i++) {
echo $URLElements[$i].'<br />';
}
}
}
Run Code Online (Sandbox Code Playgroud)
感谢杰森,我的.htaccess现在只是:
FallbackResource /t2013/public_html/index.php
Run Code Online (Sandbox Code Playgroud) front-controller ×10
php ×5
.htaccess ×1
.net ×1
apache ×1
c# ×1
dispatcher ×1
ihttphandler ×1
java ×1
match ×1
plugins ×1
uri ×1
url-routing ×1
web ×1
zend-view ×1