Php 被拉威尔的路线困住了
目标:将子域用作参数,并在“normal..?param=style”和“/param/style”中使用不限数量的GET参数 当前的“web.php” 如果您向xyz.mydomain.com发送请求,我将获取bucketIdentifier以查询数据库。按设计工作 如果您发送一个带有“?myparam=12&other=42”的GET请求,我可以获取参数,其工作原理与设计的一样 但我如何也可以使用“/myparam/12/other/42”进行路由。有了这个设置,我将得到404作为响应 其他Aproach(不工作)Php 被拉威尔的路线困住了,php,laravel,Php,Laravel,目标:将子域用作参数,并在“normal..?param=style”和“/param/style”中使用不限数量的GET参数 当前的“web.php” 如果您向xyz.mydomain.com发送请求,我将获取bucketIdentifier以查询数据库。按设计工作 如果您发送一个带有“?myparam=12&other=42”的GET请求,我可以获取参数,其工作原理与设计的一样 但我如何也可以使用“/myparam/12/other/42”进行路由。有了这个设置,我将得到404作为响应 其他
现在我有了bucketIdentifier als“query”参数(;您可以使用
回退
路由方法,它的功能是一应俱全。此方法是新的,因此没有文档记录,但您可以找到
fallback
路由将匹配组中尚未匹配的任何内容。您可以改用fallback
路由方法,它的功能是“一网打尽”。此方法是新的,因此没有文档记录,但您可以找到
回退
路线将匹配组中尚未匹配的任何内容。最简单的方法是获取路线后面的所有参数,如下所示:
// 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', '.*');
PD:
我不知道这是否完全回答了您的问题,但至少给了您如何做的想法。最简单的方法是获取以下路线的所有参数:
// 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', '.*');
PD:
我不知道这是否完全回答了你的问题,但至少让你知道如何做。这里有一个服务提供商,你可以使用: 它将路径与查询合并,例如:
/foo/bar/hello/world?sen=pai
$request->get('foo')
$request->get('hello')
$request->get('sen')
注意:
当前代码将影响所有路由,但不会在控制台中激活
根据您问题中的路径,我“假设”这些是唯一的路径,但如果不是,您应该/可以在代码中添加路径白名单/黑名单
(如果是这样的话,我有一个想法,如果你想举个例子,请在评论中告诉我)
以下是您可以使用的服务提供商: 它将路径与查询合并,例如:
/foo/bar/hello/world?sen=pai
$request->get('foo')
$request->get('hello')
$request->get('sen')
注意:
当前代码将影响所有路由,但不会在控制台中激活
根据您问题中的路径,我“假设”这些是唯一的路径,但如果不是,您应该/可以在代码中添加路径白名单/黑名单
(如果是这样的话,我有一个想法,如果你想举个例子,请在评论中告诉我)
要使路由捕获任何路径(仅包括
/
),您可以使用:
Route::get('/{any}', 'BucketController@receive')->where('any', '.*');
Route::post('/{any}', 'BucketController@receive')->where('any', '.*');
Route::put('/{any}', 'BucketController@receive')->where('any', '.*');
Route::delete('/{any}', 'BucketController@receive')->where('any', '.*');
Route::patch('/{any}', 'BucketController@receive')->where('any', '.*');
或者,由于您将所有方法发送到同一控制器:
(::any
为所有方法注册路由:[get post put patch delete options]
)
要使路由捕获任何路径(仅包括
/
),您可以使用:
Route::get('/{any}', 'BucketController@receive')->where('any', '.*');
Route::post('/{any}', 'BucketController@receive')->where('any', '.*');
Route::put('/{any}', 'BucketController@receive')->where('any', '.*');
Route::delete('/{any}', 'BucketController@receive')->where('any', '.*');
Route::patch('/{any}', 'BucketController@receive')->where('any', '.*');
或者,由于您将所有方法发送到同一控制器:
(::any
为所有方法注册路由:[get post put patch delete options]
)
不在我今天的版本中(:将在更新后进行测试。不在我今天的版本中(:将在更新后进行测试)。
$params_array = [
"myparam" => 12,
"other" => 42
]
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++];
}
}
}
Route::get('/{any}', 'BucketController@receive')->where('any', '.*');
Route::post('/{any}', 'BucketController@receive')->where('any', '.*');
Route::put('/{any}', 'BucketController@receive')->where('any', '.*');
Route::delete('/{any}', 'BucketController@receive')->where('any', '.*');
Route::patch('/{any}', 'BucketController@receive')->where('any', '.*');
Route::any('/{any}', 'BucketController@receive')->where('any', '.*');