2013-12-20 153 views
0

我有一個名爲報告的部分,在此之下有大約40-50個報告。在laravel中路由4

對於每個報告,我需要定義一個單獨的類/控制器。

我已經在控制器下創建了一個報告文件夾,並在其下添加了一個ReportsController類。我的路由路由到這個ReportsController的add方法,並根據傳遞給它的參數調用不同的報告類(如ContainerReportController)的add方法。

示例代碼:

controllers/reports/ReportController.php 

    class ReportController extends BaseController { 
    public function add($type) 
    { 
     $controller = Str::studly($type) . 'Controller'; 
     return $controller::add(); 
    } 
    } 


controllers/reports/ContainerReportController.php 

    class ContainerController extends BaseController { 
    public function add() 
    { 
     return "Report will be added here and redirected to main page". 
    } 
    } 

我做到了這種方式,因爲它不會可以讓我來定義路由到每個這種不同類型的報告(如ContainerReportController)中,i定義的單個路線主RportController並從那裏我調用不同的控制器。

我想知道我是否以正確的方式做,或者如果我可以有別的東西可以幫助我更好地使用我的代碼。

僅供參考 - 在控制器/報表目錄中添加每個報表後,我運行composer dump-autoload,以便報表類在應用程序運行時自動加載。

請幫助改善這種編碼。

感謝, 尼基爾

回答

1

我覺得你的代碼是不壞,但這裏的一些改進:

所以,你有一個路線:

Route::get('report/{type}', '[email protected]'); 

報告控制器,將實例報告而不是靜態使用它,這是可測試的:

class ReportsController extends BaseController { 

    public function report($type) 
    { 
     $report = Str::studly($type) . 'Report'; 

     return with(new $report)->add(); 
    } 

} 

許多報告類擴展了BaseReport類。

這不是控制器,因爲控制器不應該彼此交談。一個控制器基本上接收到一個請求,將它傳遞給一個服務類或一個模型,獲取這些數據併發送給一個視圖。

class ContainerReport extends BaseReport { 

    public function add() 
    { 
     $this->reportData = "Report will be added here and redirected to main page". 

     return $this->render(); 
    } 

} 

而一個BaseReport類,這將是所有報表類進行擴展,做共同的東西,您的報告中肯定會做的事:

abstract class BaseReport { 

    protected $reportData; 

    public function render() 
    { 
     return $this->reportData; 
    } 

} 
+0

謝謝:)我會嘗試當我回去工作,將更新! –

+0

大:)現在看起來更有組織了..但我認爲在BaseReport類中渲染方法應該是公開的?你能否看到一個我需要一個私有方法的實例? –

+0

絕對公開,只是編輯它。 –