首页 > 代码库 > laravel route路由,视图和response
laravel route路由,视图和response
Laravel充分利用PHP 5.3的特性,使路由变得简单并富于表达性。这使得从构建API到完整的web应用都变得尽可能容易。路由的实现代码在 application/routes.php 文件。
和其它框架不同,应用逻辑在Laravel中可以通过两种方式集成。虽然在控制器(controllers)中实现业务逻辑是普遍的做法,但是在Laravel中也可以直接在路由中嵌入应用逻辑。这种方式尤其适用于只有几个页面的小型网站,这样就免去了创建一大堆控制器(controllers),还要为每个控制器创建一些不相干的方法(methods),而最后只是一部分方法(methods)通过手动设置路由的方式被暴露出来。
在下面的代码示例中,第一个参数(parameter)是你“注册”的路由(route),第二个参数是这个路由将要触发的函数(function),函数中包含了应用逻辑。定义路由时不需要开头的斜线(front-slash),唯一的例外是默认路由(default route)只包含一个斜线(front-slash)。
注意: 路由的权重在于其被注册的先后顺序。 因此,任何通配(catch-all)的路由应该在 routes.php 文件的底部注册
3 // app/routes.php
4
5 Route::get();
6 Route::post();
7 Route::put();
8 Route::delete();
9 Route::any();
注册一个能同时响应(GET、POST、PUT、DELETE)HTTP请求方法(HTTP verbs)的路由
ROUTE::any(‘/‘, function(){ return "Hello World!";});
通配符(Wildcards)
强制路径(URI)中的某部分为数字:
Route::get(‘user/(:num)‘, function($id){ //});
允许路径(URI)中的某部分是字母、数字串:
Route::get(‘post/(:any)‘, function($title){ //});
允许路径(URI)中的某部分是可选的:
Route::get(‘page/(:any?)‘, function($page = ‘index‘){ //});
路由参数:
Route::get(‘/books/{genre}‘, function($genre)
Route::get(‘user/{id}‘, function($id){ return ‘User ‘.$id;});
可选路由参数
Route::get(‘user/{name?}‘, function($name = null){ return $name;});
带有默认值的可选路由参数
Route::get(‘user/{name?}‘, function($name = ‘John‘){ return $name;});
用正则表达式限定的路由参数
Route::get(‘user/{name}‘, function($name){ //})->where(‘name‘, ‘[A-Za-z]+‘);输入:http://localhost/laravelFirst/public/post/you1 由于1不是,会匹配不到,去掉1就可以匹配到了。Route::get(‘user/{id}‘, function($id){ //})->where(‘id‘, ‘[0-9]+‘);
传递参数限定的数组
当然,必要的时候你还可以传递一个包含参数限定的数组作为参数:
Route::get(‘user/{id}/{name}‘, function($id, $name){ //})->where(array(‘id‘ => ‘[0-9]+‘, ‘name‘ => ‘[a-z]+‘))
定义全局模式
如果希望在全局范围用指定正则表达式限定路由参数,可以使用 pattern
方法:
Route::pattern(‘id‘, ‘[0-9]+‘);Route::get(‘user/{id}‘, function($id){ // Only called if {id} is numeric.});
访问路由参数
如果想在路由范围外访问路由参数,可以使用 Route::input
方法:
Route::filter(‘foo‘, function(){ if (Route::input(‘id‘) == 1) { // }});
Route::get(‘post/{postTitle}‘,function($postTitle){
$data[‘title‘]=$postTitle;
return View::make(‘simple‘,$data);
});
$data数组传给视图会自动extract。
response;
创建自定义Response
Response
类继承自Symfony\Component\HttpFoundation\Response
类,提供了多种方法用于构建HTTP Response。
Route::get("custom/response",function(){
$response=Response::make("<h1>hello world</h1>");
$response->headers->set(‘Content-type‘,‘text/plain‘);
return $response;
});
如果需要访问 Response
类的方法,但又要返回一个视图作为响应的内容,通过使用 Response::view
方法可以很容易实现:
return Response::view(‘hello‘)->header(‘Content-Type‘, $type);
在Response中添加Cookie
$cookie = Cookie::make(‘name‘, ‘value‘);return Response::make($content)->withCookie($cookie);
json response:
Route::get(‘markdown/response‘, function()
6 {
7 $data = http://www.mamicode.com/array(‘iron‘, ‘man‘, ‘rocks‘);
8 return Response::json($data);
9 });
By handing an array to the Response::json() method it has been converted to a JSON string and
set as the body of our new Response object. Appropriate headers have been set to explain that the
provided data is infact a JSON string.
上面的会被解析为数组。
$data = http://www.mamicode.com/array(‘a‘=>‘iron‘,‘b‘=> ‘man‘, ‘rocks‘);
被解析成:
{"a":"iron","b":"man","0":"rocks"}
download response
Serving files directly requires certain headers to be set. Fortunately, Laravel takes care of this for
you using the Response::download() shortcut. Let’s see this in action.
Route::get(‘file/download‘, function()
6 {
7 $file = ‘path_to_my_file.pdf‘;
8 return Response::download($file);
9 });
Now if we navigate to the /file/download URI the browser will intiate a download instead of
displaying a response. The Response::download() method received a path to a file which will be
served when the response is returned.
You can also provide optional second and third parameters to configure a custom HTTP status code
and an array of headers. For example:
Route::get(‘file/download‘, function()
6 {
7 $file = ‘path_to_my_file.pdf‘;
8 return Response::download($file, 418, array(‘iron‘, ‘man‘));
9 });
Here we will serve our file with the HTTP status code of 418 (I’m a Teapot) and a header value of
iron=man.
Well this chapter was a lot longer than I originally anticipated, but I’m sure you will see that
returning appropriate response objects can be a lot more valuable than returning simple strings.
In the next chapter we will take a look at route filters, which will allow us to protect our routes or
perform actions before/after they are executed.