【问题标题】:Laravel routes.php getting big [closed]Laravel routes.php 越来越大[关闭]
【发布时间】:2013-02-15 22:20:47
【问题描述】:

随着您不断向 Routes.php 添加越来越多的路由,它会变得越来越大。你如何组织它们?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我创建了一个目录 /application/routes/ 并在其中添加了文件。每个文件只是一组路由。然后在 routes.php 我添加了以下代码以将它们全部包含在内:

    // Dynamically include all files in the routes directory
    foreach (new DirectoryIterator(__DIR__.DS.'routes') as $file)
    {
        if (!$file->isDot() && !$file->isDir() && $file->getFilename() != '.gitignore')
        {
            require_once __DIR__.DS.'routes'.DS.$file->getFilename();
        }
    }
    

    【讨论】:

    • 我认为这是最漂亮的解决方案。但是您认为每次用户尝试访问网站时目录迭代器都会运行吗?如果是,我想它可能会产生一些性能问题?
    • 这是一个非常优雅的解决方案。 @Tareck117,这可能会影响性能,但是,并没有太多需要立即关注(尽管它是唾手可得的成果)。
    • 我同意这可能会引入性能问题,但它会非常小。尤其是 SSD。如果你担心这个,你可以缓存文件列表。
    【解决方案2】:

    即使采用了其他答案中提到的所有最佳实践, 即:使用资源控制器、路由组等。

    您可以用老式的方式简单地“包含”路由文件。正如 Chris G 在此评论中提到的那样。

    您可以创建简单的目录结构并将路由文件包含在 route.php 文件中。

    ../myroutes
     --route-type-1.php
     --route-type-2.php 
    

    在 route.php 文件中

    include('myroutes/route-type-1.php');
    

    这并没有错。这就是路由包含在包中的方式。

    http://laravel.com/docs/packages#package-routing

    【讨论】:

    • 这应该被标记为正确答案
    • 有时我确实忘记了 Laravel 是 PHP 并且它允许这样的东西,并且人们试图将事情过度复杂化并使用“Laravel 方式”,而对于许多人来说,这是一种很好的旧 PHP 方式年。我包括我自己。
    【解决方案3】:

    我通常使用Group routes(因为如果控制器相关,它们往往需要相同类型的过滤)来组织它们,或者如果您希望/可以拥有更小的路由文件,您可能想要register your controllers 并执行控制器本身内部 URL 参数的额外验证检查。

    【讨论】:

    • 我认为第一个建议不会将文件缩小那么多,而第二个建议只会永久消除路由。按照某人的建议包含其他路由文件会更好
    【解决方案4】:

    实际上,溃败应该保持苗条。只需将您的代码移动到控制器并使用路由注册并重定向到它们。惯例是每个文件存储一个控制器,以便您的代码自动组织。

    看看这个

    //  application/controllers/sample.php
    class Sample_Controller extends Base_Controller
    {
        public function action_index()
        {
            echo "Wellcome to the root" //www.testapp.com/sample
        }
    
        public function action_edit()
        {
            echo "Some editing functions here." //www.testapp.com/sample/edit
        }
    
         public function action_whatsoever()
        {
            echo "Put here whatever you like." //www.testapp.com/sample/whatsoever
        }
    
    }
    

    controller-action 路由可以这样注册:

    //application/routs.php
    Route::controller('admin::home');
    

    非常直接和舒适。

    更新:

    您还可以使用此行为整个应用程序自动注册所有控制器:

    Route::controller(Controller::detect());
    

    或具有所有操作的控制器:

    Route::controller(Controller::detect('yourcontroller'));
    

    【讨论】:

    • 对.. 但问题是当 Routes.php 文件因注册这么多控制器而变大时该怎么办。同样对于简单的路由和东西,为它们创建一个控制器并不总是合乎逻辑的,这会使路由文件的大小也更大。最佳实践是在 routes.php 中创建多个路由文件并include 它们吗?
    • K,然后我跑错了方向。我从来没有听说过在 routes.php 中包含多个路由文件,我也没有听说过。我认为没有其他人会这样做,所以这不是最佳实践。你能发布你的 routes.php 内容的例子吗?也许这可以帮助分析您的问题。
    • 我刚刚扩展了我的答案,以展示如何注册所有控制器,包括。一行的所有方法。
    • 我相信 Laravel 4 中 Controller::detect() 不再存在,你必须手动定义它们。
    【解决方案5】:

    或者,您可以将路由存储在不同的文件中,然后使用 include 获取这些文件:

    Route::group(stuff,function(){
      include __DIR__.DS.'routes1.php';
      include __DIR__.DS.'routes2.php';
    });
    

    当代码太多时,这提供了一种很好且干净的方式来对句柄进行排序,你也可以提一下

    Route::controller(Controller::detect());
    

    然后相应地构造你的控制器:

    class Account_Controller extends Base_Controller {
      public function action_login() {
          //Login
      }
    
      public function action_logout() {
          ...
      }
    

    如果您必须将参数传递给某个函数:

      public function dosomething($input){
         ...
      }
    

    您可以像这样访问这些功能:

      http://yourapp/account/login
      http://yourapp/account/logout
    

    然后你可以通过将参数附加到 URL 来调用函数,

      http://yourapp.account/dosomething/somedata
    

    如果您需要保护某些方法,请在没有 action_ 的情况下附加它们,以便公众无法访问它们。

    或者,您可以切换到 restful 方法,这基本上是一种根据您获得的查询类型来响应某些输入的方法,例如,当您收到对登录页面的“GET”请求时,这意味着用户需要查看登录屏幕,当您收到“POST”请求时,这通常意味着用户正在发布登录数据,因此您可以做出响应,这将帮助您减少功能数量,以获取有关您可以阅读的 restful 方法的更多信息Ryan Tomayako 撰写的这篇精彩文章http://tomayko.com/writings/rest-to-my-wife

    要使用 restful 方法,您需要将 restful 设置为 true,然后在函数名称之前附加 action 关键字。

    public $restful = true;
    public function get_login() {
     return View::make('login');
     //This function is accessible using GET request to http://yourapp/login
    }
    
    public function post_login() {
       $data = Input::get();
       //do something using the Input data
       //This function is accessible using a POST request to http://yourapp/login
    }
    

    通过这种方式,您可以消除对处理和验证用户凭据的其他途径的需要!

    如果您不希望使用 restful 方法访问某些方法,则不要在函数名称中包含 action 关键字 (get,post,...)。

    将 restful 方法与智能路由相结合是保持代码清洁和安全的最有效方法。

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 2017-10-15
      • 2019-07-01
      • 2019-01-04
      • 1970-01-01
      • 2022-12-05
      • 2012-09-12
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多