Застрял с Laravel Routing - PullRequest
0 голосов
/ 11 мая 2018

Цель: использование субдомена в качестве параметра и неограниченное количество параметров GET в "normal ..? Param = style" и "/param/style".

Текущий "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 для запроса к БД.Работает как задумано.

Если вы отправляете запрос GET с "? Myparam = 12 & other = 42", я могу получить Param, работает как задумано.

Но как я могу также использовать "/ myparam/ 12 / другие / 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" (;

)

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Чтобы иметь маршрут, который перехватывает любой путь (включая просто /), вы можете использовать:

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::any('/{any}', 'BucketController@receive')->where('any', '.*');
0 голосов
/ 11 мая 2018

Самый простой способ сделать это - захватить все параметры, следующие по маршруту:

// 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
]
* 1007.* PD:

Я не знаю, отвечает ли это полностью на ваш вопрос, но, по крайней мере, дает вам представление о том, как это сделать.

0 голосов
/ 11 мая 2018

Вот поставщик услуг, которого вы можете использовать:

Объединяет путь с запросом, пример:

/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++];
        }
    }
}
0 голосов
/ 11 мая 2018

Вместо этого вы можете использовать метод маршрутизации fallback, который работает как универсальный. Этот метод является новым, поэтому он не документирован, но вы можете найти Запрос извлечения здесь .

Route::group(array('domain' => "{bucketIdentifier}.$domainToUse"), function () {   
    Route::fallback('BucketController@receive');
});

Маршрут fallback будет соответствовать всему, что еще не было найдено в группе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...