Blogger Information
Blog 47
fans 1
comment 0
visits 52926
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP框架 - laravel基础
晴天
Original
2022 people have browsed it

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");

总结

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

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:编辑器的检查功能, 说到底是只是辅助, 可以将这些提示关掉的.. 同样, 框架也只是辅助工具, 不能全靠它
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!