Laravel 按URL生成和路由
在模板中我们一般不会直接写死url,而是用url助手生成url,本文介绍一下url助手的使用以及遇到的一些比较头疼的问题。
首先,我们创建了一个路由:
Route::get('articles',['uses'=>'ArticlesController@index','as'=>'articles.index']);
假设我们的项目部署在域名根目录,那么可以通过下面的url访问:
http://localhost/articles
现在,我们在模板中生成链接,有几种方式:
简单模式
<a href="{{ url('/articles') }}">链接</a>// or<a href="{{ URL::to('/articles') }}">链接</a>//为了方便阅读,下面省略html标签
这种方式,只是简单的将你指定的路径拼接到网站根url上。
路由模式
URL::route('articles.index')
这种方式是指定匹配注册路由时的 ‘as’ 参数,得到注册的uri。
控制器动作模式
URL::action('ArticlesController@index')
这种方式是根据注册路由时 ‘uses’ 参数,自动生成映射到控制器方法的uri,规则同 Route::controller() 。
举例如下:
ArticlesController@index => articlesArticlesController@getAdd => articles/addArticlesController@postAdd => articles/addArticlesController@getDelete => articles/delete
基本教程到此结束,接下来我们来面对一些令人恼怒的情况。
现在,路由变得更加复杂了,我们定义了一个这样的:
Route::controller('users','UsersController');
一条简单的语句,Laravel会自动反射 UsersController 类,并扫描其中的方法,然后生成普通的映射,举例说明吧,假设控制器中有以下方法:
function getIndex();function getEdit();function postEdit();
实际上,通过 Route::controller() 最终结果**类似**于:
Route::get('users',['uses'=>'UsersController@getIndex']);Route::get('users/edit',['uses'=>'UsersController@getEdit']);Route::post('users/edit',['uses'=>'UsersController@postEdit']);
说白了,高级路由方法只是对基本方法的封装。
好的,现在我们来生成一条url:
echo URL::action('UsersController@getEdit');
如愿以偿得到 http://localhost/users/edit ,但是我们要加点querystring参数呢?也就是俗称的 get参数。
我们想要得到 http://localhost/users/edit?id=1 应该怎么生成?
聪明人已经注意到了 URL::action() 有第二个参数,可以指定一个数组,作为url参数,那好,我们来试试。
echo URL::action('UsersController@getEdit',['id'=>1]);
好了?NO!!你得到的将是:
http://localhost/users/edit/1
如果你再加一个参数:
echo URL::action('UsersController@getEdit',['id'=>1,'author'=>'admin']);
得到的是:
http://localhost/users/edit/1/admin
它根本就忽视了你指定的key,并且没有作为 ?id=1&author=admin 附加在url末尾。
为什么?!!
想知道答案,请继续阅读:Laravel 深入理解路由和URL生成