在Laravel中将固定变量从路由传递到控制器

sprintcar78a

我正在尝试将变量通过路由传递给控制器​​,但是我有多个路由(类别)通向同一控制器,即

Route::get('/category1/{region}/{suburb?}', 'SearchController@search');
Route::get('/category2/{region}/{suburb?}', 'SearchController@search');

不能将/ category1、2等作为参数/ {category},并且我不想为每个类别都设置单独的控制器功能。

如何将网址的第一部分发送到我的搜索控制器?即category1或category2?

目前的控制器如下:

public function search($region, $suburb = null) { }

谢谢!

爱国者

您可以为{category}参数指定一个掩码,以便它必须符合格式“ category [0-9] +”才能匹配路由。

Route::get('/{category}/{region}/{suburb?}', 'SearchController@search')
    ->where('category', 'category[0-9]+');

现在,您的示例网址(来自注释)www.a.com/var1/var2/var3仅在var1匹配给定类别正则表达式的情况下才匹配路由

可以在此处的路由参数文档中找到更多信息

编辑

是的,这可以与字符串值数组一起使用。这是一个正则表达式,因此您只需要将字符串值数组放入该上下文中即可:

Route::get('/{category}/{region}/{suburb?}', 'SearchController@search')
    ->where('category', 'hairdresser|cooper|fletcher');

或者,如果您在其他位置构建了阵列:

$arr = ['hairdresser', 'cooper', 'fletcher'];

// run each array entry through preg_quote and then glue
// the resulting array together with pipes
Route::get('/{category}/{region}/{suburb?}', 'SearchController@search')
    ->where('category', implode('|', array_map('preg_quote', $arr)));

编辑2(原始请求的解决方案)

您最初的问题是如何将硬编码的类别段传递到控制器中。如果由于某种原因您不希望使用上述解决方案,则可以选择其他两种方法。

选项1:不传递值,仅在控制器中访问请求的段。

public function search($region, $suburb = null) {
    $category = \Request::segment(1);
    dd($category);
}

选项2:使用前置过滤器(L4)或前置中间件(L5)修改路由参数。

过滤器(和中间件)可以访问路由对象,并且可以使用路由对象上的方法来修改路由参数。这些路由参数最终传递到控制器操作中。路线参数存储为关联数组,因此在尝试正确获取订单时必须牢记。

如果使用Laravel 4,则需要一个前置过滤器。定义路由以使用before过滤器,并传递要添加到参数中的硬编码值。

Route::get('/hairdresser/{region}/{suburb?}', ['before' => 'shiftParameter:hairdresser', 'uses' => 'SearchController@search']);
Route::get('/cooper/{region}/{suburb?}', ['before' => 'shiftParameter:cooper', 'uses' => 'SearchController@search']);
Route::get('/fletcher/{region}/{suburb?}', ['before' => 'shiftParameter:fletcher', 'uses' => 'SearchController@search']);

Route::filter('shiftParameter', function ($route, $request, $value) {
    // save off the current route parameters    
    $parameters = $route->parameters();
    // unset the current route parameters
    foreach($parameters as $name => $parameter) {
        $route->forgetParameter($name);
    }

    // union the new parameters and the old parameters
    $parameters = ['customParameter0' => $value] + $parameters;
    // loop through the new set of parameters to add them to the route
    foreach($parameters as $name => $parameter) {
        $route->setParameter($name, $parameter);
    }
});

如果使用Laravel 5,则需要在中间件之前定义一个新的。将新类添加到app / Http / Middleware目录中,并将其注册$routeMiddleware到app / Http / Kernel.php中的变量中。逻辑基本上是相同的,但要经过额外的循环才能将参数传递给中间件。

// the 'parameters' key is a custom key we're using to pass the data to the middleware
Route::get('/hairdresser/{region}/{suburb?}', ['middleware' => 'shiftParameter', 'parameters' => ['hairdresser'], 'uses' => 'SearchController@search']);
Route::get('/cooper/{region}/{suburb?}', ['middleware' => 'shiftParameter', 'parameters' => ['cooper'], 'uses' => 'SearchController@search']);
Route::get('/fletcher/{region}/{suburb?}', ['middleware' => 'shiftParameter', 'parameters' => ['fletcher'], 'uses' => 'SearchController@search']);

// middleware class to go in app/Http/Middleware
// generate with "php artisan make:middleware" statement and copy logic below
class ShiftParameterMiddleware {
    public function handle($request, Closure $next) {
        // get the route from the request
        $route = $request->route();

        // save off the current route parameters
        $parameters = $route->parameters();
        // unset the current route parameters
        foreach ($parameters as $name => $parameter) {
            $route->forgetParameter($name);
        }

        // build the new parameters to shift onto the array
        // from the data passed to the middleware
        $newParameters = [];
        foreach ($this->getParameters($request) as $key => $value) {
            $newParameters['customParameter' . $key] = $value;
        }

        // union the new parameters and the old parameters
        $parameters = $newParameters + $parameters;
        // loop through the new set of parameters to add them to the route
        foreach ($parameters as $name => $parameter) {
            $route->setParameter($name, $parameter);
        }

        return $next($request);
    }

    /**
     * Method to get the data from the custom 'parameters' key added
     * on the route definition.
     */
    protected function getParameters($request) {
        $actions = $request->route()->getAction();
        return $actions['parameters'];
    }
}

现在,随着过滤器(或中间件)的设置和使用,该类别将作为第一个参数传递到控制器方法中。

public function search($category, $region, $suburb = null) {
    dd($category);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将固定变量从路由传递到Laravel中的控制器

来自分类Dev

在Laravel 4中将2个参数从路由传递到控制器

来自分类Dev

Ember - 将变量从路由传递到控制器

来自分类Dev

在angularjs中将变量从控制器传递到html

来自分类Dev

如何在prestashop中将变量从控制器传递到控制器?

来自分类Dev

将变量从控制器传递到模板laravel

来自分类Dev

将变量从控制器传递到视图-Laravel

来自分类Dev

将变量从控制器传递到Laravel中的通知

来自分类Dev

Laravel问题从控制器到邮件传递变量

来自分类Dev

在 ExpressJS 中将参数从路由器传递到控制器

来自分类Dev

在Laravel 5中将数据从控制器传递到刀片时发生未定义的变量错误

来自分类Dev

Laravel路由到控制器动作

来自分类Dev

Laravel HMVC路由到控制器

来自分类Dev

Laravel 动态路由到控制器

来自分类Dev

在变量中将变量从控制器传递到模型时获取Null值

来自分类Dev

在变量中将变量从控制器传递到模型时获取Null值

来自分类Dev

是否可以在Laravel中将路由参数传递给控制器构造函数?

来自分类Dev

如何在获取路由中将默认参数传递给laravel控制器

来自分类Dev

是否可以在Laravel中将路由参数传递给控制器构造函数?

来自分类Dev

Laravel-将值从路由器传递到控制器

来自分类Dev

Rails:如何将全局变量从路由传递到控制器和助手?

来自分类Dev

Zend Framework 2,重定向到路由并将变量传递给新控制器

来自分类Dev

Zend Framework 2,重定向到路由并将变量传递给新控制器

来自分类Dev

Rails:如何将全局变量从路由传递到控制器和助手?

来自分类Dev

如何在视图中将变量的值从视图传递到控制器

来自分类Dev

将正确编码的值从路由传递到控制器(Laravel)的正确方法?

来自分类Dev

Laravel 5从控制器传递值到重定向路由不起作用

来自分类Dev

如何使用Laravel 7.0将值从路由传递到控制器?

来自分类Dev

Laravel - 将参数从 web.php 路由传递到控制器

Related 相关文章

  1. 1

    将固定变量从路由传递到Laravel中的控制器

  2. 2

    在Laravel 4中将2个参数从路由传递到控制器

  3. 3

    Ember - 将变量从路由传递到控制器

  4. 4

    在angularjs中将变量从控制器传递到html

  5. 5

    如何在prestashop中将变量从控制器传递到控制器?

  6. 6

    将变量从控制器传递到模板laravel

  7. 7

    将变量从控制器传递到视图-Laravel

  8. 8

    将变量从控制器传递到Laravel中的通知

  9. 9

    Laravel问题从控制器到邮件传递变量

  10. 10

    在 ExpressJS 中将参数从路由器传递到控制器

  11. 11

    在Laravel 5中将数据从控制器传递到刀片时发生未定义的变量错误

  12. 12

    Laravel路由到控制器动作

  13. 13

    Laravel HMVC路由到控制器

  14. 14

    Laravel 动态路由到控制器

  15. 15

    在变量中将变量从控制器传递到模型时获取Null值

  16. 16

    在变量中将变量从控制器传递到模型时获取Null值

  17. 17

    是否可以在Laravel中将路由参数传递给控制器构造函数?

  18. 18

    如何在获取路由中将默认参数传递给laravel控制器

  19. 19

    是否可以在Laravel中将路由参数传递给控制器构造函数?

  20. 20

    Laravel-将值从路由器传递到控制器

  21. 21

    Rails:如何将全局变量从路由传递到控制器和助手?

  22. 22

    Zend Framework 2,重定向到路由并将变量传递给新控制器

  23. 23

    Zend Framework 2,重定向到路由并将变量传递给新控制器

  24. 24

    Rails:如何将全局变量从路由传递到控制器和助手?

  25. 25

    如何在视图中将变量的值从视图传递到控制器

  26. 26

    将正确编码的值从路由传递到控制器(Laravel)的正确方法?

  27. 27

    Laravel 5从控制器传递值到重定向路由不起作用

  28. 28

    如何使用Laravel 7.0将值从路由传递到控制器?

  29. 29

    Laravel - 将参数从 web.php 路由传递到控制器

热门标签

归档