我在尝试 Laravel 5 时遇到了一些问题。
我按照 laracasts 中的整个教程进行操作,并尝试以与他们在那里相同的方式完成所有操作,只是我更改了模型、表和控制器的名称。
在某些时候,Route::bind() 的某些内容停止工作,因此,现在当我尝试使用通配符访问路线时,视图将会出现,但没有数据。
这是我的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中绑定变量“singers”的原因是因为他们在视频中这样做,这样控制器中的代码就更短了。它确实有效。然后我只是添加了 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);
回顾一下:
编辑
路径
请记住,{singers} 通配符在每种情况下实际上都是 $singer->slug,但 Route::bind() 函数不允许我随意调用它。 当然,在第一个斜杠之前是 myserver/myproject/public
我刚刚测试过。
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 />
@endforeach
edit.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
正如预期的那样。
这里一切似乎都运行良好。确保您按照我展示的方式使用它,并且它应该可以正常工作
我很想知道当你将其编辑回来时,你是否真的编辑了它或使用了原始版本的副本。我刚刚做了同样的教程,完全被 Jeffrey 的魔法难住了,但是在这里专门查看了模型绑定的 API
http://laravel.com/docs/master/routing#route-model-binding
关键点是必须在活动路由中触发“通配符”才能触发绑定匿名函数。
就我而言,使用最初的命名法时,我有一个通配符 {slug},但后来他将其更改为 {song}。不知何故,我把我的留在了歌曲中,当我重新分配变量时这没有任何效果。
$song = $this->song->whereSlug($slug)->first();
但是,一旦你进行了路由器绑定,它就永远不会捕获,因为你使用 slug 作为通配符。
$song = $this->song->whereSlug($slug)->first();
所以当你把那个坏男孩绑在
$router->get('songs/{slug}', 'SongsController@show');
它失败了,因为我的通配符过滤器从未匹配,但是将那首歌更改为 slug and magic!
$router->get('songs/{slug}', 'SongsController@show');
所以,我的猜测是你在某个地方有一个 O 型并在编辑中更正了它。它很微妙,尤其是使用如此多的文字,并且没有代码类型提示。但没关系。我们不可能都是杰弗里·威。因此,如果您的绑定失败,请首先仔细检查。
祝你好运。