【问题标题】:Limit access to route by parameter value通过参数值限制对路由的访问
【发布时间】:2019-07-22 04:54:19
【问题描述】:

我有如下路线:

Route::group([
    'prefix'    => 'reports'
], function () {
     Route::get('/points/{product_name}', ['uses' => 'MyController@get'])->where('product_name', ['product1', 'product2','product3'])
});

所以我想限制对该端点 id 的访问,产品名称为 product1product2product3。但是使用where 子句,我只能看到使用正则表达式或单个值进行检查。

当我使用['product1', 'product2', 'product3'] 之类的数组时,它会抛出错误"message": "Routing requirement for "product_name" must be a string."

我该如何解决这个问题?

【问题讨论】:

  • implode(',', ['product1', 'product2', 'product3']);
  • 显示你在哪里做的代码和数组。
  • 编辑问题
  • 我认为这个逻辑应该是控制器的一部分,而不是路由

标签: php laravel routing laravel-routing


【解决方案1】:

根据laravel docs,您可以使用路由实例上的 where 方法来限制路由参数的格式。 where 方法接受参数的名称和定义如何约束参数的正则表达式。所以你应该这样做:

$allowedParams = implode('|',['product1','product2','product3']);
// it will return you a string as 'product1|product2|product3'
Route::get('/points/{product_name}', ['uses' => 'MyController@get'])
           ->where('product_name', $allowedParams);

【讨论】:

    【解决方案2】:

    对于 laravel 中的路由,你可以这样使用它:

    where('product_name', 'product1|product2|product3'])

    或数组:

    where('product_name', implode("|", ['product1', 'product2','product3']))

    【讨论】:

      【解决方案3】:

      您可以使用implode(); 发送并使用explode(); 接收

      发送示例:

      $array_send = ['product1', 'product2', 'product3'];
      $imp_send = implode(",", $aray_send);
      // return: product1,product2,produtct3
      

      接收示例:

      $array_receive = explode(',', '$product_name');
      // return again array
      

      【讨论】:

      • 在哪里使用这个?在路由中的where 子句中?
      • @HappyCoder 您可以使用 implode 传递路线,并使用explode 和 get sent 数组准时接收。
      • @HappyCoder 现在我明白了,路由中的 where 只是创建一个约束,传递一个数组并且必须是关联的:例如->where(array('id' => '[0-9]+', 'name' => '[a-z]+'))
      猜你喜欢
      • 2020-01-15
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      相关资源
      最近更新 更多