Laravel 5的Route :: bind()的问题

时间:2014-10-20 07:10:13

标签: laravel model-binding blade laravel-routing laravel-5

我在尝试Laravel 5时遇到一些问题。

我在laracasts中按照整个教程进行操作,并尝试按照与此相同的方式执行所有操作,只更改了模型,表格和控制器的名称。

在某些时候,使用Route :: bind()的东西停止工作,因此,现在当我尝试使用Wild Card访问路由时,视图将会出现,但没有数据。

这是我的 routes.php

Route::bind('singers', function($slug, $route){
return App\Singer::whereSlug($slug)->first();
});

Route::resource('singers', 'SingerController', [
                                            'names' => [
                                                    'index' => 'singers_index',
                                                    'show' => 'singers_show',
                                                    'edit' => 'singers_edit',
                                                    'update' => 'singers_update',
                                                    'create' => 'singers_create',
                                                    'store' => 'singers_store',
                                                    'destroy' => 'singers_destroy',
                                                        ],
                                                ]);

这些是我的 SingerController

的一些片段
namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\CreateSingerRequest;
use App\Singer;

class SingerController extends Controller {

    public $restful = true;

    public function __construct(Singer $singer){
        $this->singer = $singer;
    }

    public function index()
    {
        $singers = $this->singer->orderBy('id', 'DESC')->get();
        return view('singers.list',compact('singers'));
    }

    public function show(Singer $singer){
        return view('singers.show', compact('singer'));
    }

    public function edit(Singer $singer){
        return view('singers.edit', compact('singer'));
    }

    public function update(Singer $singer, Request $request){
        $singer->fill($request->input());
        $singer->save();
        return view('singers.show', compact('singer'));
    }

    public function create(){
        return view('singers.new');
    }

    public function store(Singer $singer, CreateSingerRequest $request){
        $singer->create($request->all());
        return redirect()->route('singers_index');
    }

    public function destroy(Singer $singer){
        $singer->delete();
        return redirect()->route('singers_index');
    }
}

现在。我试图绑定变量'歌手'在routes.php中,是因为他们在视频中这样做,这样,Controller中的代码就更短了。它实际上正在工作。然后我刚刚添加了destroy函数,它都停止了工作。 正如我所说,我可以看到它们中的视图,标签和任何其他文本,但不能看到我传递的数据,除了索引函数,因为我实际上在函数本身进行了Eloquent搜索。

现在这里是我的show.blade.php的片段

<b>Full Name: </b> {{ $singer->name.' '.$singer->lastname }}
<br>
<b>Age: </b> {{ $singer->age }}
<br>
<b>Country: </b> {{ $singer->country }}
<br>
<br>
<p>
    <b>Bio: </b> {!! nl2br($singer->bio) !!}
</p>

{!! HTML::linkRoute('singers_edit', 'Update', [$singer->slug], ['class' => 'btn btn-primary']) !!}

{!! Form::open(['method'=>'DELETE', 'route'=>['singers_destroy', $singer->slug]]) !!}
    <div class="form-group">
        {!! Form::submit('Delete', ['class'=>'btn btn-danger']) !!}
    </div>
{!! Form::close() !!}

我的索引视图工作正常,其他视图只是表单,但我传递变量的任何视图都不起作用,无论我是通过这样做传递它:

return view('singers.show',compact('singer'));

或者这个:

return view('singers.show')->with('singer',$singer);

所以回顾一下:

  • index - &gt;细。
  • show - &gt;没有显示任何数据。
  • 创建 - &gt;实际上有效并保存了新记录。
  • 编辑 - &gt;错误出现是因为通配符未发送到 控制器。

修改

路径

  • 索引(GET):/ singers
  • 显示(GET):/ singers / {singers}
  • 创建(获取):/ singers / create
  • 商店(POST):/ singers
  • 编辑(获取):/ singers / {singers} / edit
  • 更新(PATCH):/ singers / {singers}
  • 销毁(删除):/ singers / {singers}

请记住,{singers}通配符在每种情况下实际上都是$ singer-&gt; slug,但是Route :: bind()函数不允许我随意调用它。 当然,在第一个斜杠来到myserver / myproject / public

之前

2 个答案:

答案 0 :(得分:1)

我刚试过它。

Singer型号:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Singer extends Model {

}

SingerController - 您提供的确切代码(此文件当然位于app\Http\Controllers路径中。

routes.php

Route::bind('singers', function($slug, $route){
   return App\Singer::whereSlug($slug)->first();
});

Route::resource('singers', 'App\Http\Controllers\SingerController', [
    'names' => [
        'index' => 'singers_index',
        'show' => 'singers_show',
        'edit' => 'singers_edit',
        'update' => 'singers_update',
        'create' => 'singers_create',
        'store' => 'singers_store',
        'destroy' => 'singers_destroy',
    ],
]);

如您所见,我在这里添加了完整的命名空间路径:'App\Http\Controllers\SingerController'而不仅仅是SingerController

我创建了简单的Singer表,其中的字段只有idslug - 仅用于测试(所以我只有那两列)并添加了2条记录:

id slug
1  abc
2  def

我创建的观点:

list.blade.php

@foreach ($singers as $s)
{{ $s->slug }}<br />
@endforeach

edit.blade.phpshow.blade.php(完全相同的代码):

{{ $singer->slug }}
{{ $singer->id }}

现在我跑的时候:

http://testpro/singers我得到了结果:

def
abc

正如所料。

当我跑步时:

http://testpro/singers/abc/edit

我明白了:

abc 1

正如所料。

当我跑步时:

http://testpro/singers/def

我明白了:

def 2

正如所料。

这里的一切似乎都很好。确保你按照我展示的方式使用它,它应该没有任何问题

答案 1 :(得分:0)

我很高兴看到你知道当你编辑它时是否实际编辑它或使用原版的副本。我刚刚做了同样的教程,并且完全被Jeffrey's Magic难倒,但是在这里看模型绑定的API

http://laravel.com/docs/master/routing#route-model-binding

关键点是你的“外卡”必须在激活绑定匿名函数的活动路径中触发。

在我的情况下,使用原始的nominclature我有一个{slug}的通配符,但是早些时候和之后他将它改为{song}。不知何故,我在歌曲中离开了我,这在重新分配变量时没有效果。

$song = $this->song->whereSlug($slug)->first();

但是,一旦你执行了路由器绑定,它就永远不会被捕获,因为你使用了slug作为你的通配符。

$song = $this->song->whereSlug($slug)->first();

所以当你把那个坏男孩绑在一起的时候 $router->get('songs/{slug}', 'SongsController@show'); 它失败了,因为我的通配符过滤器永远不会匹配,但是将该歌曲改为slug和magic!

$router->get('songs/{slug}', 'SongsController@show');

所以,我的猜测是你在某个地方有一个类型-O并在你的编辑中纠正它。它很微妙,特别是使用了这么多的文字,没有代码类型暗示那里。但那没关系。我们不可能都是Jeffrey Way。因此,如果绑定失败,请先检查一下。

祝你好运。