Laravel :: 路由 vs 控制器

5

由于我之前花了几个月时间学习Codeigniter,现在接触Laravel 4还不太熟练。我看了很多关于Laravel的教程,但有一件事情我不太明白,那就是Routes和Controller在Laravel中的实际区别。因为我们可以在Controller和Routes中都创建和生成视图。是否有人能简要解释一下何时在Laravel中使用routes和controller呢?因为在其他框架中,我们需要使用routes来指定应用程序内的特定URL,并且使用Controller来执行一些真正的任务。但在Laravel中,除了路由机制外,我并没有理解Routes的主要概念。

3个回答

8

在Laravel中,你可以完全跳过控制器,在路由中执行业务逻辑和生成视图。

例如,我有一个名为b2.com/getUsers的链接,那么在routes.php文件中,我可以这样写:

Route::get('/getUsers',function()
{
    $users=User::all();   //select * from users
    return View::make('allUsers')->with('users',$users);
}

因此,为了处理b2.com/getUsers的请求,我们根本没有使用控制器,您可以很好地处理应用程序中的所有请求(包括GET和POST)。但是,如果您的应用程序很大,并且具有500多个具有复杂业务逻辑的URL,则想象一下将所有内容放在一个routes.php文件中。这完全会使它变得非常混乱,并且整个架构的目的也将被打败。因此,我们通常将routes.php保留仅用于路由,而将所有业务逻辑(以及生成控制器内视图的逻辑)写入其中。

因此,同样的示例可以解决如下:

要处理链接:b2.com/getUsers,在routes.php中:

Route::get('/getUsers', array('before' => 'auth', 'uses' => 'MyController@getUsers'));

MyController的getUsers方法定义如下:

public function getUsers()
{
    $users=User::all();   //select * from users
    return View::make('allUsers')->with('users',$users);
}

我通常为相关活动创建一个控制器,例如登录/注册/注销。我创建了AuthController,并通过routes.php将与这些活动相关的所有链接路由到AuthController。


4

Routes::any()允许您获取视图或执行许多操作,这与MVC和逻辑分离相违背。

Route::get("admin", function(){})中,您确实可以快速访问路由回调,否则必须将其绑定到控制器以保持标准。但是Laravel允许您在闭包(function(){})中执行作业,而不是将其绑定到控制器。无论如何,它确实允许您这样做,但最好避免。在Route::get()中,您只应该使用您的“路由”,而不应添加其他内容。

除了用于测试或一些琐碎的请求之外,在Route中没有理由使用回调函数。因此,最好避免这种情况:

Route::get("admin", function(){
    return View::make("admin_index");
});

而是使用这个更好:
Route::controller("admin", "AdminController");

在您的AdminController.php中:

// I mean create a file named AdminController.php in controllers directory under app.
class AdminController extends Controller
{
   function getIndex()
   {
      return View::make("admin_index");
   }
}

阅读更多关于Route::controller和restful控制器的内容。

一些注释:

  • 在路由中添加闭包函数,可以让您对路由做出复杂决策,并拥有强大的路由系统。

  • 这些回调函数允许您为路由添加条件。

  • 将控制器与路由分离,使您的应用程序更具可扩展性、更少混乱,并使其他编码人员在未来更加舒适。

  • 它使您能够更好地专注于问题和找到解决方案,这种物理分离非常重要。在路由中使用View::make()会将所有问题搅在一起,给编码人员带来困惑。


这意味着让路由仅执行路由任务,并将所有其他逻辑放置在控制器内以获得更好的效用,对吗? - Yubraj Pokharel
1
@Syco Uraz 不是所有的逻辑都在控制器内部,但肯定是路由外的所有逻辑。因为其他逻辑必须分割到控制器、模型和库中... - Mostafa Talebi

1

让我们看看两种情况下我们拥有什么:

在CodeIgniter中,路由只是将您的请求指向控制器的特定方法:

$route['blog/joe'] = "blogs/users/34";

当您访问application.com/blog/joe时,您将调用控制器BlogsController,调用方法users()并将34作为第一个参数传递。就像他们所说的,在CI中,路由只是URL字符串和其对应的控制器类/方法之间的一对一关系。
现在,在Laravel中,您有很多选择:
- 您可以直接返回简单的响应 - 您可以返回视图 - 您可以将请求指向特定的控制器和方法 - 您可以在闭包中编写一些逻辑,然后决定您想要做什么
您可以为它们添加一些附加功能,例如附加过滤器、检查参数是否符合正则表达式、给它们单独的名称等,但这是主要功能。
能够做这么多事情的原因是什么呢?它赋予了您使用它们的任何方式的权力。例如:
- 需要渲染静态HTML的小型网站?像这样使用它们:
Route::get('/', function()
{
    return View::make('greeting');
});
  • 需要使用传统的MVC模式构建更大的应用程序吗?可以像这样使用:
Route::get('user/{id}', 'UserController@showProfile');

需要RESTful方法?没问题。这将为所有CRUD方法生成路由:
Route::resource('photo', 'PhotoController');
  • 需要快速处理特定的Ajax请求吗?保持简单:
Route::post('foo/bar', function()
{
    return 'Hello World';
});

TL;DR:对于没有或仅有很少逻辑的非常简单的事情,请使用它们而不是控制器。否则,始终坚持MVC原则并路由到您的控制器,以便它们是实际工作的人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接