动态重定向到不同的控制器

时间:2017-07-24 14:41:58

标签: php laravel-5

我的应用程序在db中有一些实体,每个实体都包含有关控制器名称的数据。

当调用route时,它调用MainController并跟随方法,然后重定向到不同的控制器。

有没有更好的方法呢?

更新

routes.php文件

Route::get('/print-pdf/{uniqueID}', Logic\EditorController@dispatchPDF');

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

2 个答案:

答案 0 :(得分:2)

您的实体不应包含有关控制器的任何信息。最好让Laravel根据请求处理解析控制器。您可以做的一个例子是:

创建将PDF打印到浏览器的路线。

Route::get('entities/{entity}/print', 'EntityController@print');

然后使用以下artisan命令创建一个新控制器: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

修改

对于您的代码,您可以将controller_name表格中的entities行更新为: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。

答案 1 :(得分:0)

为什么不发送到一个控制器?然后切换classname:

$1, $2...