Подтвердить что ты не робот

Laravel: метод загрузки в другом контроллере без изменения URL-адреса

У меня есть этот маршрут: Route::controller('/', 'PearsController'); Возможно ли в Laravel заставить PearsController загрузить метод с другого контроллера, чтобы URL-адрес не изменился?

Например:

// route:
Route::controller('/', 'PearsController');


// controllers
class PearsController extends BaseController {

    public function getAbc() {
        // How do I load [email protected] so I can split up
        // my methods without changing the url? (retains domain.com/abc)
    }

}

class ApplesController extends BaseController {

    public function getSomething() {
        echo 'It works!'
    }

}
4b9b3361

Ответ 1

Вы можете использовать (только L3)

Controller::call('[email protected]');

В L4 вы можете использовать

$request = Request::create('/apples', 'GET', array());
return Route::dispatch($request)->getContent();

В этом случае вам нужно определить маршрут для ApplesController, что-то вроде этого

Route::get('/apples', '[email protected]'); // in routes.php

В array() вы можете передать аргументы, если требуется.

Ответ 2

(neto в Вызовите контроллер в Laravel 4)

Использовать IoC...

App::make($controller)->{$action}();

Например:

App::make('HomeController')->getIndex();

и вы также можете дать параметры

App::make('HomeController')->getIndex($params);

Ответ 3

Вы не должны. В MVC контроллеры не должны "разговаривать" друг с другом, если им приходится делиться "данными", они должны делать это с помощью модели, которая является типом класса, ответственного за совместное использование данных в вашем приложении. Посмотрите:

// route:
Route::controller('/', 'PearsController');


// controllers
class PearsController extends BaseController {

    public function getAbc() 
    {
        $something = new MySomethingModel;

        $this->commonFunction();

        echo $something->getSomething();
    }

}

class ApplesController extends BaseController {

    public function showSomething() 
    {
        $something = new MySomethingModel;

        $this->commonFunction();

        echo $something->getSomething();
    }

}

class MySomethingModel {

    public function getSomething() 
    {
        return 'It works!';
    }

}

ИЗМЕНИТЬ

Вместо этого вы можете использовать BaseController для создания общих функций, которые будут использоваться всеми вашими контроллерами. Взгляните на commonFunction в BaseController и как он используется в двух контроллерах.

abstract class BaseController extends Controller {

    public function commonFunction() 
    {
       // will do common things 
    }

}

class PearsController extends BaseController {

    public function getAbc() 
    {
        return $this->commonFunction();
    }

}

class ApplesController extends BaseController {

    public function showSomething() 
    {
        return $this->commonFunction();
    }

}

Ответ 4

если вы были в AbcdController и пытаетесь получить доступ к методу public function test(), который существует в OtherController, вы можете просто сделать:

$getTests = (new OtherController)->test();

Это должно работать в L5.1