Route::post("/{user}/{char_name}", array(
'as' => 'char-profile-post',
'uses' => 'ProfileController@postDropDownList'));
Route::get("/{user}/{char_name}", array(
'as' => 'char-profile-get',
'uses' => 'ProfileController@getDropDownList'));
public function postDropDownList($user, $char_name) {
$user = Auth::user();
$char_name = Input::get('choose');
$char_name_obj = User::find($user->id)->characters()->where('char_name', '=', $char_name)->first();
return Redirect::route('char-profile-get', array(Session::get('theuser'), $char_name_obj->char_name));
}
public function getDropDownList($user, $char_name) {
return View::make('layout.profile')
->with('char_name', $char_name);
}
<form action="{{ URL::route('char-profile-post') }}" method="post">
<select name="choose">
<option value="choose">Choose a character</option>
@foreach($char_name as $c)
<option> {{ $c->char_name }} </option>
@endforeach
</select>
<input type="submit" value="Ok">
{{ Form::token() }}
</form>
ErrorException
未定义的变量:char_name
(查看:C:\ wamp \ www \ CaughtMiddle \ tutorial \ app \ views \ layout \ profile.blade.php)
编写以下内容时,我仍然收到此错误。
<option> {{ $char_name['char_name'] }} </option>
我的问题非常明显。我做错了什么,或者Laravel真的无法从控制器向视图发送几个变量?
答案 0 :(得分:0)
Laravel绝对可以向视图发送多个变量,这里有一些代码显示我是如何在我的项目中执行的:
路线:
Route::get('play/{id}', array('before' => 'loggedin', 'uses' => 'GameController@confirmEntry'));
如您所见,在此路线中,我希望将变量id
传递给我的控制器。
控制器:
public function confirmEntry($id){
//stuff that doesn't matter
$data = array('puzzle' => $puzzle,
'user' => $user,
'wallet' => $wallet);
return View::make('game.solver-confirm', $data);
}
在上面的示例中,由于我将$id
列为参数,并且我的路线中有id
,因此$id
将设置为路线中的任何内容。例如,如果我转到play/56
,则$id
将等于56
。
查看:
@foreach ($puzzle->tile as $tile)
<li>a list gets made here</li>
@endforeach
你可以在控制器中看到我将$puzzle
(以及一些其他变量)传递给视图,然后我就像你在我的视图中所显示的一样调用它们。
与您有关的问题:
我看到的第一个问题是你接受路线中的两个变量,然后覆盖它们。这对我来说没有多大意义:
public function postDropDownList($user, $char_name) {
$user = Auth::user();
$char_name = Input::get('choose');
//more stuff here
}
为什么还要通过$user
和$char_name
来覆盖它们呢?
这让我觉得你遇到的问题是因为你的数据结构很差。我建议您使用var_dump
或print_r
来了解$char_name
实际上是如何构建的。
参考文献:
答案 1 :(得分:0)
好的,这就是我如何部分解决我的问题。
Route::group(array('prefix' => 'user'), function()
{
Route::post('/{user}/{char_name}/selectedok', array(
'as' => 'char-profile-post',
'uses' => 'ProfileController@postDropDownList'));
Route::get('/{user}/{char_name}/selectedok', array(
'as' => 'char-profile-get',
'uses' => 'ProfileController@getDropDownList'));
});
public function getDropDownList() {
return View::make('layout.profile');
}
public function postDropDownList($user, $char_name) {
if (Auth::check())
{
$user = Auth::user();
$selected_char = Input::get('choose');
$char_name = User::find($user->id)->characters()->where('char_name', '=', $selected_char)->first();
return Redirect::route('char-profile-get', array($user->username, $char_name->char_dynasty, $char_name->char_name))
->with('user', $user->username)
->with('charname', $char_name->char_name)
->with('dynastyname', $char_name->char_dynasty);
}
}
是的我知道我重定向到'char-profile-get'有3个参数,但我只需要2.它不会打扰我。正如您所观察到的,我使用 - &gt;重定向。我将在视图中打印数据的唯一方法是在视图中执行此操作:
Your chosen character is {{ Session::get('charname') }} {{ Session::get('dynastyname')}}
如果我不覆盖postDropDownList($ user,$ char_name)中的变量,我的网址将如下所示:
http://localhost/CaughtMiddle/tutorial/public/index.php/user/%7Buser%7D/%7Bchar_name%7D/selectedok
而不是:
http://localhost/CaughtMiddle/tutorial/public/index.php/user/SerbanSpire/Spirescu/selectedok?Serban
所以判决结果。函数中的参数将永远不会接收任何数据。我甚至不知道如何描述它们,变量是不存在的,即使我使用正确的数据重定向到get路由。 var_dump($ user)或var_dump($ char_name)不会在浏览器上打印任何内容,dd($ user)dd($ char_name)也不会打印任何内容,也不会打印print_r()。
我的解决方案是否可行?通过使用 - &gt;重定向并在Session中存储数据?因为这个解决方案会让我使用Session :: get()很多!如果我错了,请阻止我。