2017-07-24 58 views
0

我的應用程序在db中有一些實體,並且每個實體都包含有關控制器名稱的數據。動態重定向到不同的控制器

當路由被調用時,它調用MainController並遵循方法,然後重定向到不同的控制器。

有沒有更好的方法來做到這一點?

UPDATE

routes.php文件

Route::get('/print-pdf/{uniqueID}', Logic\[email protected]'); 

EditorController.php

protected function dispatchPDF(Request $request, $uniqueID){ 
    $ent = Entity::find($uniqueID); 
    $variable_name = $ent->controller_name; //for example: LSEntityController 
    return resolve("\App\Http\Controllers".$variable_name)->printPDF(); 
} 

然後,每個實體具有不同的控制器:

LSEntityController.php

protected function printPDF(Request $request, $uniqueID){ 
    $pdf = \PDF::loadView('map.2017.print',array('data' => $data)); 
    $pdf->setPaper('a4', 'portrait'); 
    return @$pdf->stream('data.pdf'); 

}

SOEntityController.php

protected function printPDF(Request $request, $uniqueID){ 

//here is the difference, this method must call some extra methods 

    $this->compileAndReport(); 
    $pdf = \PDF::loadView('map.2017.print2',array('data' => $data)); 
    $pdf->setPaper('a4', 'portrait'); 
    return @$pdf->stream('data.pdf'); 
} 
+4

爲什麼您的實體關心控制器? – delboy1978uk

+0

因爲實體需要不同的數據來打印pdf。 – Tim

+0

看@ Dees040的回答。實體應該對控制器一無所知。你的請求應該通過一個路由器,它將你引導到控制器,並隨之傳遞。理想的控制器應該調用一個服務來處理你的數據(你的實體)並捕獲任何異常並處理它們,就是這樣。 – delboy1978uk

回答

2

你的實體不應當包含控制器的任何信息。最好讓Laravel根據請求處理解析控制器。你可以做的一個例子是:

創建一個打印PDF到瀏覽器的路由。

Route::get('entities/{entity}/print', '[email protected]'); 

然後用下面的工匠命令創建一個新的控制器:php artisan make:controller EntityController

控制器應該看起來像這樣。

<?php 

namespace App\Http\Controllers; 

use App\Entity; 
use Illuminate\Http\Request; 

class EntityController extends Controller 
{ 
    public function print(Entity $entity) 
    { 

    } 
} 

然後在print方法應該創建一些代碼,打印PDF。你可以使用一個包,例如barryvdh/laravel-dompdf

編輯

爲您的代碼,你可以更新您的entitiescontroller_name行是這樣的:requires_compiling,這可能是一個boolean。然後,如果實體需要分流了PDF,你可以做到這一點之前運行額外的方法:

protected function printPDF(Entity $entity) 
{ 
    if ($entity->requires_compiling) { 
     $this->compileAndReport(); 
    } 

    $pdf = \PDF::loadView('map.2017.print2',array('data' => $data)); 
    $pdf->setPaper('a4', 'portrait'); 

    return @$pdf->stream('data.pdf'); 
} 

現在,你只需要顯示PDF的一個控制器。希望這可以幫助你。

+0

我同意實體不應包含有關控制器的信息,但我沒有找到任何其他方式。讓我們這樣說吧:每個實體都有不同的打印方法和不同的數據。我的路線與您的建議完全相同,但主控制器會重定向到包含打印方法的實體特定控制器。我也不喜歡我的代碼,這就是爲什麼我要求更好的解決方案。 – Tim

+0

您可以更新您的答案並將代碼粘貼到實體特定的控制器中。然後我可以根據您的需求更新我的答案。 –

+0

代碼已更新。 – Tim

0

爲什麼不發送到一個控制器?然後切換類名稱:

switch (get_class($entity)) { 
    case 'ObjectA': 
     $svc = new PdfPrintVersion1(); 
     $pdf = $svc->print($entity); 
     break; 
    case 'ObjectB': 
     $svc = new PdfPrintVersion2(); 
     $pdf = $svc->print($entity); 
     break; 
} 
+0

代碼被分離到不同的控制器以更好地控制方法(也有很多方法)。我認爲get_class方法將返回實體類而不是控制器類。 – Tim

+0

然後將控制器更改爲不同的服務類別。在控制器中,獲取對象的類名,切換,然後實例化你的服務類(前控制器)。通過實體,將您的pdf輸出回來,並在您的控制器發送到視圖 – delboy1978uk

+0

我已更新switch語句以向您顯示 – delboy1978uk

相關問題