【问题标题】:How To Pass GET Parameters To Laravel From With GET Method ?如何使用 GET 方法将 GET 参数传递给 Laravel?
【发布时间】:2015-02-02 14:13:00
【问题描述】:

我被困在这个非常基本的表单上,我无法完成,我想用一个文本输入和两个选择控件构建一个搜索表单,一个接受 3 个参数的路由,当我提交表单,它用问号映射参数,而不是 Laravel 方式,

标记

{{ Form::open(['route' => 'search', 'method' => 'GET'])}}
    <input type="text" name="term"/>
    <select name="category" id="">
        <option value="auto">Auto</option>
        <option value="moto">Moto</option>
    </select>
    {{ Form::submit('Send') }}
{{ Form::close() }}

路线

    Route::get('/search/{category}/{term}', ['as' => 'search', 'uses' => 'SearchController@search']);

当我提交表单时,它会将我重定向到

search/%7Bcategory%7D/%7Bterm%7D?term=asdasd&category=auto

如何使用 Laravel 方式将这些参数传递给我的路线,而无需 Javascript! :D

【问题讨论】:

    标签: php forms laravel


    【解决方案1】:

    路由器

    Route::get('search/{id}', ['as' => 'search', 'uses' => 'SearchController@search']);
    

    控制器

    class SearchController extends BaseController {
    
        public function search(Request $request){
    
            $id= $request->id ; // or any params
    
            ...
        }
    }
    

    【讨论】:

      【解决方案2】:

      我也在为此苦苦挣扎,终于让它工作了。

      routes.php

      Route::get('people', 'PeopleController@index');
      Route::get('people/{lastName}', 'PeopleController@show');
      Route::get('people/{lastName}/{firstName}', 'PeopleController@show');
      Route::post('people', 'PeopleController@processForm');
      

      PeopleController.php

      namespace App\Http\Controllers ;
      use DB ;
      use Illuminate\Http\Request ;
      use App\Http\Requests ;
      use Illuminate\Support\Facades\Input;
      use Illuminate\Support\Facades\Redirect;
      
          public function processForm() {
              $lastName  = Input::get('lastName') ;
              $firstName = Input::get('firstName') ;
              return Redirect::to('people/'.$lastName.'/'.$firstName) ;
          }
          public function show($lastName,$firstName) {
              $qry = 'SELECT * FROM tableFoo WHERE LastName LIKE "'.$lastName.'" AND GivenNames LIKE "'.$firstName.'%" ' ;
              $ppl = DB::select($qry);
              return view('people.show', ['ppl' => $ppl] ) ;
          }
      

      人/show.blade.php

      <form method="post" action="/people">
          <input type="text" name="firstName" placeholder="First name">
          <input type="text" name="lastName" placeholder="Last name">
          <input type="hidden" name="_token" value="{{ csrf_token() }}">
          <input type="submit" value="Search">
      </form>
      

      注意事项:
      我需要将两个输入字段传递到 URI。
      我还没有使用 Eloquent,如果你是,请相应地调整数据库逻辑。
      而且我还没有完成保护用户输入数据的工作,所以请冷静一下。
      注意“_token”隐藏表单字段和所有“使用”包括,它们是必需的。

      PS:这是另一种似乎有效的语法,并且不需要

      use Illuminate\Support\Facades\Input;
      

      .

      public function processForm(Request $request) {
          $lastName  = addslashes($request->lastName) ;
          $firstName = addslashes($request->firstName) ;
          //add more logic to validate and secure user entered data before turning it loose in a query
          return Redirect::to('people/'.$lastName.'/'.$firstName) ;
      }
      

      【讨论】:

      【解决方案3】:

      msturdy's solution 的替代方法是使用您可用的request helper method

      这以完全相同的方式工作,无需在控制器顶部导入 Input 命名空间 use Illuminate\Support\Facades\Input

      例如:

      class SearchController extends BaseController {
      
          public function search()
          {
              $category = request('category', 'default');
              $term = request('term'); // no default defined
      
              ...
          }
      }
      

      【讨论】:

        【解决方案4】:

        或者,如果您想在动作签名中指定预期参数,但将它们作为任意GET 参数传递。使用过滤器,例如:

        创建不带参数的路由:

        $Route::get('/history', ['uses'=>'ExampleController@history']);
        

        用两个参数指定动作并附加过滤器:

        class ExampleController extends BaseController
        {
            public function __construct($browser)
            {
                $this->beforeFilter('filterDates', array(
                    'only' => array('history')
                ));
            }
        
            public function history($fromDate, $toDate)
            {
                /* ... */
            }
        
        }
        

        GET 转换为动作参数的过滤器:

        Route::filter('filterDates', function($route, Request $request) {
            $notSpecified = '_';
        
            $fromDate = $request->get('fromDate', $notSpecified);
            $toDate = $request->get('toDate', $notSpecified);
        
            $route->setParameter('fromDate', $fromDate);
            $route->setParameter('toDate', $toDate);
        });
        

        【讨论】:

          【解决方案5】:

          我有同样的问题。我需要显示搜索引擎的网址

          我使用这样的两条路线

          Route::get('buscar/{nom}', 'FrontController@buscarPrd');
          
          Route::post('buscar', function(){
          
             $bsqd = Input::get('nom');    
          
             return Redirect::action('FrontController@buscarPrd', array('nom'=>$bsqd));
          
          });
          

          第一个用于显示我们想要的网址

          表单使用第二个并重定向到第一个

          【讨论】:

            【解决方案6】:

            最简单的方法就是接受传入的请求,然后在Controller中取出你想要的变量:

            Route::get('search', ['as' => 'search', 'uses' => 'SearchController@search']);
            

            然后在SearchController@search:

            class SearchController extends BaseController {
            
                public function search()
                {
                    $category = Input::get('category', 'default category');
                    $term = Input::get('term', false);
            
                    // do things with them...
                }
            }
            

            有用的是,您可以set defaults in Input::get() 以防万一您的控制器的操作没有传递任何内容。

            As joe_archer says,没有必要将这些术语放入 URL,作为 POST 可能会更好(在这种情况下,您应该更新您对Form::open() 的调用以及您在 routes.php 中的搜索路线 - @ 987654328@保持不变)

            【讨论】:

            • Input总是指定它所属的命名空间
            【解决方案7】:

            所以您是在尝试将搜索词和类别添加到 URL 中?

            我建议不要这样做,因为您将不得不处理多字搜索词等,并且最终可能会因不允许使用的字符而导致各种不愉快。

            我建议发布数据,对其进行清理,然后返回结果页面。

            Laravel 路由并非旨在接受来自表单的 GET 请求,它旨在使用 URL 段作为获取参数,并围绕该理念构建。

            【讨论】:

              猜你喜欢
              • 2018-01-27
              • 2019-03-16
              • 1970-01-01
              • 1970-01-01
              • 2018-12-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-31
              相关资源
              最近更新 更多