如何在没有重写引擎的情况下使用 fat free php 框架
howto use fatfree php framework without rewrite engine
我无法为我的项目使用 htaccess,因此干净的 URL 不适用于路由。有没有办法改用查询参数?
例子
myf3project.net/user/show
不可能。相反,我想做这样的事情:
myf3project.net?path=user/show
或
myf3project.net?view=user&action=show
还是有可能的,不幸的是你必须自己构建大部分内容。
非常基本的例子:
<?php
$f3 = require 'lib/base.php';
$f3->route('GET /', function() use($f3) {
switch($f3->get('view')) {
case 'user':
// do something
break;
case 'admin':
// do something
break;
}
});
即使没有 .htaccess,“/”路由也应该有效。
您的意思是 mod_rewrite
不可用?这确实是个问题。但是,您可以拨打 $f3->mock 进行救援。
这是一个简单的例子:
$f3 = require('lib/base.php');
// Homepage
$f3->route('GET /',function($f3){
echo 'This is home. '.
'Click <a href="?path=/contact">here</a> to see the contact form.';
});
// Contact form
$f3->route('GET|POST /contact',function($f3){
echo 'This is the contact form. '.
'Click <a href="?path=/">here</a> to go back home.'.
'<form method="post" action="">'.
'<textarea name="message"></textarea>'.
'<button>Send message</button></form>';
if ($f3->VERB=='POST')
echo 'Submitted message:<br>'.
nl2br($f3->get('POST.message'));
});
// Workaround here: $f3->mock is used instead of $f3->run
$path=$f3->get('GET.path');
if (@$path[0]!=='/')
$path='/';
$f3->mock($f3->VERB.' '.$path,$_POST);
您也可以为此覆盖 $_SERVER['REQUEST_URI']
:
$f3->route('GET /user', function ($f3) { echo "user"; });
$f3->route('GET /user/@action',function($f3,$params){
echo "user->".$params['action'];
});
if ($f3->exists('GET.path',$path))
$f3->URI = $f3->BASE.'/'.$path;
$f3->run();
然后打开
http://myf3project.net?path=user/show
基于,我提出了一个解决方案,可以让您拥有这样的路径:
/index.php/foo/bar
而不是:
/index.php?path=/foo/bar
但您仍然可以使用查询变量(如 /index.php/foo/bar?test=123
)并使用 $_GET['test']
或 $f3->get('GET.test')
:
获取它们
只需将您的 $f3->run();
替换为:
$path=$_SERVER['PATH_INFO'];
if (@$path[0]!=='/')
$path='/';
$f3->mock($f3->VERB.' '.$path.'?'.$_SERVER['QUERY_STRING'],$_POST);
我无法为我的项目使用 htaccess,因此干净的 URL 不适用于路由。有没有办法改用查询参数?
例子
myf3project.net/user/show
不可能。相反,我想做这样的事情:
myf3project.net?path=user/show
或myf3project.net?view=user&action=show
还是有可能的,不幸的是你必须自己构建大部分内容。
非常基本的例子:
<?php
$f3 = require 'lib/base.php';
$f3->route('GET /', function() use($f3) {
switch($f3->get('view')) {
case 'user':
// do something
break;
case 'admin':
// do something
break;
}
});
即使没有 .htaccess,“/”路由也应该有效。
您的意思是 mod_rewrite
不可用?这确实是个问题。但是,您可以拨打 $f3->mock 进行救援。
这是一个简单的例子:
$f3 = require('lib/base.php');
// Homepage
$f3->route('GET /',function($f3){
echo 'This is home. '.
'Click <a href="?path=/contact">here</a> to see the contact form.';
});
// Contact form
$f3->route('GET|POST /contact',function($f3){
echo 'This is the contact form. '.
'Click <a href="?path=/">here</a> to go back home.'.
'<form method="post" action="">'.
'<textarea name="message"></textarea>'.
'<button>Send message</button></form>';
if ($f3->VERB=='POST')
echo 'Submitted message:<br>'.
nl2br($f3->get('POST.message'));
});
// Workaround here: $f3->mock is used instead of $f3->run
$path=$f3->get('GET.path');
if (@$path[0]!=='/')
$path='/';
$f3->mock($f3->VERB.' '.$path,$_POST);
您也可以为此覆盖 $_SERVER['REQUEST_URI']
:
$f3->route('GET /user', function ($f3) { echo "user"; });
$f3->route('GET /user/@action',function($f3,$params){
echo "user->".$params['action'];
});
if ($f3->exists('GET.path',$path))
$f3->URI = $f3->BASE.'/'.$path;
$f3->run();
然后打开
http://myf3project.net?path=user/show
基于
/index.php/foo/bar
而不是:
/index.php?path=/foo/bar
但您仍然可以使用查询变量(如 /index.php/foo/bar?test=123
)并使用 $_GET['test']
或 $f3->get('GET.test')
:
只需将您的 $f3->run();
替换为:
$path=$_SERVER['PATH_INFO'];
if (@$path[0]!=='/')
$path='/';
$f3->mock($f3->VERB.' '.$path.'?'.$_SERVER['QUERY_STRING'],$_POST);