Laravel :: 路线与。控制器

Posted

技术标签:

【中文标题】Laravel :: 路线与。控制器【英文标题】:Laravel :: Routes Vs. Controller 【发布时间】:2015-01-23 03:58:42 【问题描述】:

由于我在 Codeigniter 中呆了几个月后才开始接触 laravel 4,所以我浏览了很多关于 laravel 的教程,我想弄清楚的一件事是 laravel 中的 Routes 和 Controller 之间的实际区别是什么,因为我们也可以在控制器和路由中创建和生成视图。谁能简要解释一下何时在 laravel 中使用路由和控制器?因为在其他框架中,我们需要路由来指定应用程序中的某些特定 URL,并且控制器用于执行一些实际任务,但在 laravel 中,除了路由机制,我没有得到路由的主要概念?

【问题讨论】:

【参考方案1】:

在 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 提供服务,我们根本没有使用控制器,您可以很好地处理应用程序中的所有请求,包括获取和发布。

但是,如果您的应用程序很大并且有 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。

【讨论】:

【参考方案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 和 restful 控制器的信息。

一些注意事项:

能够在路由中添加闭包允许您 复杂的路由决策,并拥有强大的路由系统。

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

将控制器与您分开 Routes 使您成为应用程序 更具可扩展性,更少混乱,并使其他编码器更多 未来舒适。

它可以让您更好地专注于您的问题并找到解决方案, 这种物理分离非常重要。有视图::make() 在您的路线内部将所有问题相互搅动并组成一个 程序员的困惑。

【讨论】:

这意味着让路由只做路由任务,让所有其他逻辑驻留在控制器内部以获得更好的实用性是吗? @Syco Uraz 不是控制器内的所有逻辑,但肯定是路由外的所有逻辑。因为其他逻辑必须拆分为 Controller、Models 和 Libraries...【参考方案3】:

让我们看看我们在这两种情况下都有什么:

在 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 原则并路由到您的控制器,以便他们成为实际工作的人。

【讨论】:

以上是关于Laravel :: 路线与。控制器的主要内容,如果未能解决你的问题,请参考以下文章

Laravel路线没有采用正确的控制器方法

(Laravel)如何在 1 条路线中使用 2 个控制器?

Laravel 4 路线不工作

Laravel 8速率限制器不适用于路线

Laravel - 找不到路线

获取所有路线,Laravel 4