【问题标题】:Need Laravel Route::controller and Route::controllers需要 Laravel Route::controller 和 Route::controllers
【发布时间】:2020-01-27 10:10:19
【问题描述】:

正如我们在 Laravel 5.2 中所知道的,Route::controller()Route::controllers() 方法已被弃用,但它对于减少路由数量非常方便。我能够写出像Route::controller('admin/invoice','InvoiceController') 这样的简单路线。通过这个简单的一条路线,我可以通过控制器管理与发票相关工作相关的所有事情。

class InvoiceController extends Controller{
   public function getInvoices(){ }
   public function getInvoiceDetails(){ }
   public function postStoreInvoice(){ }
   public function postUpdateInvoice(){ }
   public function postStoreInvoiceDetails(){ }
   public function postupdateInvoiceDetails(){ }

   public function postDeleteInvoice(){ }
   public function postDeleteInvoiceDetails(){ }

   ....
}

但不幸的是,这个 Route::controller()Route::controllers() 不再可用 laravel 版本 > 5.1。一个可用的选项Route::resource(),但它的路线数量有限。 laravel 路由是 Macroable 的,有一个扩展路由功能的选项,比如

Illuminate\Routing\Router::macro('controller', function ($routes) {
    // implementation
});

有没有人为 Laravel 5.8、6 实现 Route::controller()Route::controllers() 方法?或提出任何建议。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    您可以使用Route::resource()Route::resources()

    示例:

    Route::resource('books', 'BookController');
    

    这将假设你有

    class BookController extends Controller {
        // to list resources.
        public function index();
    
        // to show create form. 
        public function create(); 
    
        // to store resource in database. 
        public function store(); 
    
        // to show single resource. 
        public function show(); 
    
        // to show edit form. 
        public function edit(); 
    
        // to edit and then store the modified resource in database. 
        public function update();
    
        // to delete a resource from database. 
        public function destroy(); 
    }
    

    您应该阅读https://laravel.com/docs/master/controllers#resource-controllers 了解更多信息。

    编辑

    由于某种原因,隐式控制器在版本 5.2 中被删除。

    如果你来自 CodeIgniter 世界,那么你可能有温暖和模糊 对隐式路由的感受。你知道,URI 匹配到的地方 将被调用的控制器方法。你甚至可能想要这个 用于您的 Laravel 开发(Laravel 可以做到)。

    虽然乍一看似乎很有用,但简单地调用 Route::controller('admin', 'AdminController') 然后声明所有 您想要从控制器获得的路线,有许多 对此的挫折。考虑一下在使用隐式路由时你会如何, 利用命名路由,或创建嵌套资源,甚至做 像重命名控制器类一样简单而不影响 你的 URI 设计。

    不,说到隐式路由,就说不吧。

    来源https://laracasts.com/lessons/say-no-to-implicit-routing

    但是,如果你想要这个功能,你可以使用这个包: Laravel Routes PublisherLaravel Advanced Route

    【讨论】:

    • 我知道这一点,我已经在我的帖子中提到过。 An option available Route::resource() but it has a limited number of the route.
    • 在控制器中,控制器方法有什么安全问题吗?
    • 不,它被放弃以支持设计。在重命名控制器或利用命名路由等方面有点困难。