2

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' をバインドしようとする理由は、彼らがビデオでそれを行っているためです。そうすれば、コントローラーのコードが短くなります。そして、それは実際に機能していました。そして、破棄機能を追加しただけで、すべてが機能しなくなりました。前述したように、ビュー、タグ、その他のテキストは表示されますが、関数自体で Eloquent 検索を実際に実行するため、index 関数を除いて、渡すデータは表示されません。

これが私の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);

要約すると:

  • インデックス -> 結構です。
  • 表示 -> データを表示しません。
  • create -> 実際に機能し、新しいレコードが保存されます。
  • edit -> ワイルドカードがコントローラーに送信されないため、エラーが発生します。

編集

パス

  • インデックス (GET) : /singers
  • 表示 (GET) : /singers/{singers}
  • 作成 (GET) : /singers/create
  • ストア (POST) : /singers
  • 編集 (GET) : /singers/{singers}/edit
  • 更新 (パッチ) : /singers/{singers}
  • 破棄 (削除) : /singers/{singers}

{singers} ワイルドカードは実際には $singer->slug ですが、Route::bind() 関数では好きなように呼び出すことができないことに注意してください。そしてもちろん、最初のスラッシュが来る前に myserver/myproject/public

4

2 に答える 2

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つの列しかありません)、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

予想通り。

ここではすべてうまくいっているようです。私が示した方法で使用していることを確認してください。問題なく動作するはずです

于 2014-10-20T08:17:39.800 に答える
0

編集して元に戻したときに、実際に編集したのか、元のコピーを使用したのかを知りたいと思います。同じチュートリアルを行ったばかりで、Jeffrey's Magic に完全に困惑しましたが、ここでモデル バインディングに関する API を具体的に見てみましょう。

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

重要な点は、バインド匿名関数を起動するには、アクティブなルートで「ワイルドカード」をトリガーする必要があることです。

私の場合、元の命名法を使用すると、{slug} のワイルドカードがありましたが、いつの間にか {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があり、編集で修正したと思います。特に非常に多くのリテラルを使用し、そこにコードタイプのヒントがないため、微妙です。しかし、それは大丈夫です。私たち全員がジェフリー・ウェイになることはできません。したがって、バインドが失敗した場合は、まずそれを再確認してください。

幸運を。

于 2014-12-04T04:25:01.020 に答える