最适合Laravel的新手教程(5)路由创建;控制器也可用;接下来要做的是将两者联系起来;最适合laravel的新手教程(三)我们已经讲到Route的get或者post方法的第一个参数就是我们要定义的路由;这是我们在地址栏中请求的url;第二个参数可以是闭包函数;包含请求定义的路由写入时要执行的内容;上一篇我们说了;如果把所有的代码都放在这个闭包函数中,会显得臃肿难维护;所以你需要使用控制器;明显地;controller是替换第二个参数的闭包函数;writeit直接写controller名称也很简单;然后用@符号分隔控制器和控制器的方法Route::get('article/index','ArticleController@index');Route::get('article/create','ArticleController@create');Route::post('article/store','ArticleController@store');你可以在controller里面写一些内容;访问定义的路由以查看内容;一切都是那么完美;但如果你像我一样英俊;呃;不;如果你像我一样懒惰,善于总结思考;你会发现这三个路由都是以article/为前缀的;我们应该如何在路由中减少这个?什么样的重复?这就是我们接下来要讲的分组的概念;路由组就是将一些具有相同特征的路由放在一个组中;我们先定义一个前缀路由组;以上三种路线都可以改成这样;Route::prefix('article')->group(function(){Route::get('index','ArticleController@index');Route::get('create','ArticleController@create');路线::post('store','ArticleController@store');});随着项目的扩大;如果控制器直接放在app/Http/Controllers目录中;然后维护会开始有点头疼;所以控制器可以存放在子目录中;例如,我想构建一个app/Http/Controllers/Admin/ArticleController.php;构建另一个应用程序/Http/Controllers/Home/ArticleController.php;命令行也可以添加目录;phpartisanmake:controllerAdmin/ArticleController--resourcephpartisanmake:controllerHome/ArticleController--resource然后新建一个controller里面写一些内容来区分;这种多级目录不需要指定目录;你只需要指定相对于app/Http/Controllers目录的命名空间;Route::prefix('admin/article')->namespace('Admin')->group(function(){Route::get('index','ArticleController@index');Route::get('create','ArticleController@create');路线::post('store','ArticleController@store');});组可以嵌套;然后可以修改上面的路由;Route::prefix('home')->namespace('Home')->group(function(){Route::prefix('article')->group(function(){Route::get('index','ArticleController@index');Route::get('create','ArticleController@create');Route::post('store','ArticleController@store');});});这就是它的访问方式;因为我们会在Admin目录下创建更多的路由器;所以;我们应该使用这种组嵌套的方式;比如我们还有一个app/Http/Controllers/Admin/TagController.php;路线是就是这个;Route::prefix('home')->namespace('Home')->group(function(){Route::prefix('article')->group(function(){Route::get('index','ArticleController@index');Route::get('create','ArticleController@create');Route::post('store','ArticleController@store');});Route::prefix('tag')->group(function(){Route::get('index','TagController@index');Route::get('create','TagController@create');Route::post('store','TagController@store');});});除了文档中提到的方式;事实上,以前版本的laravel有另一种定义路由组的方法;Route::group(['prefix'=>'admin','namespace'=>'Admin'],function(){Route::group(['prefix'=>'article'],function(){Route::get('index','ArticleController@index');Route::get('create','ArticleController@create');Route::post('store','ArticleController@store');});});就是把prefix和namespace这些都作为group方法的第一个参数;但是现在不推荐这种写法;但是因为之前很多项目都是这样写的;这里我就说说当童鞋们用来查看别人以前的项目懂而不糊涂;在这里,我们学习了如何组织多级目录;为简单起见;我们回到app/Http/Controllers/ArticleController.php文件往下看;我们会发现命令行创建的controller里面有一个edit方法;publicfunctionedit($id){//}edit方法有一个$id参数;这个参数有什么用?通过名字,我们很容易理解这是用来修改数据的;id一般是数据库的自增字段;那么这个就是修改指定id的数据;但是这个id是从哪里来的呢?现在是解释路由参数的时候了;在定义路由时,我们可以定义路由参数;然后我们在上面的路线上添加一个编辑;Route::prefix('article')->group(function(){Route::get('index','ArticleController@index');Route::get('create','ArticleController@create');路线::post('store','ArticleController@store');路线::get('edit/{id}','ArticleController@edit');});我们在定义路由时将变量名用花括号括起来;然后这个变量可以直接传递给控制器??方法;那么在地址控制器中可以接收到什么;为了测试方便,我们在该方法中返回id;publicfunctionedit($id){return'地址栏传入的参数是:'.$id;}携带路由参数通过路由访问该方法;有一个容易绊倒的地方;即控制器中的参数名不一定与路由参数名相同;也就是说,我也可以这样写;publicfunctionedit($a){return'地址栏传入的参数是:'.$a;}当路由参数只有一个时,无所谓;一旦定义了多个路由参数;这个坑真的是个坑;Route::prefix('article')->group(function(){//...Route::get('edit/{id}/{name}','ArticleController@edit');});在controller中获取路由参数时;publicfunctionedit($name,$id){return'idis:'.$身份证。'
名字是:'。$name;}访问http://bjyblog.test/article/edit/666a/BaiJunyao;当你认为你闭着眼睛就知道结果的时候;一只巨大的飞蛾飞过;你发现上面的id和name是错误的;是时候敲黑板,画重点了;路由参数中的第一个参数对应控制器中的第一个路由参数;等等;在controller中,路由参数与参数名无关;它只取决于相关的订单;另一个id通常是纯数字;在这里,信件被传递;我们应该如何限制ID?Laravel为我们考虑了方方面面;我们可以添加一个位置;Route::prefix('article')->group(function(){//...Route::get('edit/{id}/{name}','ArticleController@edit')->where('id','[0-9]+');});这样只能传递数字;事实上,大多数表都使用id作为主键;如果您为每条路线手动定义约束;挺麻烦的;laravel又一次为我们考虑到了方方面面;找到文件app/Providers/RouteServiceProvider.php;可以在boot方法中定义全局约束;publicfunctionboot(){Route::pattern('id','[0-9]+');parent::boot();}这样就不需要为每个带id参数的路由定义约束;参数路由只能传递数字;如果你不了解这个RouteServiceProvider,不纠结也没关系;首先是固定用法;稍后你会明白的;容易与路由参数混淆的是请求参数;路由参数?请求参数?糊涂不清;举个栗子;Route::prefix('article')->group(function(){//...Route::get('edit/{id}/{name}','ArticleController@edit');});bjyblog.test/article/edit/666/BaiJunyao?music=overthehills&book=ordinaryworldid和name为路由参数;music和book是请求参数;我们已经学习了如何获取路由参数;如何获取请求参数?我们回到controller,四处转转,??找到update方法;publicfunctionupdate(Request$request,$id){//}这个Request$request是我们用来获取请求参数的key;意思是向controller的发送方法传递一个$request,它是一个Request类;我们还可以在我们的编辑方法中添加一个$request;publicfunctionedit(Request$request,$id,$name){$music=$request->input('音乐');$book=request()->input('book');$str=<<
音乐:$music
书:$book
php;返回$str;}这个Request$request不会影响路由参数的顺序;它可以放在前面和后面;我们访问该方法并携带请求参数;Request类有一个输入法;只需将您要获取的参数名称传递给它即可;我还在上面的例子中使用了一个request()函数;它与Request$request具有相同的效果;$request可以很容易地重复使用;所以建议在controller中使用$request;如果传递了很多请求参数;一件一件去拿还是很麻烦的;Request还有一个all方法,可以获取所有的请求参数;公共功能编辑(请求$request,$id,$name){dump($request->所有());}dump是laravel自带的打印函数;是php自带的var_dump函数的升级版;打印出来的效果是这样的;如果你想打印数据并将其消亡,你可以使用dd()函数;如果只想从大量的请求参数中获取指定的请求参数Request也有only方法;publicfunctionedit(Request$request,$id,$name){dump($request->only('music','book'));如果你想排除参数的所有其余部分怎么办?Request也有一个except方法;publicfunctionedit(Request$request,$id,$name){dump($request->except('music'));再次为laravel的周到点赞;本文为白君瑶原创文章,转载无需联系本人,但请注明来自白君瑶博客https://baijunyao.com
