簡體   English   中英

帶有laravel的控制器內部的路由?

[英]Routes inside controllers with laravel?

我一直在 web.php 中聲明我的應用程序的所有路由,但它現在變得非常大。 我發現我在 web.php 和每個控制器之間轉換浪費了很多時間,這損害了生產力。

我覺得在控制器內部定義路由會更好,也許理想情況下將一些 URL 委托給控制器,然后允許控制器處理“子路由”,因為當我有兩個類似的控制器時,這將允許我使用繼承類似的路線。

鑒於 laravel 的工作原理,這是不可能的。 每個請求都被傳遞到路由器以找到其指定的位置,即。 控制器與方法。 如果它無法在路由器中找到路由,它只會拋出異常。 因此,如果找不到路由,請求永遠不會到達任何控制器。 在 Symphony 的早期版本中,您可以在特定控制器方法的注釋中配置路由。

可悲的是,使用 laravel 它是如何工作的。

但對我來說,我只是喜歡將路線放在一個單獨的文件中。

在此處輸入圖像描述

替代解決方案,更簡單的方法來對所有路線進行排序。

如果為此使用靜態方法,則可以將路由注冊移動到控制器中。 下面的代碼在 Laravel 7 中檢查

在 web.php 中

use App\Http\Controllers\MyController;
.....
MyController::registerRoutes('myprefix');

在 MyController.php 中

(我在這里使用了來自祖先控制器的其他靜態方法,也發布在下面)

use Illuminate\Support\Facades\Route; 
.....
class MyController extends Controller {
......

    static public function registerRoutes($prefix)
    {
      Route::group(['prefix' => $prefix], function () {
          Route::any("/foo/{$id}", self::selfRouteName("fooAction"));
          
      Route::resource($prefix, self::selfQualifiedPath());
    }

    public function fooAction($id)
    {
       ........
    } 

在 Controller.php 中

class Controller extends BaseController {
....
    
    protected static function selfAction($actionName, $parameters = [], $absolute = false)
    {
      return action([static::class, $actionName], $parameters, $absolute);  
    }
    
    protected static function selfQualifiedPath()
    {
      return "\\".static::class;
    }

    protected static function selfRouteName($actionName)
    {
      //classic string syntax return "\\".static::class."@".$actionName;
      // using tuple syntax for clarity
      return [static::class, $actionName];
    }

}

這里提到的 selfAction 與您的問題無關,只是因為它允許通過控制器本身或使用它的任何類為操作創建正確的 url。 這種方法有助於使與動作相關的活動更接近控制器,並避免手動制作 url。 我什至更喜歡為每個動作制作特定的功能,例如對於 fooAction

static public function fooActionUrl($id)
{  
  return self::selfAction('foo', ['id' => $id]);
}    

將前綴傳遞給 registerRoutes 使控制器在某種意義上甚至是可移植的,因此允許將其插入到另一個具有不同前綴的站點中以防發生沖突

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM