[英]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() !!}
您似乎假设键入模型提示会自动以某种方式为您提供路线中的模型。 但是,为了使路由模型绑定起作用,需要做一些事情:
因此,鉴于您的代码,需要进行以下更改:
路线:
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.