在子目录中托管Slim微型网站

时间:2016-03-30 10:21:35

标签: php slim

是否有一种很好的支持方式来定义这样的路线:

$app->get('/', function (Request $request, Response $response) {
});
$app->get('/hello/{name}', function (Request $request, Response $response) {
});

...无论index.php路由文件的位置如何,让它们按预期工作?

E.g。如果DOCUMENT_ROOTC:\Projects\Playgroundhttp://playground.example.com)且我的路由器文件位于C:\Projects\Playground\PHP\Slim\foo\bar\index.phphttp://playground.example.com/PHP/Slim/foo/bar),我希望http://playground.example.com/PHP/Slim/foo/bar/hello/world!匹配{ {1}}。

(属于Slim的每个其他文件都会在其他地方,比方说'/hello/{name}',并且与此问题无关。)

很好并且支持我的意思不是这个:

C:\Libraries\Slim

Slim 3使用nikic/fast-route,但我找不到任何提示。

3 个答案:

答案 0 :(得分:0)

哦,好吧......如果不支持开箱即用,我认为最好不要过多地将其复杂化并将其作为参数:

define('ROUTE_PREFIX', '/PHP/Slim/foo/bar');
$app->get(ROUTE_PREFIX . '/hello/{name}', function (Request $request, Response $response) {
});

毕竟,编写在所有情况下动态计算它的通用代码是一种负担,尤其是负担。当你可以有无数的因素,如符号链接或Apache别名。

参数当然应该与您的其他网站设置一起定义(如果您使用doc,则为src/settings.php;如果您使用Slim Skeleton,则为.env ...无论如何)。

答案 1 :(得分:0)

除了在子目录中创建.htaccess文件之外:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

您需要配置Web服务器或苗条:

解决方案1(配置apache):

在debian 9上,打开以下文件:

/etc/apache2/apache2.conf

打开后,修改

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

进入

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

然后重新启动apache以应用更改:

systemctl restart apache2

解决方案2(配置苗条):

附加:

// Activating routes in a subfolder
$container['environment'] = function () {
    $scriptName = $_SERVER['SCRIPT_NAME'];
    $_SERVER['SCRIPT_NAME'] = dirname(dirname($scriptName)) . '/' . basename($scriptName);
    return new Slim\Http\Environment($_SERVER);
};

请注意,您需要在路由中使用子目录名称,例如/ subdir /(用于家庭)或某些特定路由:/ subdir / auth / signup

答案 2 :(得分:0)

您可以将所有路由嵌套在Slim中的包装器组中,为此,路径模式是根据$_SERVER变量确定的:

$app = Slim\Factory\AppFactory::create();
$app->group(dirname($_SERVER['SCRIPT_NAME']), function($subdirectory) {
    $subdirectory->group('/api/v1', $function($api) {
        // define routes as usual, e.g...
        $api->get('/foo/{foo:[0-9]+}', function($req, $res) {
            // ...
        });
    });
});

通过对$_SERVER['SCRIPT_NAME']变量进行一些预处理,您可以执行其他操作-例如,检测到您的API嵌套在名为API的目录中,并且不将其他API附加到路由模式。 / p>