установить значение по умолчанию для маршрута в laravel вместе с привязкой параметров URL - PullRequest
0 голосов
/ 10 октября 2019

хорошо, допустим, у меня есть 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, он должен учитывать имя пользователяparam, равный моему текущему имени пользователя, равному 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. почему это?

1 Ответ

0 голосов
/ 10 октября 2019

Пожалуйста, убедитесь, что вы зарегистрировали / добавили свое промежуточное ПО для маршрутов в файле 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
}

Надеюсь, он будет работать сейчас.

...