2013-06-10 39 views
17

Tôi có tuyến đường này: Route::controller('/', 'PearsController'); Có thể trong Laravel để PearsController tải phương thức từ bộ điều khiển khác để URL không thay đổi không?Laravel: Phương pháp tải trong bộ điều khiển khác mà không thay đổi url

Ví dụ:

// 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

Trả lời

35

Bạn có thể sử dụng (chỉ L3)

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

Trong L4 bạn có thể sử dụng

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

Trong trường hợp này, bạn phải xác định một lộ trình cho ApplesController, một cái gì đó giống như

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

Trong array() bạn có thể chuyển đối số nếu cần.

+0

Làm thế nào để vượt qua các thông số như nhận được yêu cầu? Các tham số không thể truy cập trong phương thức nếu được truyền trong mảng? –

+0

Dường như, các tham số POST trong Laravel không được định nghĩa lại và Input :: all() vẫn đọc các tham số từ một yêu cầu ban đầu, không phải là tham số mà chúng tôi định tuyến lại. –

+1

'Input :: all()' đọc tất cả các nguồn đầu vào bao gồm mảng 'FILES'. –

11

Bạn không nên. Trong MVC, bộ điều khiển không nên 'nói chuyện' với nhau, nếu họ phải chia sẻ 'dữ liệu', họ nên làm điều đó bằng cách sử dụng một mô hình, đó là loại lớp chịu trách nhiệm chia sẻ dữ liệu trong ứng dụng của bạn. Nhìn:

// 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

gì bạn có thể làm thay vào đó là sử dụng BaseController để tạo ra các chức năng thông thường được chia sẻ bởi tất cả các bộ điều khiển của bạn. Hãy xem commonFunction trong BaseController và cách nó được sử dụng trong hai bộ điều khiển.

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

"Bạn không nên" ... Được rồi, nhưng tôi không muốn viết lại các chức năng làm mát/làm việc. Làm thế nào để tôi viết các hàm tôi có thể sử dụng lại trong cả hai bộ điều khiển? – Joeri

+0

Chức năng tái sử dụng trong cả hai bộ điều khiển (phải) hoàn toàn khác với việc làm cho hai bộ điều khiển nói chuyện lẫn nhau (sai). Đã chỉnh sửa câu trả lời để thêm 'commonFunction()' được sử dụng trong cả hai bộ điều khiển. –

+0

Thx cho "Bạn không nên"! Tuyệt vời như thế nào MVC là missunderstood đôi khi ... –

27

(bởi neto trong Call a controller in Laravel 4)

Sử dụng IoC ...

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

Ví dụ:

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

và bạn cũng có thể cung cấp cho params

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

Sử dụng phương pháp này để xây dựng bộ điều khiển cơ sở để sử dụng một số biến được chia sẻ. –

+0

Nhưng tôi nhận được 'Phương pháp [myMethod] không tồn tại' –

+0

@AlexBuznik: sử dụng đúng không gian tên. – Joeri

8

nếu bạn đang ở AbcdController và cố gắng truy cập phương pháp public function test() mà tồn tại trong OtherController bạn chỉ có thể làm:

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

này nên làm việc trong L5.1

+0

và nếu tôi đang ở/name/abaController thì tôi có thể sử dụng nó như thế nào? – user2671011

+0

cách chuyển tham số :-) – m0z4rt

Các vấn đề liên quan