我的应用程序在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');
}
答案 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...