Как передать значение из роута в привязку класса?

Как можно получить параметр id из маршрута и передать его в конструктор класса Test при биндинге в AppServiceProvider?
  • 26 сентября 2023 г. 13:27
Ответы на вопрос 2
Для передачи значения из роута в привязку класса в Laravel, вы можете использовать биндинг контейнера (`Container Binding`).

Чтобы передать параметр `id` из маршрута в конструктор класса `Test` при биндинге в `AppServiceProvider`, вы можете использовать метод `bind()` контейнера следующим образом:

```php
use App\Test;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Route;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(Test::class, function ($app) {
            $id = Route::current()->parameter('id');
            // Внимание: Это предполагает, что ваш роут принимает параметр id,
            // например: Route::get('test/{id}', 'TestController@index');
            
            return new Test($id);
        });
    }
}
```

Вы внедряете значение `id` из текущего маршрута в конструктор класса `Test` и возвращаете экземпляр класса `Test` для резолвинга зависимости.

Затем, при использовании привязки класса в контроллерах или других местах, Laravel будет использовать эту привязку и внедрять значение `id` из маршрута в конструктор класса `Test`.

Например, в вашем контроллере можете сделать следующее:

```php
namespace App\Http\Controllers;

use App\Test;

class TestController extends Controller
{
    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @param  Test  $test
     * @return \Illuminate\Http\Response
     */
    public function show($id, Test $test)
    {
        // $id - значение из маршрута
        // $test - экземпляр класса Test с переданным значением $id в конструктор

        // Ваш код здесь ...
    }
}
```

При выполнении ваших маршрутов, `id` из маршрута будет передан в конструктор класса `Test` благодаря привязке класса `Test` в `AppServiceProvider`.
- Используйте механизм привязки маршрутов через route binding. Для этого добавьте следующий код в файл RouteServiceProvider.php:

```
Route::bind('test', function (string $value) {
        return new Test($value);
});
```

- В файле web.php укажите следующий маршрут:

```
Route::get('/{test}', [TestController::class, 'index']);
```

- В контроллере TestController.php добавьте метод index, который будет получать объект Test:

```php
class TestController extends Controller
{
    public function index(Request $request, Test $test){
        dd($test);
    }
}
```
Похожие вопросы