我尝试使用/web
像这样在Klein.php
目录中提供静态文件:
$klein->respond('/web/[*]', function($request, $response, $service, $app) {
return $service->file(__DIR__ . $request->pathname());
});
但是在终端上收到此错误
[Sat Jun 14 18:14:25 2014] PHP Fatal error:
Call to undefined method Klein\ServiceProvider::file()
in /home/youssef/Desktop/gestion-stages/front_controller.php on line 50
答案 0 :(得分:2)
试试这个:
$klein->respond('/web/[*]', function($request, $response, $service, $app) {
return $response->file(__DIR__ . $request->pathname());
});
看起来file()是Response的一种方法,而不是ServiceProvider:
Klein是一个很棒的小框架,但我确实发现我必须偶尔深入挖掘资源。从好的方面来说,源代码有很好的评论和干净的代码。这种项目的阅读使你成为一名更好的程序员。
如果您遇到任何问题,主要开发人员通常会很好地回应GitHub上的问题:https://github.com/chriso/klein.php/issues?state=open
我应该注意的最后一件事。如果这是你真正想要做的,而不是一个简化的例子,你可以用Apache mod_rewrite或者Nginx中的等价物来完成同样的事情,并且有更好的性能,因为你是此时不执行任何PHP代码。另一方面,如果您想要做更高级的事情,比如在决定是否提供文件之前检查用户的登录凭证,还是提供文档根目录之外的文件,那么您执行此操作的方式是可能会发现。
我不太擅长编写mod_rewrite规则,但我认为你可以这样做:
RewriteRule ^/web/(.+) /your/desired/path/$1 [R,L]
假设目的地可通过网络访问。参考:http://httpd.apache.org/docs/2.2/rewrite/remapping.html
或者,如果它不可通过网络访问,则看起来您可以设置别名: http://httpd.apache.org/docs/2.2/urlmapping.html#outside
我还没有测试过重写规则,而且我从未搞过别名,但我认为这些都可以解决问题。当然,这一切都假设您正在使用Apache,可以访问Apache配置,或至少.htacces配置,并且您没有比仅仅提供静态文件更宏伟的计划。我还假设你对Apache配置有一定的了解,我知道不是每个人都是。但是,如果它看起来可能有效,请尝试一下。或者随意忽略它。
答案 1 :(得分:2)
我最终在PHP内置服务器上使用了这个简单的代码片段:
<?php
// before creating a Klein inctance
if (preg_match('#^/web/#', $_SERVER["REQUEST_URI"])) {
return false; // serve the requested resource as-is.
}
当然服务器就像这样运行
php -S localhost:8000 -t . front_controller.php