所以,假设我有一个处理Books的简单Controller。
App\Http\Controllers\SimpleBooksController
在routes.php
内我为它注册了一条路线:
Route::get('books/{id}','SimpleBooksController@doSimpleStuff');
但书籍的世界并非如此简单。所以我想有另一个控制器处理真正复杂的书籍。
在我脑海中,我想像这样的东西真的很有用:
class ComplexBooksController extends SimpleBooksController
因此,子类未显式处理的路由将回退到父类。
现在让我们说每本书都知道它是否复杂:$book->isComplex
我想做的事情就是这样
if (!$book->isComplex) {
// route 'books/{id}' to SimpleBooksController@doSimpleStuff
} else {
// route 'books/{id}' to ComplexBooksController@doComplexStuff
}
那么,怎么能做到这一点呢?
*编辑*
我目前正在处理的方法是静态设置routes.php中的控制器,但让他们听参数化路由:
Route::get('books/simple/{id}', 'SimpleBooksController@doSimpleStuff');
Route::get('books/complex/{id}', 'ComplexBooksController@doComplexStuff');
答案 0 :(得分:2)
根据responses documentation,您应该能够使用匿名函数并将重定向返回到正确的控制器。
这假设您在包含isComplex
的书籍表中包含数据:
Route::get('books/{id}', function($id) {
$result = DB::select('SELECT is_complex FROM books WHERE id = ?', [$id]);
if (empty($result)) abort(404);
$book = $result[0];
if ($book->is_complex)
return redirect()->action('SimpleBooksController@doSimpleStuff');
else
return redirect()->action('ComplexBooksController@doComplexStuff');
});
答案 1 :(得分:2)
你以错误的方式接近这个。您不应该尝试使用不同的控制器和路由来处理它。
书籍的路线应该是相同的 - 无论书籍如何。
然后您的控制器会确定该书是简单还是复杂 - 并调用相应的命令来处理此问题。
<强>路线:强>
Route::get('books/{id}','BooksController@doSimpleStuff');
<强>控制器:强>
class BooksController extends Controller
{
public function showBook($book)
{
if ($book->isComplex()) {
$this->dispatch(new HandleComplexBook($book));
} else {
$this->dispatch(new HandleSimpleBook($book));
}
}
}
然后你只有两个命令 - 一个用于简单书籍,一个用于复杂书籍
class HandleComplexBook extends Command implements SelfHandling {
protected $book;
public function __construct(Book $book)
{
$this->book = $book;
}
public function handle()
{
// Handle the logic for a complex book here
}
}
class HandleSimpleBook extends Command implements SelfHandling {
protected $book;
public function __construct(Book $book)
{
$this->book = $book;
}
public function handle()
{
// Handle the logic for a simple book here
}
}