2013-06-10 9 views
17

Ho questo percorso: Route::controller('/', 'PearsController'); E 'possibile in Laravel ottenere il PearsController per caricare un metodo da un altro controller in modo che l'URL non cambi?Laravel: carica il metodo in un altro controller senza modificare l'url

Ad esempio:

// 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!' 
    } 

} 
+0

http://stackoverflow.com/questions/15205239/ call-a-controller-in-laravel-4 – Joeri

risposta

35

È possibile utilizzare (solo L3)

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

In L4 è possibile utilizzare

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

In questo caso, è necessario definire un percorso per ApplesController, qualcosa di simile

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

Nel array() è possibile passare argomenti se necessario.

+0

Come passare parametri come ottenere Richiesta? I parametri non sono accessibili nel metodo se passati nell'array? –

+0

Sembra che i parametri POST in Laravel non vengano ridefiniti e Input :: all() continua a leggere i parametri da una richiesta originale, non quella che abbiamo reindirizzata a. –

+1

'Input :: all()' legge tutte le fonti di input, inclusa la matrice 'FILES'. –

11

Non dovresti. In MVC, i controller non devono "comunicare" tra loro, se devono condividere "dati" devono farlo utilizzando un modello, che è il tipo di classe responsabile della condivisione dei dati nella tua app. Guardate:

// 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!'; 
    } 

} 

EDIT

Che cosa si può fare, invece è quello di utilizzare BaseController per creare funzioni comuni ad essere condivisa da tutti i controller. Dai un'occhiata a commonFunction in BaseController e come è usato nei due controller.

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(); 
    } 

} 
+0

"Non si dovrebbe" ... Va bene, ma non voglio riscrivere le funzioni fredde/di lavoro. Come posso scrivere le funzioni che posso riutilizzare in entrambi i controller? – Joeri

+0

Le funzioni di riutilizzo in entrambi i controller (a destra) sono completamente diverse dal fare in modo che due controller si parlino l'un l'altro (sbagliato). Modificata la risposta per aggiungere 'commonFunction()' usata in entrambi i controller. –

+0

Thx per il "Non dovresti"! Incredibile come MVC è incompreso a volte ... –

27

(da neto in Call a controller in Laravel 4)

Usa CIO ...

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

Esempio:

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

e si può anche dare params

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

Utilizzato questo metodo per la costruzione di un controller di base al fine di utilizzare alcune variabili condivise. –

+0

Ma ho il "Metodo [myMethod] inesistente" –

+0

@AlexBuznik: usa lo spazio dei nomi corretto. – Joeri

8

se si fosse in AbcdController e cercando di accedere metodo public function test() che esiste in OtherController si può solo fare:

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

questo dovrebbe funzionare in L5.1

+0

e se sono in/name/abaController allora come posso usarlo? – user2671011

+0

come passare i parametri :-) – m0z4rt

Problemi correlati