Laravel:是否可以为路由动态设置控制器?

时间:2015-04-09 01:17:51

标签: php routing laravel-5

所以,假设我有一个处理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');

2 个答案:

答案 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
    }

}