当前位置: 首页 > 知识库问答 >
问题:

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

盖弘毅
2023-03-14

我在试拉威尔5时遇到了点小问题。

我遵循了laracasts中的整个教程,并尝试以与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中绑定变量“singers”的原因。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);

所以总结一下:

  • 索引-

编辑

路径

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

请记住,{Singers}通配符实际上是$Singer-

共有2个答案

夏侯鹏
2023-03-14

我很好奇,想知道当你重新编辑它的时候,你是真的编辑了它还是使用了原作的副本。我只是做了同样的教程,完全被Jeffrey的魔术难倒了,但是在这里看一下专门关于模型绑定的API

http://laravel.com/docs/master/routing#route-模型绑定

关键点是,必须在活动路由中触发“通配符”,才能启动绑定匿名函数。

在我的例子中,使用原始的命名,我有一个{slg}的通配符,但是他在之前和之后都将其更改为{Song}。不知何故,我把我的留在了宋,当我重新分配变量时,这没有任何影响。

$歌=$this-

但是,一旦您执行路由器绑定,它将永远不会捕获,因为您正在使用slug作为通配符。

$router-

所以当你把那个坏小子绑定到路由::bind('song',function($slug)//第一个字面值“slug”必须是一个字面值{//在我们正在搜索的路由中!!!return\App\song::whereSlug($slug)-

Route::bind('slg',函数($slg)//第一个文字段的slg必须是我们正在搜索的路由中的文字段{//!!返回\App\歌曲::其中Slug($slg)-

所以,我猜你有一个O型的地方,并更正了它在您的编辑。这很微妙,特别是使用了这么多的文字,并且没有代码类型暗示。但是没关系。我们不可能都是杰弗里。因此,如果绑定失败,请先仔细检查。

祝你好运

暴绪
2023-03-14

我刚刚测试过了。

歌手模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Singer extends Model {

}

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

路由中。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——只是为了测试(所以我只有这两列),并添加了两条记录:

id slug
1  abc
2  def

我创建的视图:

list.blade.php

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

编辑。刀身php显示。刀身php(完全相同的代码):

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

现在当我跑步时:

超文本传输协议://testpro/Singers

def
abc

正如所料。

当我跑步时:

超文本传输协议

我得到:

abc 1

正如所料。

当我跑步时:

http://testpro/singers/def

我得到:

def 2

正如预期的那样。

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

 类似资料:
  •  创造不息,交付不止 Introduction A quick reference guide (cheat sheet) for Laravel 5.1 LTS, listing artisan, composer, routes and other useful bits of information. We intend to build this Cheat Sheet more asse

  • Laravel 5 Bundles-Modules Bundles-Modules 是一个把应用分成多个包,一个包分成若干个小模块。 这是 laravel5 框架的 bundle 包系统,每个 bundle 都 module 模块化,模块与模块之前互不影响,全新开发目录,适合团队开发,松耦合,可以抛弃自带的 APP 目录了,使用全新的开发目录结构/,使开发变得更简单。 开发目录结构: bundle

  • Laravel 5.3 Angular Material Starter Demo An online demo is available. Angular (2+) update While this starter used to be an excellent starting point for Laravel 5 & Angular 1.x, using Angular 1.x resu

  • 描述 (Description) 它为路由器提供路由,并使用slash后跟colons和参数名称附加路由器的参数。 语法 (Syntax) router.route(route, name, [callback]) 参数 (Parameters) route - 它可以是路由字符串或正则表达式。 name - 它是路由器参数的名称。 callback - 如果省略回调参数,则为路由器的名称。 例

  • Route::get('foo', function(){}); Route::get('foo', 'ControllerName@function'); Route::controller('foo', 'FooController'); 资源路由 Route::resource('posts','PostsController'); // 资源路由器只允许指定动作通过 Route::res

  • 目的 部署应用到 OCP,并创建安全加密路由。 环境 openshift v3.11.16/kubernetes v1.11.0 步骤 创建工程1. CLI 登录到 OCP $ oc login https://master.example.com:8443 -u admin -p admin2. 创建工程 $ oc new-project lab02 部署应用1. S2I 部署 php 应用 $