Laravel将变量发送到视图

时间:2014-02-25 22:38:26

标签: laravel controller blade

routes.php文件

    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'));  

ProfileController.php

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);
 }

来自layout.profile的片段视图

 <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真的无法从控制器向视图发送几个变量?

2 个答案:

答案 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_dumpprint_r来了解$char_name实际上是如何构建的。

参考文献:

答案 1 :(得分:0)

好的,这就是我如何部分解决我的问题。

routes.php文件

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'));                 

});

ProfileController.php

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()很多!如果我错了,请阻止我。