首先,我是PHP的初学者.并在此处发布了一个问题: 在项目中重构require_once文件 .我尽可能多地阅读有关Front控制器的内容,但无法了解它是如何工作的,甚至无法了解它的全部内容.
有人可以简要解释它是如何工作的以及它的全部内容吗?
谢谢.
我有一个.htaccess文件,其中包含以下内容:
Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ entryPoint.php [QSA]
</IfModule>
Run Code Online (Sandbox Code Playgroud)
有了这个,我希望将所有请求重定向到文件,entryPoint.php
以便它可以检查它们:
如果是.png,那么这是一个"安全"的电话.
在图像的情况下,我曾经输出标题file_get_contents()
及其内容.我发现它比直接读取要慢一些.
entryPoint.php
如果有图片参考,如何防止这个.htaccess调用?
我已经拥有的代码的额外反馈非常感谢!
PHP的内置Web服务器允许使用"路由器脚本",允许在内部重写URL.
这种路由器脚本的问题在于,无论何时它实际处理文件而不是让PHP处理它,都会导致该请求的请求日志输出被抑制.例如,请考虑以下脚本:
<?php
if (preg_match('/^\/(js|css)/', $_SERVER['REQUEST_URI']) === 1) {
return false;
}
else {
echo 'hello world!'
}
Run Code Online (Sandbox Code Playgroud)
这会导致请求/js/*
和/css/*
登录控制台; 而对任何其他URL的请求只是跳过记录请求.
如何启用对控制台的所有请求的记录?
我有一个servlet,用于许多不同的操作,在前端控制器模式中使用.有谁知道是否可以判断回发的数据是否为enctype ="multipart/form-data"?在我决定之前,我无法读取请求参数,因此我无法将请求分派给适当的控制器.
有任何想法吗?
我正在使用Front Controller设计模式构建应用程序,并且只有一个页面index.php
,所有用户请求都通过该页面作为参数传递(与常规设计中的不同页面/控制器相对).
如何将这些参数连接到应用程序逻辑?
例如,我有两种不同的行为:
index.php?action=userLogin&username=admin&password=qwerty //process user login
index.php?action=displayUsersTable //show registered users
Run Code Online (Sandbox Code Playgroud)
目前我有一个array
系统接受的所有操作(以及预期的参数),我将action
URL中的param与key
此数组的比较进行比较,然后检查此操作所需的参数.
//1 = optional, 2=required
$systemActions = [
"userLogin" => [
"login" => 2,
"password" => 2
],
"displayUsersTable" => []
];
Run Code Online (Sandbox Code Playgroud)
显然,随着系统的发展,这将成为一个怪物阵列.
是否有更好的方法将发送到前端控制器的参数绑定到系统操作?
我目前为我的所有网站设计了每个页面的文件,然后包含常见元素,如页眉,页脚等.但是,我注意到许多框架和CMS使用Front Controller模式.
使用前端控制器有哪些优缺点?该模式是否仅仅用在框架和CMS中,因为不知道哪个页面将存在于最终系统中?
例如,我有类文章与方法getTitle ()
和getContent ()
.
我也有使用方法的ArticlesService getAllArticles ()
.如何创建具有有意义名称的链接列表(由...组成#{article.title}
)?喜欢:
http://mysiteaddress.com/article/first-article-title
http://mysiteaddress.com/article/how-to-make-links-in-jsf
Run Code Online (Sandbox Code Playgroud)
..或类似的东西.
我可以创建具有所有必要功能的链接<h:commandLink>
,但我不知道如何为它制作好的'href':它总是有href'#'.
我可以创建很好的链接,<h:outputLink>
但我不知道如何添加必要的功能.
在jsp中,我创建了自己的前端控制器,它从请求中解析了URL,然后执行重定向到对应的jsp-page.
如何在JSF中实现相同的功能?
我正在考虑在我的J2EE应用程序中实现Front Controller.您能否提供相同的链接(包含源代码示例)和任何标准?
最好的祝福
我有关于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实例的可能性是一种"不好的做法"吗?我会写文档并与其他类交付容器,但我仍然想知道我是否应该防止奇怪的用途.
我正在将我的服务器从Apache迁移到Nginx并拥有这个非常简单的.htaccess
规则:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
Run Code Online (Sandbox Code Playgroud)
它背后的想法是将每个请求指向前端控制器(index.php
).我正在尝试用Nginx做同样的事情.我使用在线转换器来制作这个Nginx位置块:
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php break;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我将它添加到我的网站的配置时,Nginx只是下载PHP文件的源代码.作为参考,这是整个配置文件:
我知道PHP的工作原理,好像我删除了位置块并使文件<?php phpinfo();
正常工作.
任何帮助,将不胜感激.
front-controller ×10
php ×5
.htaccess ×2
jsp ×2
servlets ×2
apache ×1
friendly-url ×1
java ×1
java-ee ×1
jsf ×1
nginx ×1
redirect ×1
regex ×1
url-routing ×1