我在尝试拉拉维尔5号时遇到了一点小问题。
我在laracasts中学习了整个教程,并试图按照他们在那里所做的同样的方式做每件事,只是我更改了模型、表和控制器的名称。
在某个时候,有些与路由有关的东西::bind()停止了工作,正因为如此,现在当我尝试使用working访问一个路由时,视图就会出现,但是没有数据。
这是我的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中的变量“歌手”,是因为他们在视频中这样做,这样,控制器中的代码就更短了。而且它确实起作用了。然后我就添加了破坏功能,一切都停止了。正如我说过的,我可以看到视图、标签和其他文本,但看不到我传递的数据,除了索引函数,因为我实际上在函数本身中进行了雄辩的搜索。
下面是我的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);因此,概括地说:
编辑
路径
请记住,在每一种情况下,{singers}通配符实际上都是$singer->slug,但是路由::bind()函数不允许我任意调用它。当然,在第一个斜杠出现之前,我的服务器/myproject/public
发布于 2014-10-20 08:17:39
我刚测试过。
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表,其中的字段只有id和slug --只是为了测试(所以我只有这2列),并添加了2条记录:
id slug
1 abc
2 def我创建的视图:
list.blade.php
@foreach ($singers as $s)
{{ $s->slug }}<br />
@endforeachedit.blade.php和show.blade.php (完全相同的代码):
{{ $singer->slug }}
{{ $singer->id }}现在当我跑:
http://testpro/singers我得到的结果是:
def
abc如预期的那样。
当我跑步时:
http://testpro/singers/abc/edit
我得到:
abc 1如预期的那样。
当我跑的时候:
http://testpro/singers/def
我得到:
def 2如预期的那样。
这里一切似乎都很好。确保你用的是我展示的方式,它应该没有任何问题。
发布于 2014-12-04 04:25:01
我很好奇地想知道,当你重新编辑它的时候,你是真的编辑了它,还是使用了原件的副本。我只是做了同样的教程,完全被Jeffrey的魔法所困扰,但是在这里,我特别关注了模型绑定上的API
http://laravel.com/docs/master/routing#route-model-binding
关键点是您的“外卡”必须在活动路径中触发,这样绑定匿名函数才能触发。
在我的例子中,使用原始的名称,我有一个通配符{song},但是更早以后,他将它更改为{song}。不知怎么的,我把我的在歌里留下了,当我重新分配变量的时候,它没有效果。
$song = $this->song->whereSlug($slug)->first();
然而,一旦你做了路由器绑定,它将永远不会捕获,因为你是使用段塞作为你的通配符。
$router->get('songs/{slug}', 'SongsController@show');
所以当你把那个坏男孩绑到Route::bind('song', function($slug) //The first literal "slug" MUST be a literal { //in the route we are searching!!! return \App\Song::whereSlug($slug)->first(); });上时,它就失败了,因为我的通配符过滤器从来没有匹配过,但是把那首歌改成弹和魔法!
Route::bind('slug', function($slug) //The first literal "slug" MUST be a literal { //in the route we are searching!!! return \App\Song::whereSlug($slug)->first(); });
所以,我猜你在某个地方输入了一个-O类型,并在你的编辑中修正了它。它很微妙,特别是使用了如此多的文字,而且没有任何代码类型的暗示。但这没什么。我们不可能都是杰弗里方式。因此,如果绑定失败,请先检查一遍。
祝好运。
https://stackoverflow.com/questions/26460171
复制相似问题