坚持使用Laravel Routing

时间:2018-05-11 13:05:03

标签: php laravel

目标:在“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”参数(;

3 个答案:

答案 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++];
        }
    }
}