一、路由目录
众所周知,对于我们熟知的任何一款PHP框架,例如TP、CI、YII、路由系统都是极其重要的存在。
对于laravel框架也一样,对于数据库的操作,无非就是增删改查,只不过框架不同,语法不同,
所以掌握laravel框架的路由系统对于我们掌握该框架有着至关重要的作用。
我们知道对于LARAVEL框架以前的版本,路由都是写在app里的,现在的laravel框架路由存在在Routes目录下,如下图所示:
所有的 Laravel 路由都在 routes 目录中的路由文件中定义,这些文件都由框架自动加载。
routes/web.php 文件用于定义 web 界面的路由。
这里面的路由都会被分配给 web 中间件组,它提供了会话状态和 CSRF 保护等功能。
定义在 routes/api.php 中的路由都是无状态的,并且被分配了 api 中间件组。
我们先来熟悉一下HTTP访问的几种方法:
1. Get方法:常用的方法,略;
2. Post方法:常用的方法,略;
3. Head方法:与get方法类似,主要是为了获取某个访问的头部信息,
服务器不返回请求内容;
4. PUT方法:请求往服务器上存文件;
5. DELETE方法:请求删除服务器上的文件;
6. TRACE方法:就是获取服务器收到的来自客户端的请求信息(收发调试),
一般用于调试服务器;
7. Connect方法:把服务器作为跳板,让服务器代替用户去访问其它网页,
之后把数据原原本本的返回给用户;
8. Options方法:获取服务器URI所支持的方法,或用于检查服务器的性能,
ajax进行跨域访问时,先发送options方法来判断请求是否安全。
二、熟悉路由
我们先写几个简单的路由来认识一下Laravel下的路由路径。
在开始练习之前,我们先关闭routes/web.php 下的下面两行auth相关代码,避免影响练习测试。
//Auth::routes();
//Route::get('/home', 'HomeController@index')->name('home');
此刻我们访问127.0.01:9999/news时,显示的应该是NEWS字样。
接下来我们来給数据表中填充十组数据,然后建立Model类以及控制器,通过路由来访问这些数据。(这里就不通过laravel自带的 seed 填充了,有兴趣的朋友可以自行查询怎么填充模拟数据.关键字"laravel seeder")。表结构如下图所示
使用artisan命令建立Model类,打开cmd 切换到项目根目录,输入php artisan make:model News
得到如下图所示
打开app/News.php 文件,由于laravel默认Model类对应的表名为类名加s,既对应的表应该是newss,我们在文件中加入protected $table = 'News',指定该model类对应表news。
我们再使用artisan建立控制器. php artisan make:controller IndexController
成功之后,打开app/Http/Controllers/IndexController.php ,测试成功。
加入路由
测试成功
至此说明我们已经可以通过路由访问通控制器,
接下来我们来使用Eloquent ORM 来调取数据库数据。
如上图,需要在文件头部引入对应Model类
use AppNews ,然后 在方法Index里调用News::all() Eloquent方法,然后展示出数组模式,toArray();
除此之外,我们还可以使用DB类的静态方法来和数据库进行交互。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\News;
use DB;
class IndexController extends Controller
{
public function index()
{
// echo '测试成功!';
// var_dump(News::all()->toArray());
$news = DB::table('news')->get();
var_dump($news);
}
}
以上只是数据库最简单的展示方法,具体的增删改查我们会在下节教程继续学习,现在我们再回过头来,看看路由的几种规则。
1、路由的match、any方法
/*
match方法是laravel自己封装好的,同样它的意思是匹配
*/
Route::match(['get,post],'admin/login',function(){
return 'login';
});
/*
在这里呢我们可以用match这个方法去匹配两种请求方式,这样是不是减少了代码量呢
*/
我们还有第二种方法,
/*
GET,POST,PUT,DELETE.. 任何方法访问 www.itbool.com/Admin/login, 都用第2个参数中的匿名函数去响应所有HTTP动作 .
*/
Route::any('Admin/login',function(){
return 'hello world';
});
2、路由传参
Laravel的路由传参参数必须使用花括号来包裹并且是拼音字母例如使用{id}表示$id参数,具体示例如下图所示:
3、路由正则约束
即当我们要验证一些字段的时候,在laravel中,我们可以直接在路由中作出限制。
普通形式
->where('要限制的参数名','限制规则(正则,不用斜线//)');
数组形式
->where(['要限制的参数名1'=>'限制规则1(正则,不用斜线//)','要限制的参数名2'=>'限制规则2(正则,不用斜线//)']);
如下图所示:
4、资源路由
例如:我们先用artisan命令,生成一个控制器:
php artisan make:controller PhotoController --resource
(artisan命令还有很多,可以极大地提高我们的开发速度)
接下来为这个控制器注册一个资源路由:
Route::resource('photo','PhotoController');
此时打开cmd命令行 输入php artisan route:list ,可以看到如下图
这个路由声明创建多个路由来处理资源上的各种行为。生成的控制器为每个行为保留了方法,
同时还包括了 处理 HTTP 动作和 URI 的声明注释。
这里需要注意的是因为 HTML 表单不能生成 PUT、 PATCH 或者 DELETE 请求,所以你需要添加一个隐藏的 _method 输入字段来伪造这些 HTTP 动作。辅助函数 method_field 可以帮你创建这个字段:
{{ method_field('PUT') }}
或者在表单中加入像这样
<input type="hidden" name="_method" value="put">
表单提交方式不需要变,依旧是 method='POST'即可。
5、控制器路由(5.3以后已经取消了,不再赘述)
每条地址规则都要定义路由,岂不是很累,laravel有一个控制器路由,很好的解决了这个问题。
Route::controller('/example', 'ExampleController'); (5.3已弃用)
6、路由组
在很多模块操作中我们需要把路由分组,对于他们进行权限分组限制,这时候我们就可以使用路由组结合中间件Middleware来进行简单的限制。
1)建立中间件
首先我们在应用根目录下运行如下Artisan命令生成一个测试用的中间件TestMiddleware:
php artisan make:middleware TestMiddleware
这样会在/app/Http/Middleware目录下生成一个TestMiddleware.php文件,
打开该文件编辑TestMiddleware类的handle方法如下:
public function handle($request, Closure $next)
{
if($request->input('age')<18)
return redirect()->route('refuse');
return $next($request);
}
我们在中间件中定义这段业务逻辑的目的是年龄18岁以下的未成年人不能访问。
2)新增中间件属性
然后我们打开/app/Http/Kernal.php文件,新增TestMiddleware到Kernel的$routeMiddleware属性:
test' => \App\Http\Middleware\TestMiddleware::class,到数组中去
3)定义路由组
Route::group(['middleware'=>'test'],function(){
Route::get('/write/laravelacademy',function(){
//使用Test中间件
});
Route::get('/update/laravelacademy',function(){
//使用Test中间件
});
});
Route::get('/age/refuse',['as'=>'refuse',function(){
return "未成年人禁止入内!";
}]);
此时,我们访问127.0.0.1:9999/write/laravelacademy?age=15时候,
就会自动跳转到http://127.0.0.1:9999/age/refuse。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。