2015-01-14 2 views
0

Laravel에서 RESTful 라우팅을 사용하려고하는데 다음과 같은 문제가 발생합니다. 내 페이지는 2 개의 드롭 다운과 제출 버튼으로 구성됩니다. 페이지를 처음로드 할 때 Controller의 show() 함수는 두 개의 데이터베이스 쿼리 결과를 두 개의 드롭 다운에 채 웁니다. 각 드롭 다운에서 값을 선택하고 제출 버튼을 누르면 다른 쿼리의 결과를 테이블로 표시하고 싶습니다.Laravel 라우팅이 게시물과 함께 작동하지 않습니다.

내 show() 메소드는 드롭 다운이 필요에 따라 채워지기 때문에 작동합니다. 게시물을 처리하기 위해 store() 메소드를 사용했지만 (submit을 클릭 한 후) 빈 페이지를 대신 제공합니다.

경로 :

Route::resource('web_tools', 'WebController'); 

컨트롤러 :

{{Form::open()}} 

{{ Form::select('filt', $Filter) }} 
{{ Form::select('kat', $Kategorie) }} 

{{ Form::Submit('Filter') }} 

...... 

{{Form::close()}} 

내 모델은 3 개 쿼리, 테이블의 드롭 다운 2와 1이 포함되어 내에서 호출되는 :보기는

class WebController extends BaseController { 
     public function show() { 
       $filters = WebToolsPage::QueryFilters(); 
       $category = WebToolsPage::QueryCategory(); 

       return View::make('top_pages.table', 
       ['Filter'=>$filters, 'Category'=>$category]); 
     } 

     public function store() { 
       $filt = Input::get('filt'); 
       $cat = Input::get('cat'); 
       $filters = WebToolsPage::QueryFilters(); 
       $category = WebToolsPage::QueryCategory(); 
       $query = WebToolsPage::QueryTable($filt, $kat); 
       return View::make('top_pages.table', 
       ['Webmasters'=>$query,'Filter'=>$filters, 'Category'=>$category]); 
     } 

     public function index(){} 
     public function create(){} 
} 

두 번째 컨트롤러 메서드입니다. Route :: controller (...)를 사용할 때 모든 것이 완벽하게 작동한다고 언급하고 싶습니다. 컨트롤러에 누락 된 메서드에 대한 오류가 발생 했으므로 방금 전에이 메서드를 정의하고 비워 뒀습니다 (?). 도움을 주시면 대단히 감사하겠습니다.

+0

을'show' 방법의 ID로 사용자를 삭제 표시되는 리소스를 식별하기위한'show ($ id)'매개 변수 만 사용하십시오. – Dencker

답변

0

그래서 POST 후에 폼 :: open() 메서드의 인수에 호출 된 경로 이름과 컨트롤러 메서드 이름을 추가하여 빈 페이지 문제를 해결했습니다. 이처럼

는 :

{{Form::open(['route' => 'web_tools.store'])}} 

{{ Form::select('filt', $Filter) }} 
{{ Form::select('kat', $Kategorie) }} 

{{ Form::Submit('Filter') }} 

...... 

{{Form::close()}} 

지금 내가 표를 참조 할 수 있어요하지만 유일한 문제는 URI 이제 액션 이름을 포함하지 않습니다.

은 내가 원 : 지금

.../web_tools/store 

하지만이 : 어떤 조언과

.../web_tools 

누구를?

0

리소스에 URL에 메서드 이름이 없어야합니다. POST -request를 /web_tools으로 지정하면 store() 메서드가 호출됩니다. GET을 실행하면 index()이 호출됩니다.Laravel documentation의 표를 참조하십시오 Resourceful controllers

는 당신이 편안하고 방법 명명 패턴 대신 컨트롤러로 등록하고 사용 할 것 명명 명시를 원하는 경우 이름

명시 경로 :

에서을 당신의 routes.php :

Route::controller('web_tools', 'WebController'); 

과의

당신의 WebController.php :

,
class WebController extends BaseController { 
     public function getShow() { 
       $filters = WebToolsPage::QueryFilters(); 
       $category = WebToolsPage::QueryCategory(); 

       return View::make('top_pages.table', 
       ['Filter'=>$filters, 'Category'=>$category]); 
     } 

     public function postStore() { 
       $filt = Input::get('filt'); 
       $cat = Input::get('cat'); 
       $filters = WebToolsPage::QueryFilters(); 
       $category = WebToolsPage::QueryCategory(); 
       $query = WebToolsPage::QueryTable($filt, $kat); 
       return View::make('top_pages.table', 
       ['Webmasters'=>$query,'Filter'=>$filters, 'Category'=>$category]); 
     } 

     public function getIndex(){} 
     public function getCreate(){} 
} 

포스트/리디렉션 /는

는 또한, 당신이 정말로 PRG (포스트/리디렉션/가져 오기) 패턴을 따라야 패턴을 가져옵니다. 상점() 메소드에서은, 당신이 실제로하고 싶은 것은 이것이다 : 첫 번째 장소에서 일반

에서

 public function store() { 
       $filt = Input::get('filt'); 
       $cat = Input::get('cat'); 
      //Store whatever you want to store 
       return Redirect::action(self::class."@index"); 
     } 

수완 라우팅, 나는 당신이 수완 컨트롤러 및 라우팅을 오해 생각합니다. 그것들은 리소스 인 (예 : 데이터베이스에 표시되는 것, 사용자, 게시물, 댓글 등)에 사용되므로 store -method는 새 리소스를 실제로 데이터베이스에 저장 (저장)해야합니다. 자원의 사용을하자 :

  • GET/사용자 :index()가 :create() 당신이 자격 증명이를 만드는 입력 폼을 보여줍니다 :
  • GET/사용자가 생성/사용자의 목록을 보여줍니다 새로운 사용자 (/ 사용자 폼 게시물)
  • POST/사용자 :store()는 데이터베이스에 새 사용자를 저장합니다 (그리고 리디렉션 당신은 PRG 패턴을 따르는 경우!)
  • GET/사용자/1 :show(1) : 1의 프로필의 ID로 사용자를 표시
  • GET/사용자/1/편집 :edit(1) : 쇼 당신은/사용자에게 사용자 1의 정보 (양식 게시물을 변경할 수있는 형태/1)
  • PUT/user/1 :update(1) : (Laravel에 숨겨진 필드가있는 POST 요청) 사용자 ID가 1 인 사용자를 업데이트합니다 (f.
  • 삭제/사용자/1destroy(1) (Larvel에 숨겨진 필드와 POST 요청)는 최초로 식별자를 받아 들여야 1

+0

나는 전체적인 수작업 컨트롤러와 잘못된 라우팅에 대해 생각해 봤다. 나는 이것에 대해 아주 새로운 것을 언급하지 못했고, 이것이 나의 첫 laravel 프로젝트이다. 리소스 라우팅 대신 컨트롤러 라우팅을 사용하면 URL에 메서드 이름을 얻을 수 있습니까? 그리고 내 컨트롤러 방법 모두 DB에서 데이터를 검색하고 있기 때문에 어떤 HTML 동사가 올바른/우수 사례를 사용한다고 말하는가? 첫 번째 메소드 인'show'는 페이지의 초기로드시 호출됩니다.두 번째 메소드'store'는'submit' 버튼을 클릭 한 후에 테이블을 채우는 데 사용됩니다. –

+1

예, 컨트롤러 라우팅을 사용하여 URL에 메소드 이름을 가져옵니다. 나는 당신이 HTTP 동사를 말하는 것을 의미 한 ㄴ다는 것을 짐작한다. 두 가지 이름 인'show'와'store'가 맞습니다. 그러나, 당신이 * update * 또는 * new * 데이터를 삽입하는지에 달려있다.이 경우에, 당신은 (순서대로)'update'와'store'를 사용할 것이다. 필터를 만들고 있다면 get-paramters ('http : //example.com/web_tools? filter = ...')를 사용하여'index'에 GET 요청을하면됩니다. form = 태그에'method = "GET"'을 넣으면 폼이 처리 할 것이다. – Dencker

+0

감사합니다. 그리고 네, HTTP 동사를 의미합니다. 나는'show' 메쏘드로 필터를 만들고 있는데,'store' 메쏘드는 실제로 어떤 데이터도 삽입하지 않습니다. 그냥'show'의 새로운 필터를 가진 DB로부터 데이터를 가져옵니다. 이것은'POST'에있는 변수를 사용할 것이라는 것을 의미합니다. (form :: open (...)) 'form-tag' 내에'method = "GET"'을 포함하면,'store' 메소드는'POST'의 변수를 완전히 무시합니다. –

관련 문제