Вызов метода другого контроллера в laravel - PullRequest
0 голосов
/ 17 июня 2019

Я должен вызвать метод другого контроллера.

Я использую следующий код для совершения звонка.

app('App\Http\Controllers\ApiUserController')->getList();

Это работает нормально.

Но я хочу попробовать использовать функцию use, чтобы мне не пришлось повторять всю строку

use App\Http\Controllers\ApiUserController;

class MyMethods
{
    public function index()
    {
        app('ApiUserController')->getList()

Я здесь ошибся?

Ответы [ 3 ]

1 голос
/ 17 июня 2019

Вместо использования функции app вам необходимо пройти через ООП следующим образом:

use App\Http\Controllers\ApiUserController;

class MyMethods
{
    public function index()
    {
        $apiUserController = new ApiUserController();
        $apiUserController->getList();

Однако, как многие здесь упоминали, на самом деле не рекомендуется вызывать метод одного контроллера из другого.

Так что, если бы я был у вас, я бы создал помощника, зарегистрировал его псевдоним в config и использовал бы этот помощник для получения списка в обоих местах.

Надеюсь, это поможет

0 голосов
/ 17 июня 2019

Я согласен с ответом, который дал ученик выше, однако я бы не рекомендовал его с точки зрения организации кода и тестируемости.

Глядя на код, я вижу, что вам нужно получить список пользователей, и поэтому вы должны вызывать пользовательский контроллер API с другого контроллера. Однако вы можете легко извлечь логику из сервиса или даже из черты.

если бы вы использовали черту, вы могли бы сделать что-то вроде следующего:

trait ApiUser {

    public function getList()
    {
      // get the list for users from api
    }

}

//Then you can simply use this trait any where you want,

 class SomeController 
 {
     // correct namespace for ApiUser trait

    use ApiUser;
 }

Еще один способ сделать это, который я люблю использовать снова и снова, в зависимости от сценария; это придерживаться принципа кодирования для интерфейса, а не для реализации. Это будет что-то вроде следующего.

interface ApiUserInterface 
{
  public function getList();
}

class ApiUser implements ApiUserInterface
{
   public function getList()
   {
     // logic to get users from api
   }
}

Убедитесь, что, когда приложению требуется интерфейс, оно знает, где найти его реализацию. Если вы используете Laravel, то вы можете зарегистрировать свой интерфейс в классе в AppServiceProvider

Как только это будет сделано, вы можете использовать эту услугу в любом месте в качестве контракта.

 class OneController 
 {
    protected $apiUserContract;

    public function __construct(ApiUserInterface $apiUserContract)
    {
       $this->apiUserContract = $apiUserContract;
    }

    public function index()
    {
      // You can retrieve the list of the contract
        $this->apiUserContract->getList();
    }
  }

 // you could also just typehint the contact in method without requiring
 // it in constructor and it will get resolved out of IOC i.e. container


 class AnotherController 
 {


    public function index(ApiUserInterface $apiUserContract)
    {
      // You can retrieve the list of the contract
        $apiUserContract->getList();
    }
  }

Дайте мне знать, если вам нужны дальнейшие объяснения, и надеюсь, что это поможет

0 голосов
/ 17 июня 2019

Вызов контроллера из другого контроллера или других объектов не является хорошей практикой.Вот хорошая статья , объясняющая почему.Также «жирные» контроллеры менее предпочтительны, чем «тонкие» контроллеры.

Вы должны определить объект уровня сервиса с общей логикой и использовать его.Создайте объект службы и зарегистрируйте его у одного из поставщиков услуг .

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\YourUserService;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(YourUserService::class);
    }
}

. После этого вы сможете использовать службу в стиле DI.

use App\Services\YourUserService;

class MyMethods
{
    protected $userService;

    public function __construct(YourUserService $userService)
    {
        $this->userService = $userService;
    }

    public function index()
    {
        $this->userService->foo();
    }
}

Почему я должен использовать внедрение зависимости?

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