Laravel ::路线比。调节器

时间:2014-11-25 08:26:16

标签: php laravel controller routes

由于我在Codeigniter度过了几个月后对laravel 4不熟悉,我经历了很多关于laravel的教程,我想要明确的一件事是laravel中Routes和Controller之间的实际区别是什么,因为我们也可以在控制器和路由中创建和生成视图。有人会简要地向我解释何时在laravel中使用路线和控制器?因为在其他框架中我们需要路由来指定应用程序中的某些特定URL,并且Controller用于执行一些实际任务,但是在laravel中我没有获得路由的主要概念,除了路由机制?

3 个答案:

答案 0 :(得分:5)

  

在Laravel中,您可以完全跳过控制器并执行业务逻辑和在路径中生成视图的任务。

  E.g I have a link  b2.com/getUsers   so in routes.php I can write:

   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仅用于路由并写入所有业务逻辑(以及在控制器内生成视图)

  So the same example can be solved as:

  To handle link:  b2.com/getUsers

  In routes.php

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

  MyController has the method getUsers defined like this:

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

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

答案 1 :(得分:2)

您可以在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和安静的控制器。

一些注释:

  • 能够在路线中添加闭包,让您可以制作 关于路线的复杂决策,并拥有强大的路由系统。

  • 这些回调可让您为路线添加条件。

  • 让控制器与您分开路由使您成为应用程序
    更具可扩展性,更少混淆,并使其他编码员更多 将来很舒服。

  • 它可以让您更好地专注于您的问题并找到解决方案,
    这种物理分离非常重要。拥有View :: make()
    在你的路线内搅拌所有问题,并组成一个 对编码人员的困惑。

答案 2 :(得分: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原则并路由到您的控制器,这样他们就是那些从事实际工作的人。