Laravel, как вызвать функцию из другого контроллера - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть контроллер с функцией «getUsers» в контроллере с именем «UserController», и внутри него я хочу вызвать функцию контроллера «CarController» с именем «getCars», у меня есть две опции:

a) Сделайте второй вызов как «статический», тогда я могу вызвать его без создания экземпляра класса

б) Не делайте эту функцию статического класса, и я называю это так

    $ car_id = 100;
    $ userController = new UserController ();
    $ userController-> getCars ($ car_id);

Я не знаю, какая из лучших практик или какие плюсы или минусы есть у того или другого.

Я использую Laravel. Thanxs.

Ответы [ 5 ]

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

Следующий код работал для меня хорошо. а также это также может быть использовано в rout.php

 public function mobileImageUpload(Request $request){
    $this->validate($request,[
        'data'=>'required',
        'filetype'=>'required',
        'userid'=>'required',
    ]);
    $namespace = 'App\Http\Controllers';
    $controller = app()->make($namespace.'\ImageController');
    return $controller->callAction('mobileImageUpload',[$request]);
}
0 голосов
/ 08 ноября 2018

Вы можете вызывать одну функцию контроллера из другой, но лучший способ - создать trait и использовать его для обоих контроллеров, например: Общая черта { метод публичной функции () {} }

class FirstController extends Controller
{
    use Common;
}

class SecondController extends Controller
{
    use Common;
}
0 голосов
/ 08 ноября 2018

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

Тем не менее, вы можете сделать это так:

app()->call('App\Http\Controllers\CarController@getCars');

Если ваш метод контроллера имеет параметры, вы можете передать их в качестве второго аргумента:

app()->call('App\Http\Controllers\CarController@getCars', [$param1, $param2]);
0 голосов
/ 08 ноября 2018

Чтобы ответить на ваш вопрос, вы не должны вызывать один метод контроллера из другого. Как упомянул @elfu, это не предназначенная функциональность контроллера в любом случае. Его сообщение верное, и в вашем случае вам, вероятно, следует использовать модель User в качестве местоположения этого метода, но я подумал, что немного подумаю.

Если вы хотите обмениваться методами между несколькими контроллерами, хорошее место для этого - Trait. В некоторых случаях вы не ссылаетесь на модель, которая является общей для контроллеров, и Trait будет вашим лучшим вариантом.

Чтобы включить признак, вы можете ссылаться на него, включив его в верхней части вашего контроллера, а затем с помощью оператора 'use' после объявления класса для контроллера. Вот пример:

use App\Traits\ExampleTrait;

class CarController extends Controller
{
    use ExampleTrait;
...

Вы бы сделали то же самое в UserController. Затем любой метод, который вы поместите в ExampleTrait, будет напрямую доступен из CarController и UserController, указав его как $ this-> methodName (), точно так же, как и любой другой метод в том же контроллере.

В вашем конкретном случае я бы сказал, что ваша логика, вероятно, должна храниться в модели User, поскольку машины для пользователя действительно являются АТРИБУТОМ модели User, но приведенный выше дает вам еще один вариант для работы.

0 голосов
/ 08 ноября 2018

По моему скромному мнению, вы не должны вызывать другой контроллер в контроллере .

Похоже, у вас некоторая бизнес-логика в этом контроллере. Поэтому вы должны переместить свою логику в сущность (User.php) и вызвать ее в обоих методах контроллеров.

Обычный контроллер возвращает представление (по крайней мере, это то, что ожидается), поэтому, если вы хотите вызвать другой контроллер, вам просто нужно отправить этот маршрут этому методу (в файле web.php) вместо вызова его в другом контроллере. .

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

...