首页 > 代码库 > 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.