laravel - 在 url 参数绑定旁边设置 laravel 中路由的默认值
问题描述
好的,可以说我有一个ProfileController.php
. 在edit
方法中它看起来像这样:
class ProfileController extends Controller
{
public function edit(\App\User $user)
{
return view('profile.edit',compact('user'));
}
public function update(\App\User $user, \App\Http\Requests\ProfileRequest $request)
{
$user->update($request->all());
return back()->withStatus(__('Profile successfully updated.'));
}
}
它只是显示用户的个人资料和编辑它的表格。
此方法的路径如下所示:
Route::group(['middleware' => 'auth'], function () {
Route::group(['middleware' => '\App\Http\Middleware\DefaultUrlParamsMiddleware'], function () {
Route::get('profile/{username?}', ['as' => 'profile.edit', 'uses' => 'ProfileController@edit']);
Route::put('profile/{username?}', ['as' => 'profile.update', 'uses' => 'ProfileController@update']);
});
});
如您所见,此 url 中有一个可选username
参数,我想要将此 url 参数绑定到ProfileController.php
方法所需的用户对象。
为此我在我的appProvider.php
:
class AppServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot(Router $router)
{
// provide user for profile edit
$router->bind( 'username', function ( $username ){
return \App\User::where( 'name', $username )->firstOrFail();
});
}
}
目前一切正常,但只有当我username
在 url 中提供参数时,例如,如果我去mydomain.test/profile/mytestinguser
它工作正常。
我想要的是如果我不在 URL 中提供用户名参数,它应该默认使用我当前的用户名,所以如果我去mydomain.test/profile
它应该考虑用户名参数等于我当前的用户名,mytestinguser
然后使用绑定来解析它到用户对象,然后将其传递给edit
方法。但它不起作用。所以我稍微查了一下,中间件中有一些关于 URL::defaults 的东西,所以我设置了这个中间件DefaultUrlParamsMiddleware
,然后它的内容如下:
use Illuminate\Support\Facades\URL;
class DefaultUrlParamsMiddleware
{
public function handle($request, Closure $next)
{
URL::defaults(['username' => auth()->user()->name ]);
return $next($request);
}
}
但这也不起作用,只是$user
在edit
方法中向我显示一个 null 。这是为什么?
解决方案
请确保您已为app/Http/Kernal.php
文件中的路由注册/添加中间件。例如
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
....
protected $routeMiddleware = [
...
'DefaultUrlParams' => \App\Http\Middleware\DefaultUrlParamsMiddleware::class,
]
}
然后在路由文件中使用它,如下所示:
Route::group(['middleware' => ['DefaultUrlParams']], function () {
//routes goes here
}
希望它现在可以工作。
推荐阅读
- kendo-grid - 剑道网格中具有 int 类型的列
- python - 如何查看数据框中的列与所有其他列之间的相关性?
- python - 从数据框中的字典中提取值
- linux - 如何遍历多个文件夹和子文件夹并删除以 abc.txt 开头和 14 天前的文件名
- amazon-web-services - 使用 Winston 日志记录的 AWS Lambda 丢失请求 ID
- python - Keras 序列、fit_generator 和 steps_per_epoch
- python - 为什么 pandas.merge() 会生成额外的行?
- vba - VBA - 如果在错误处理中转到 excel 错误消息
- git - 一些提交在两个分支上。为什么?
- android - 为什么单笔交易这么慢?