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