如何使用Klein.php提供静态文件

时间:2014-06-14 17:32:58

标签: php routing klein-mvc

我尝试使用/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

2 个答案:

答案 0 :(得分:2)

试试这个:

$klein->respond('/web/[*]', function($request, $response, $service, $app) {
    return $response->file(__DIR__ . $request->pathname());
});

看起来file()是Response的一种方法,而不是ServiceProvider:

https://github.com/chriso/klein.php/blob/737e7268f5c3fdc6d6f1371cb2ee0264892e8540/src/Klein/Response.php#L85

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