laravel中的MVC流程和数据库原生查询
1. 路由
laravel中的所有请求都要通过路由解析, 才能找到对应的控制器和方法处理.
一般使用
/routes/web.php
文件来编写所有路由即可.路由编写基本格式:
Route::请求方式(路由地址, 控制器@方法)
. 如:Route::get('/admins/admin/index', 'admins\Admin@index');
,Route::post('/admins/admin/save', 'admins\Admin@save');
.若请求URL中的路径, 在
/public
目录中, 有匹配请求路径的文件, 同时又有匹配到的路由, 则laravel会优先加载/public
目录中的对应文件.- 借用laravel的这个特性, 可以把静态化的文件放到
/public
目录中, 实现站点静态化.
- 借用laravel的这个特性, 可以把静态化的文件放到
laravel没有通用路由一说, 每个请求都需要有对应的路由.
2. laravel中的MVC流程
2.1 laravel中的控制器
laravel的控制器文件要放在
/app/Http/Controllers
路径中, 支持子路径.控制器的命名空间要跟其相对于laravel根目录的物理路径一致, 否则laravel无法自动加载.
控制器名称要跟控制器文件名称一致.
需要继承
\App\Http\Controllers\Controller
基类.除开手动创建控制器类外, 也可以使用
artisan
命令创建控制器. 在laravel项目的根目录中, 打开命令行终端, 执行命令:php artisan make:controller 命名空间\控制器名
, 也可以创建控制器文件.- 其中命名空间是相对于
\App\Http\Controllers
的非完全限定命名空间.
- 其中命名空间是相对于
控制器示例:
1-控制器( Test.php
):
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
class Test extends Controller
{
public function index()
{
// 直接在前端输出"hello, laravel!";
echo 'hello, laravel!';
}
}
2-路由(web.php片段):
Route::get('/test/index', 'Test@index');
2.2 laravel中的视图
在控制器中, 使用助手函数
view(视图路径, 需渲染的数据)
来加载和渲染视图.- 也可以用
view(视图路径)->with('参数名1', 参数值1)->with('参数名2', 参数值2)->...;
来渲染数据, 想用那种方式, 看自己喜好. - 其中视图路径是相对于
/resources/views
的路径.- 若视图文件名中包含
.blade
, 则会被laravel视为blade
模板引擎的模板, 经编译后生成纯PHP视图文件, 存放在/storage/framework/views
路径中. - 若视图文件是没有
.blade
的纯PHP视图文件, 或者是.html
文件, 则直接渲染该视图文件.
- 若视图文件名中包含
- 需渲染的数据要以数组的形式传参.
- 也可以用
控制器获取视图并渲染数据示例:
1-返回视图的控制器( Test.php
):
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller;
class Test extends Controller
{
public function index()
{
// 使用参数往前端页面输出"hello, laravel!"
$hello = 'hello, laravel!';
return view('/index', ['hello' => $hello]);
}
}
2-视图文件( index.php
)::
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>index.php</title>
</head>
<body>
<h3><?php echo $hello ?></h3>
</body>
</html>
3-路由(web.php片段):
Route::get('/test/index', 'Test@index');
2.3 laravel中的模型
- laravel刻意弱化了模型的作用. 因为部分开发人员把模型用作编写公共业务逻辑的地方, 而也有另一部分人把模型用作跟数据库交互的类. 所以laravel无法二者兼顾, 所以其直接弱化了模型的作用. 但其倾向于第二种情况, 如:
\App\Http\Controllers\User
类就是一个模型类. 跟数据库中的一个表关联.
3. laravel中操作数据库
3.1 连接数据库
- 在
.env
配置文件中, 有配置连接数据库参数的代码片段:
// 数据库类型
DB_CONNECTION=mysql
// 数据库地址
DB_HOST=127.0.0.1
// 数据库监听端口
DB_PORT=3306
// 数据库名称
DB_DATABASE=phpedu
// 数据库用户名
DB_USERNAME=root
// 数据库密码
DB_PASSWORD=root
3.1 使用原生的方式操作
1. 查询
- 使用
DB::select(SQL查询语句, 绑定的参数数组)
完成查询.
/* 数据库查询[原生查询] */
public function get()
{
// DB类是laravel封装pdo的操作数据库的类, 一般用它的门面类做静态调用
$query = DB::select('select * from `player` ');
$data = [];
foreach ($query as $item) {
// 把对象转为数组
$data[] = (array) $item;
}
$res = [];
$res['data'] = $data;
return view('player', $res);
}
2. 修改, 删除, 插入
使用
DB::update(SQL更新语句, 绑定的参数数组)
完成修改.如果更新的值跟原值相同, 则不计为影响的行数.
DB::select()
也能执行修改, 删除和插入的sql, 但返回值是空数组.
/* 数据库更新[原生更新] */
public function update()
{
// 注意, 如果更新的值跟原值相同, 则不计为影响的行数
$res = DB::update('update `player` set `name` = "勒布朗-詹姆斯" where `id` = 1');
var_dump($res);
}
- 删除, 插入操作用法跟修改类似. 示例略.
- 使用
DB::insert(SQL插入语句, 绑定的参数数组)
完成插入. - 使用
DB::delete(SQL删除语句, 绑定的参数数组)
完成删除.
- 使用
学习心得
laravel中, 所有请求必须先经过路由解析, 带能找到相应的处理控制器和方法. 但若
/public
目录中有跟请求地址相匹配的文件, 则优先加载这个匹配的文件.laravel是一个基于MVC的web开发框架, 但是它弱化了模型(model)的作用.
使用门面类
DB
, 能实现原生的数据库增删改查操作.