目标:在“normal ..?param = style”和“/ param / style”中使用子域作为参数和无限数量的GET参数。
当前“web.php”
Route::group(array('domain' => "{bucketIdentifier}.$domainToUse"), function () {
Route::get('/{bucketIdentifier?}', 'BucketController@receive');
Route::post('/{bucketIdentifier?}', 'BucketController@receive');
Route::put('/{bucketIdentifier?}', 'BucketController@receive');
Route::delete('/{bucketIdentifier?}', 'BucketController@receive');
Route::patch('/{bucketIdentifier?}', 'BucketController@receive');
});
如果您向xyz.mydomain.com发送请求,我会获取bucketIdentifier来查询数据库。按设计工作。
如果您发送带有“?myparam = 12& other = 42”的GET请求,我可以获得Param,其工作方式与设计类似。
但我怎么能用“/ myparam / 12 / other / 42”进行路由。通过此设置,我将获得404作为响应。
其他aporoach(不起作用)
Route::group(array('domain' => "{bucketIdentifier}.$domainToUse"), function () {
Route::get('/{query}', 'BucketController@receive')->where('query','.+');
Route::post('/{query}', 'BucketController@receive')->where('query','.+');
Route::put('/{query}', 'BucketController@receive')->where('query','.+');
Route::delete('/{query}', 'BucketController@receive')->where('query','.+');
Route::patch('/{query}', 'BucketController@receive')->where('query','.+');
});
现在我有了bucketIdentifier als“query”参数(;
答案 0 :(得分:1)
您可以使用fallback
路由方法,它可以作为一个包罗万象的功能。这种方法是新方法,因此没有记录,但您可以找到Pull Request here。
Route::group(array('domain' => "{bucketIdentifier}.$domainToUse"), function () {
Route::fallback('BucketController@receive');
});
fallback
路线将匹配组中尚未匹配的任何内容。
答案 1 :(得分:1)
最简单的方法是获取遵循这样的路线的所有参数:
// Grab all routes and following routes that start with "infiniteParams"
Route::any('infiniteParams/{all}', function($page){
// Create an array separating them with "/"
$params = explode('/', $page);
// Formatted parameters array
$params_array = [];
// Take the first parameter as the key and the second as the value.
for($i = 0; $i < count($params); $i+=2) {
$params_array[$params[$i]] = @$params[$i+1];
}
var_dump($params_array);
})->where('all', '.*');
这会将infiniteParams/myparam/12/other/42
转换为像这样的数组
$params_array = [
"myparam" => 12,
"other" => 42
]
PD:
我不知道这是否完全回答了你的问题,但至少可以让你了解如何做到这一点。
答案 2 :(得分:1)
以下是您可以使用的服务提供商:
它将路径与查询合并,例如:
/foo/bar/hello/world?sen=pai
$request->get('foo')
$request->get('hello')
$request->get('sen')
注意:强>
当前代码将影响所有路由,但不会在控制台中激活。
从您问题中的路线我是“假设”那些是唯一的路线,但如果不是,您应该/可以为此代码添加路径白名单/黑名单。
(如果是这样的话,我对此有所了解,请在评论中告诉我你是否想要一个例子)
class PathServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
if (!$this->app->runningInConsole()) {
$request = resolve(Request::class);
foreach ($this->path($request) as $key => $value) {
$request->query->set($key, $value);
}
}
}
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Yield key values derived from the path,
* if the last has no value it is skipped.
*
* @param Request $request
* @return Generator
*/
protected function path(Request $request): Generator {
$path = explode('/', $request->decodedPath());
$i = 0;
while (count($path) - $i >= 2) {
yield $path[$i++] => $path[$i++];
}
}
}