首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5的路由问题::bind()

Laravel 5的路由问题::bind()
EN

Stack Overflow用户
提问于 2014-10-20 07:10:12
回答 2查看 2.7K关注 0票数 2

我在尝试拉拉维尔5号时遇到了一点小问题。

我在laracasts中学习了整个教程,并试图按照他们在那里所做的同样的方式做每件事,只是我更改了模型、表和控制器的名称。

在某个时候,有些与路由有关的东西::bind()停止了工作,正因为如此,现在当我尝试使用working访问一个路由时,视图就会出现,但是没有数据。

这是我的routes.php

代码语言:javascript
复制
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的一些片段

代码语言:javascript
复制
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片段

代码语言:javascript
复制
<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() !!}

我的索引视图工作得很好,其他视图只是表单,但是我要向其传递变量的任何视图都不能工作,无论是通过这样做传递它:

代码语言:javascript
复制
return view('singers.show',compact('singer'));

或者这个:

代码语言:javascript
复制
return view('singers.show')->with('singer',$singer);

因此,概括地说:

  • 索引->精细。
  • 显示->不会显示任何数据。
  • create ->实际工作,新记录被保存。
  • 出现编辑->错误是因为通配符没有发送到控制器。

编辑

路径

  • 索引(GET):/singers
  • 表演(GET):/歌手/{歌手}
  • 创建(GET):/歌手/创建
  • 商店(POST):/singers
  • 编辑(GET):/歌手/{歌手}/edit
  • 更新(补丁):/歌手/{歌手}
  • 销毁(删除):/歌手/{歌手}

请记住,在每一种情况下,{singers}通配符实际上都是$singer->slug,但是路由::bind()函数不允许我任意调用它。当然,在第一个斜杠出现之前,我的服务器/myproject/public

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-20 08:17:39

我刚测试过。

Singer模型:

代码语言:javascript
复制
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Singer extends Model {

}

SingerController --您提供的确切代码(这个文件当然放在app\Http\Controllers路径中。

routes.php中:

代码语言:javascript
复制
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列),并添加了2条记录:

代码语言:javascript
复制
id slug
1  abc
2  def

我创建的视图:

list.blade.php

代码语言:javascript
复制
@foreach ($singers as $s)
{{ $s->slug }}<br />
@endforeach

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

代码语言:javascript
复制
{{ $singer->slug }}
{{ $singer->id }}

现在当我跑:

http://testpro/singers我得到的结果是:

代码语言:javascript
复制
def
abc

如预期的那样。

当我跑步时:

http://testpro/singers/abc/edit

我得到:

代码语言:javascript
复制
abc 1

如预期的那样。

当我跑的时候:

http://testpro/singers/def

我得到:

代码语言:javascript
复制
def 2

如预期的那样。

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

票数 1
EN

Stack Overflow用户

发布于 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类型,并在你的编辑中修正了它。它很微妙,特别是使用了如此多的文字,而且没有任何代码类型的暗示。但这没什么。我们不可能都是杰弗里方式。因此,如果绑定失败,请先检查一遍。

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26460171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档