Laravel Virgin: ввести модель в контроллер как зависимость - PullRequest
2 голосов
/ 28 июня 2019

В моем унаследованном коде в моделях есть серьезная логика, и я хочу использовать инъекцию зависимостей Laravel для загрузки моделей в качестве зависимостей в контроллер вместо использования предоставляемых Laravel фасадов.

Итак, вот пример контроллера:

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

Но вместо использования Фасада User Я хочу иметь возможность загрузить его в качестве зависимости в контроллер:


namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;
user App\Models\User

class UserController extends Controller
{

     /**
     * @var User
     */
     private $user=null;

     public function __construct(User $user)
     {
       $this->user=$user;
     }


    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        return view('user.profile', ['user' => $this->user->findOrFail($id)]);
    }
}

Причина, по которой я хочу это сделать, заключается в том, что я пришел из Symfony Background, где шаблон внедрения зависимостей сильно истощен. Кроме того, Dependency Injection - лучший друг Unit Test, поэтому я хочу иметь возможность унифицировать Dependency Injection, с которым я знаком.

Поэтому я хотел знать, могу ли я внедрить модели, в которых существует логика в контроллерах, вместо использования шаблона фасада, предоставленного laravel.

1 Ответ

2 голосов
/ 28 июня 2019

Когда вы регистрируете свой маршрут, вы можете использовать привязку модели:

// routes/web.php
Route::get('users/{user}', 'UserController@show');

Затем в вашем контроллере вы можете изменить свой метод на:

public function show(User $user)
{
    //
}

Где $user будет экземпляром App\User с правильным идентификатором. Например, если URL-адрес /users/1, $user будет содержать App\User с идентификатором 1.

Для получения дополнительной информации: https://laravel.com/docs/5.8/routing#route-model-binding

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...