博客列表 >PHP框架 - laravel基础

PHP框架 - laravel基础

晴天
晴天原创
2020年06月07日 20:52:192027浏览

laravel

1.laravel 安装与目录介绍

1.1 laravel 安装

  • 通过 composer 指令安装
  1. composer create-project laravel/laravel
  • laravel 7.2 版 安装 PHP 版本 必须大于 7.2.5

1.2 目录介绍

  • 关于网站创建 网站的根目录 一定要选择 laravel 中的 public 目录,否则 laravel 无法运行

  • 关于时间戳 laeavel 默认为国外时区 需要修改为中国时区

    • 打开 config/app.php 文件 找到 'timezone' => 'UTC', 修改为 'timezone' => 'Asia/Shanghai', 即可
  • vendor 目录 是整个框架的类库 不要去修改

  • 我们应该把注意力放到 app 目录 route 目录

1.3 路由

  • laravel 中所有的请求 必须走路由 不走路由访问不了

  • 比如我们想访问 www.xxx.xxx/admin 直接访问会 404

    • 我们需要打开 routes/web.php 文件 添加路由
  1. Route::get('/admin', function () {
  2. return view('admin');
  3. });
  • 然后去 resources/views 中创建 admin.blade.php 文件
    • 此文件即为 admin 正确访问的目录

1.4. database 目录

  • 初学者不要动!

1.5. app 目录

  • 此目录包含应用程序的核心代码。你应用中几乎所有的类都应该放在这里

  • laravel 是一个 mvc 框架 m = model v = view c = controller

  • m 默认不提供

  • v 放在 resources/views

  • c 放在 app/http/controllers

1.6 其他文件

.env 保存着 laravel 的配置 比如数据库用户名密码等 在这里面修改
artisan 运行该命令 创建 控制器 等等 …

  • 编辑器打开 终端 输入php artisan make:controller admin 创建 admin 控制器

2. mvc 流程分析

  • 路由文件 routes/web.php
  1. Route::get('/', function () {
  2. return view('welcome');
  3. });
  • 第一个值为请求地址 , 默认第二个值为回调函数

  • view(welcome) 视图 resources/views 中的 welcome.blade.php

  • blade 为视图引擎

  • laravel 根据文件名判断此文件是否需要加载视图引擎

如果要转到一个类

Route::get('/admin/index',"Home@index");

  • 第二个参数为控制器中的 类名称@类中方法

使用 artisan 创建控制器

  1. G:\phpstudy_pro\WWW\php11.edu\lv\laravel>php artisan make:controller Home
  2. Controller created successfully.
  • successfully 表示创建成功

在 home 控制器中创建 index 方法

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class Home extends Controller
  5. {
  6. public function index(){
  7. return view("test");
  8. }
  9. }

在 view 视图中创建 index.blade.php 视图文件
注意一定要是一个 php 文件 这样才能调用 blade 引擎 在里面使用一些 laravel 的快捷 php 函数,后续会讲到

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>test.blade.php</title>
  7. </head>
  8. <body>
  9. <span>这是一个test视图</span>
  10. </body>
  11. </html>

那么访问 /admin/index 则会显示 index.blade.php 中的内容

当然 我们也可以在 index 方法中向 test.blade.php 中传递参数

  • view 中支持第二个参数 为数组 数组中的键名 为 传递过去的参数名

比如

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class Home extends Controller
  5. {
  6. public function index(){
  7. // 传递第二个参数
  8. return view("test",['user'=>"PHP中文网"]);
  9. }
  10. }

视图中调用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>test.blade.php</title>
  7. </head>
  8. <body>
  9. <span>这是一个test视图</span>
  10. {{-- 调用数组传过来的参数--}}
  11. <p style="color: red;"><?php echo $user ?></p>
  12. </body>
  13. </html>

  • 传递多个参数
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class Home extends Controller
  5. {
  6. public function index(){
  7. // 传递多个参数
  8. $data['user'] = "php中文网";
  9. $data['id'] = 11110 ;
  10. return view("test",$data);
  11. }
  12. }

视图中调用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>test.blade.php</title>
  7. </head>
  8. <body>
  9. <span>这是一个test视图</span>
  10. {{-- 调用数组传过来的参数--}}
  11. <p style="color: red;"><?php echo $user ?></p>
  12. <p style="color: red;"><?php echo $id ?></p>
  13. </body>
  14. </html>

3.数据库的使用

3.1 连接数据库

打开 .env 文件
将这部分修改为自己的数据

  1. DB_CONNECTION=mysql //数据库类型
  2. DB_HOST=127.0.0.1 // 数据库地址
  3. DB_PORT=3306 // 端口号
  4. DB_DATABASE=php11.edu // 数据库名称
  5. DB_USERNAME=php11.edu // 数据库账号
  6. DB_PASSWORD=php11.edu // 数据库密码

3.2 原生操作

  • 直接使用 laravel 定义的 DB 类操作 不需要 newPDO 什么什么的

以下演示方法均放在 Home 类中

  1. // 首先use DB
  2. use \DB;

查询

  1. public function select(){
  2. $res = DB::select('select * from staffs');
  3. print_r($res);
  4. }

添加路由 routes/web.php

  1. Route::get('/dbselect' , "Home@select");

访问

将数据带到视图中输出 注意这个返回的是 一维数组 里面是对象 所以要强制转换为数组

  1. public function staff(){
  2. $res = DB::select('select * from staffs');
  3. $list = [];
  4. foreach ($res as $val){
  5. $list[] = (array)$val;
  6. }
  7. $data['list'] = $list;
  8. return view("staffs",$data);
  9. }

创建视图 resources/views/staff.blade.php
里面的@foreach 是 laravel 调用模板引擎解析文件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>员工列表</title>
  7. <link rel="stylesheet" href="layui/css/layui.css">
  8. </head>
  9. <body>
  10. <table class="layui-table">
  11. <thead>
  12. <tr>
  13. <th>id</th>
  14. <th>name</th>
  15. <th>age</th>
  16. <th>sex</th>
  17. <th>position</th>
  18. <th>mobile</th>
  19. <th>hiredate</th>
  20. </tr>
  21. </thead>
  22. <tbody>
  23. @foreach($list as $val)
  24. <tr>
  25. <td>{{$val['id']}}</td>
  26. <td>{{$val['name']}}</td>
  27. <td>{{$val['age']}}</td>
  28. <!-- 男女 判断一下 -->
  29. <td>{{$val['sex']?"男":"女"}}</td>
  30. <td>{{$val['position']}}</td>
  31. <td>{{$val['mobile']}}</td>
  32. <!-- 时间戳转为日期 -->
  33. <td>{{date("Y-m-d h:i:s",$val['hiredate'])}}</td>
  34. </tr>
  35. @endforeach
  36. </tbody>
  37. </table>
  38. </body>
  39. </html>

访问

更新

  1. public function update(){
  2. $res = DB::update('select * from staffs');
  3. var_dump($res);
  4. }

添加路由 routes/web.php

  1. Route::get('/dbupdate' , "Home@update");

访问 返回受影响的条数

增加

  1. DB::insert()

返回布尔值 true 插入成功 false 插入失败

删除

  1. DB::delete()

返回受影响条数

3.3 链式调用

查询

  1. public function select(){
  2. //sql = select * from staffs where id=8
  3. $res = DB::table('staffs')->where("id","8")->first();
  4. print_r($res);
  5. }

返回的是一个对象

``

  • 查询 所有数据
  1. public function select(){
  2. $res = DB::table('staffs')->get();
  3. print_r($res);
  4. }

返回的是集合对象 为受保护的值 无法直接调用
所以要调用 all 方法

  1. public function select(){
  2. $res = DB::table('staffs')->get()->all();
  3. print_r($res);
  4. }

  • 如果我们想只取出部分字段
  1. public function select(){
  2. $res = DB::table('staffs')->select("id","name")->get()->all();
  3. print_r($res);
  4. }

  • 也可以给字段名改个名字 比如 把 id 改为 userid
  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->get()->all();
  3. print_r($res);
  4. }

  • 只查询某条数据 加 where
  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->where("id","7")->get()->all();
  3. print_r($res);
  4. }

  • 如果想查询 id>8 的值呢?
  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->where("id",">","7")->get()->all();
  3. print_r($res);
  4. }

但是不要用 对 mysql 不友好 数据过多会卡死

  • lick 方法 查询条数据中带有某某的数据
  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->get()->all();
  3. print_r($res);
  4. }

也是尽量不要用 对性能有一定影响 做好做缓存

  • and 方法
    比如 我只想取出 id 为 8 的数据
    链式调用 后面再加条件即可
  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->where("id","8")->get()->all();
  3. print_r($res);
  4. }

转为 sql 语句

  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->where("id","8")->tosql();
  3. // select `id` as `userid`, `name` from `staffs` where `name` like ? and `id` = ?
  4. print_r($res);
  5. }
  • or 方法
    比如我只想取出 id 为 8 和 18 的值
    Orwhere
  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->where("id","8")->orWhere("id","18")->get()->all();
  3. print_r($res);
  4. }

  • wherein

查询的时候想做 多条数据的查询

  1. public function select(){
  2. $res = DB::table('staffs')->select("id as userid","name")->where("name","like","%陈%")->whereIn("id",[8,18,33,43])->get()->all();
  3. print_r($res);
  4. }

  • 连表查询
  1. public function select(){
  2. $res = DB::table('staffs')->join("users","users.id","=","staffs.uid")->select('staffs.id',"users.name")->get()->all();
  3. print_r($res);
  4. }
  • 计算

取员工年龄的平均值

  1. public function select(){
  2. $res = DB::table('staffs')->avg("age");
  3. print_r($res); // 51.1076
  4. // 转为整数
  5. $res = (int)$res;
  6. print_r($res); //51
  7. }

取总数

  1. public function select(){
  2. $res = DB::table('staffs')->sum("age");
  3. print_r($res);//16150
  4. }

最小值

  1. public function select(){
  2. $res = DB::table('staffs')->min("age");
  3. print_r($res);//23
  4. }

最大值

  1. public function select(){
  2. $res = DB::table('staffs')->max("age");
  3. print_r($res);//99
  4. }

记录数

  1. public function select(){
  2. $res = DB::table('staffs')->count();
  3. print_r($res);//316
  4. }

增加

  1. public function insert(){
  2. // 传入数组
  3. // $res = DB::table('staffs')->insert(['name'=>'daxiguai','age'=>11,'sex'=>0,'position'=>'啥进度的基督教','mobile'=>15865656565,'hiredate'=>time()]);
  4. // 多条数据 这样写
  5. $date[] = ['name'=>'daxiguai','age'=>11,'sex'=>0,'position'=>'啥进度的基督教','mobile'=>15865656565,'hiredate'=>time()];
  6. $date[] = ['name'=>'daxigssssss','age'=>11,'sex'=>0,'position'=>'啥进度55686教','mobile'=>18555888565,'hiredate'=>time()];
  7. $res = DB::table('staffs')->insert($date);
  8. var_dump($res); //返回布尔值
  9. }
  • 如果需要返回被插入数据的 id
    • insertGetId()
  1. public function insert2(){
  2. $date = ['name'=>'daxigssssss','age'=>11,'sex'=>0,'position'=>'啥进度55686教','mobile'=>18555888565,'hiredate'=>time()];
  3. $res = DB::table('staffs')->insertGetId($date);
  4. var_dump($res); // int(418)
  5. }

修改

  1. public function update(){
  2. $res = DB::table('staffs')->where('id','418')->update(["name"=>"更新测试"]);
  3. var_dump($res); // int(1) 返回受影响的行数
  4. }
  • 若要修改多个 whereIn
  1. public function update(){
  2. $res = DB::table('staffs')->whereIn('id',[416,417])->update(["name"=>"更新ghenxgin 试"]);
  3. var_dump($res); // int(2) 返回受影响的行数
  4. }

删除

  1. public function delete(){
  2. $res = db::table('staffs')->whereIn('id',[416,417])->delete();
  3. var_dump($res);// int(2) 返回受影响的行数
  4. }

4. 模型

4.1 创建模型

  • 使用 artisan 命令
  1. G:\phpstudy_pro\WWW\php11.edu\lv\laravel>php artisan make:model Staff
  2. Model created successfully.

自动创建到了 app 目录下

4.2 模型的使用

  • 一些开发者把应用的「模型」称为其所有业务逻辑的总体,而另一些人将「模型」称为与关系数据库交互的类。

  • 而 laravel 则倾向于后者 将模型称为与关系数据库交互的类

  • So:
    查询数据直接调用模型即可

  1. public function select2(Staff $staff){
  2. $res = $staff->get()->ToArray();
  3. echo "<pre>";
  4. print_r($res);
  5. }

模型如果使用all()方法返回的是一个类, 故这里要使用ToArray()方法

  • 默认情况下 模型查询的数据表为该模型类名的复数

    • Staff模型 查询 staffs数据表
  • 我们可以修改他默认的关联数据表

  1. <?php
  2. namespace App;
  3. use Illuminate\Database\Eloquent\Model;
  4. class Staff extends Model
  5. {
  6. protected $table = "staffs";
  7. }

  1. protected $table = "***";
  • 这是一个固定写法 并给他赋值

5.blade 模板引擎

  • 当 views 中的文件名加上 ***.blade.***时 将会调用 blade 引擎解析该文件 并保存到 storage/framework/views
  • 所以这里可以使用 laravel 中的某些快捷语法

例如 @foreach => php 中的 foreach

  1. ```php
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>员工列表</title>
  8. <link rel="stylesheet" href="layui/css/layui.css">
  9. </head>
  10. <body>
  11. <table class="layui-table">
  12. <thead>
  13. <tr>
  14. <th>id</th>
  15. <th>name</th>
  16. <th>age</th>
  17. <th>sex</th>
  18. <th>position</th>
  19. <th>mobile</th>
  20. <th>hiredate</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. @foreach($list as $val)
  25. <tr>
  26. <td>{{$val['id']}}</td>
  27. <td>{{$val['name']}}</td>
  28. <td>{{$val['age']}}</td>
  29. <!-- 男女 判断一下 -->
  30. <td>{{$val['sex']?"男":"女"}}</td>
  31. <td>{{$val['position']}}</td>
  32. <td>{{$val['mobile']}}</td>
  33. <!-- 时间戳转为日期 -->
  34. <td>{{date("Y-m-d h:i:s",$val['hiredate'])}}</td>
  35. </tr>
  36. @endforeach
  37. </tbody>
  38. </table>
  39. </body>
  40. </html>

这就是 laravel 的 blade 语法

  • 流程控制
  1. @if(***<***)
  2. {{ $uesr }}
  3. @else
  4. {{ $dd }}
  5. @endif
  • 关于变量的显示

如果直接在{{}}中输入的变量值中有 html 源码 则回原样输出

这样写 {!!$user!!} 即可解决此问题

  • 如果想在 html 中原样输出{{}},这样写@{{}}

6. 中间件

  • 通常有些页面需要登陆后才可以显示
  • 所以我们需要用到他

  • 需要在执行该方法之前做一个判断

中间件执行逻辑

6.1 创建中间件

使用 artisan 命令

  1. G:\phpstudy_pro\WWW\php11.edu\lv\laravel>php artisan make:middleware Index
  2. Middleware created successfully.

源码

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class Index
  5. {
  6. /**
  7. * Handle an incoming request.
  8. *
  9. * @param \Illuminate\Http\Request $request
  10. * @param \Closure $next
  11. * @return mixed
  12. */
  13. public function handle($request, Closure $next)
  14. {
  15. return $next($request);
  16. }
  17. }

handle此方法为固定写法, 在这里可以做一些判断
Closure 闭包
$requset包含了所有的请求信息

  • 中间件使用步骤 创建->注册->触发
    • 上面已经完成了创建,接下来注册

6.2 注册中间件

打开 app/Http/kernel.php 文件 注册中间件
第一个为 所有请求都要使用该中间件
第二个为 路由组使用
第三个为 自定义调用该中间件

注册到第三个中
'index'=> \App\Http\Middleware\Index::class,

6.3 触发中间件

到路由中找到需要该中间件的指令后面加一个方法 middleware()
Route::get('/dbselect2',"Home@select2")->middleware("index");

总结

所有的编辑器都会有报错!不要先怀疑自己的代码有没有问题,先去运行一下,可能并没有问题,只是编辑器误报。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议