簡體   English   中英

Laravel 5:路由模型綁定無法識別對象

[英]Laravel 5: route-model-binding not recognizing object

我在SubredditController有一個search()方法

public function search(Request $request, Subreddit $subreddit)
{
    $query = $request->input('search');
    $subreddit = Subreddit::with('posts.votes')->with('moderators.user')->where('id', 24)->first();
    $posts = $subreddit->posts()->where('title', 'LIKE', '%' . $query . '%')->get();
    $isModerator = $subreddit->moderators()->where('user_id', Auth::id())->exists();
    $modList = Moderator::where('subreddit_id', '=', $subreddit->id)->get();

    return view('subreddit.search', compact('query', 'subreddit', 'posts', 'isModerator', 'modList'));
}

如您所見, $subreddit正在從subreddit ID 24獲取所有帖子,並且該查詢有效。

但是當我用$subreddit->id替換24時,查詢失敗並給出null。

編輯:看起來它可以在$modList上工作,因為我已經在第一個變量$subreddit對其進行了硬編碼24 ,但是仍然無法回答為什么$subreddit->id在同一控制器的所有其他方法都可以正常工作時無法訪問

編輯2:我也嘗試過更改search路徑以接受一個參數,例如Route::post('search/{subreddit}')但這會導致錯誤NotFoundHttpException並且URL重定向到localhost/reddit/public/search/%7Bsubreddit%7D無法識別任何參數。

編輯3:如果我將search路由更改為Route::post('subreddit/{id}/search', ...)我沒有收到任何錯誤,但$subreddit->id仍然無法訪問,URL指向subreddit/%7Bid%7D/search (帶有%7B個字符)

這些是我的綁定

$router->model('subreddit', 'App\Subreddit');
$router->model('posts', 'App\Post');
$router->model('moderators', 'App\Moderator');

我的路線

Route::resource('subreddit', 'SubredditController');

Route::resource('subreddit.moderators', 'ModeratorsController');

Route::get('mysubreddits', [
    'as' => 'mysubreddits',
    'uses' => 'SubredditController@mySubreddits'
]);

Route::post('search', ['as' => 'search', 'uses' => 'SubredditController@search']);

Route::resource('posts', 'PostsController');
Route::resource('votes', 'VotesController');
Route::resource('profile', 'ProfilesController');

我發送搜索請求的視圖(部分視圖)

<h4>Search {{ $subreddit->name }}</h4>
{!! Form::open(['action' => 'SubredditController@search']) !!}
<div id="custom-search-input">
    <div class="input-group col-md-12">
        <input type="text" name="search" class="search-query form-control" placeholder="Search" />
            <span class="input-group-btn">
                <button class="btn btn-danger" type="submit">
                    <span class=" glyphicon glyphicon-search"></span>
                </button>
            </span>
    </div>
</div>
{!! Form::close() !!}

您似乎假設鍵入模型提示會自動以某種方式為您提供路線中的模型。 但是,為了使路由模型綁定起作用,需要做一些事情:

  1. 您實際上需要在路由規范中包括該參數。
  2. 您需要確保在URL中傳遞ID(或您在模型綁定函數中使用的任何字段)。

因此,鑒於您的代碼,需要進行以下更改:

路線:

Route::post('search/{subreddit}', 'SubredditController@search')->name('search');

實際上,這會為參數添加一個占位符,並將其命名為與模型的路由綁定相同。

(我還自由地重新安排了行,使其不具有笨拙的options-as-array語法,盡管這可能取決於您的Laravel版本,但對您而言可能不可行。)

視圖:

{{ Form::open(['route' => ['search', $subreddit->getKey()]]) }}

這樣可以確保名為search的路由的第一個參數將包含Subreddit的ID(鍵)值。

這兩件事在一起,將意味着URI最終類似於/search/24 ,它將被轉換為SubredditController@search ,方法參數類型提示為Subreddit預先填充了真實模型(ID為24)。


注意:如果您不希望在URI中使用ID,而是使用類似slug字段,則仍然可以執行此操作-正常綁定路徑,但是在模型上定義getRouteKeyName方法:

public function getRouteKeyName()
{
    return 'slug';
}

然后只需將視圖的Form::open更改為此:

{{ Form::open(['route' => ['search', $subreddit->getRouteKey()]]) }}

同樣,這可能是5.1特定的,您可能使用的5.0可能支持或不支持這種方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM