一、Laravel是什么?
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
功能特点:
1、语法更富有表现力
2、高质量的文档
3、丰富的扩展包
4、开源、托管在GITHUB上
二、安装步骤
1.安装PHP以及Composer
本文使用的laravel版本:8.47.0
composer安装参考:Composer 安装与使用
2.修改Composer镜像
修改 composer 的全局配置文件(文档有两种方式修改,这里使用官方推荐的方式进行修改)
打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
2022-3-1:在部署laravel项目时出现了
更换了镜像就安装成功了
新镜像:composer config -g repo.packagist composer https://packagist.org
3.Composer部署Laravel项目
创建项目语法:
打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:
- 安装最新版本
composer create-project laravel/laravel --prefer-dist ./asin
- 安装指定版本
composer create-project laravel/laravel=8.4.* --prefer-dist ./asin
命令解释:
composer:表示执行composer程序
create-project:通过composer去创建项目
laravel/laravel::需要创建的项目名称
--prefer-dist:优先下载压缩包方式,而不是直接从github上下载源码(clone)
./:表示创建的项目目录名称,也可以是一个目录名(这里最好在./后面加上一个文件夹名,好新建一个项目文件夹)
文件目录:
cmd界面:
1.安装的laravel版本是v8.5.20,如果不指定版本号默认是安装最新版本
2.如果安装过程没有变化的情况,可以尝试按下Enter键
4.目录结构分析
(1)app目录:项目的核心目录,主要用于存放核心代码,也包括控制器、模型。
- 比如控制器存放如下位置 app/http/controllers
- 模型文件存放位置,模型文件直接写在Models目录即可,但是也可以在该目录下建立其他目录用于专门存放模型文件,例如建立 Admin目录专门存放后台需要的模型文件,建立Home 目录存放前台模型文件目录
(2)bootstrap目录:laravel启动目录
autoload.php文件用于自动载入需要的类文件
(3)config目录:项目的配置目录,主要存放配置文件,比如数据库的配置
部分文件用处:
App.php:项目主要配置文件;
Auth.php:用于定义用户认证(登录)的配置文件;
Database.php:针对数据库的配置;
Filesystems.php:上传文件、文件断储需要使用到的配置文件;
(4)database目录:数据迁移目录
存储跟数据表相关的操作类文件(迁移文件【创建数据库的类文件】、种子文件【存放一些数据表的数据填充文件】)。
(5)public目录:项目的入口文件和系统的静态资源目录(css、img、js、uploads)
后期使用的外部静态文件(js、css、图片等)都需要放到Public目录下
重点是项目单一入口的文件也在这个目录下,因此后续配置虚拟主机的时候需要将站点位置指定到public下。
(6)resources目录:存放视图文件,还有语言包文件的目录
lang目录:语言包目录(如果项目需要本地化则需要配置语言包)
views目录:视图文件存储目录(视图文件也可以分目录管理)
(7) routes目录:是定义路由的目录,web.php是定义路由的文件
(8) storage目录:主要是存放缓存文件和日志文件,注意,如果在linux环境下,该目录需要有可写权限。(后期用户上传文件如果存在本地则也在storage下)
app目录:存放用户上传的文件
framework目录:存放框架运行时的缓存文件
logs目录:日志目录
(9) vendor目录:主要是存放第三方的类库文件,laravel思想主要是共同的开发,不要重复地造轮子(例如,里面可能存在验证码类,上传类,邮件类),该目录还存放laravel框架的源码。注意如果要使用 composer 软件管理的,composer下载的类库都是存放在该目录下面的。
(10) .env文件:主要是设置一些系统相关的环境配置文件信息,cofig目录里面的文件配置内容一般都是读取该文件里面的配置信息( config里面的配置项的值基本都是来自.env文件)
(11) artisan脚手架文件 :主要用于生成的代码的(自动生成),比如生成控制器,模型文件等
执行命令:#php artisan 需要执行的指令
要求1:php必须添加环境变量,并且保证版本;
要求2:artisan必须存在命令行当前的工作路径下;
(12) composer. json依赖包配置文件:声明当前需要的软件依赖,但是不能删除, composer需要使用
(13) 需要重点掌握的目录(频繁使用)
目录 | 作用 |
---|---|
app | 保存模型文件(默认) |
app / Http / Controllers | 保存控制器文件 |
resources / views | 保存视图文件 |
config | 配置文件目录 |
routes | 存放路由文件 |
database / migrations | 存放数据库迁移文件(操作数据表结构) |
database / seeds | 存放数据库种子文件(模拟测试数据) |
5.项目启动方式(推荐使用方式二)
方式一:cmd命令(cmd当前地址,需指向项目目录位置)
php artisan serve
弹出以下界面,即可访问:http://127.0.0.1:8000
项目启动成功:
不推荐使用:
①能执行PHP代码,但是不启动数据库
②使用该方式启动后,如果修改了项目的配置.env的话,则需要重新启动才会生效
方式二:使用 wamp 或 lamp 环境
我这边使用的是PhpStudy进行项目发布。
(1)虚拟主机配置:
根目录是指向项目的 public目录 哦
(2)修改hosts文件:
根据这个地址找到hosts文件
C:\Windows\System32\drivers\etc
不知道什么情况在我找到drivers目录后,里面没有显示任何东西(包括etc目录),显示隐藏文件选项也打开了,也看不到对应的选项后面是使用了Everything文件搜索hosts才找出来的,可以打开,但是目录里还是没有东西,就很迷惑,目前也没找到这个问题是怎么出现的
2022-3-1:phpstudy在创建后会同步hosts,不需要自己去配置,创建完重启下服务即可
我自身的解决方式:是将Everything搜索出来的hosts文件复制到桌面上(没有权限修改的解决方式),然后修改里面的内容,保存,然后再复制hosts文件粘贴到上面跳转路径的etc目录,会提示覆盖文件操作,选确定覆盖了就好了,再重启一下PhpStudy中的Apache,使用上方定义的域名就可以访问了。
三、路由规则的使用
- 路由配置文件:routes \ web.php
- 在web.php中配置路由(重点)
- laravel的语法严格,报错时多注意看是否有缺少分号 ‘;’
1.默认根路由
2.路由定义格式
Route:: 请求方式(请求的URL,匿名函数或控制响应的方法)
自定一个路由
(1)laravel访问二级页面404问题解决方案
我在这里出现了一个问题,当我在浏览器中输入 项目域名/home 时,浏览器返回的是404的报错,虽然不太了解具体是什么问题,但是还是找到了解决方式。
传送门:解决 laravel 添加url 出现404错误
3.请求方式都有哪些
Route::get($uri, Callback)
Route::post($uri, callback)
Route::put($uri, callback)
Route::patch($uri, Callback)
Route::delete($uri, Callback)
Route::options($uri, Callback)
有时候需要注册路由响应多个 HTTP 请求——可以通过match方法来实现,或用 any 方法注册一个路由来响应所有HTTP请求:
// math:匹配
// any:任意
Route::match(['get', 'post'], '/', function() {
});
Route::any('foo', function() {
});
常用的记住四个:get / post / match / any
Get表示支持get请求方式的路由
Post表示支持pot请求方式的路由;
Match表示匹配固定(自己定义)的请求方式的路由
Any表示匹配任意请求方式的路由
语法上 math 比 get / post / any 多一个参数
Route:match(匹配的请求类型, 地址, 回调)
匹配请求类型要求是数组格式的声明(建议使用短数组)
4.路由参数传递(推荐使用第三种)
(1)必选参数
有时我们需要在路由中捕获URI片段,比如,要从URL中捕获用户ID,需要通过如下方式定义路由参数:
Route::get('user/{id}', function($id) {
return 'User' . $id;
});
路由参数的传递通过路由地址中的" {参数名} “的形式来进行传递,该形式是必选参数的形式,可以选的则使用” {参数名?} "。
(2)可选参数
有时候可能需要指定可选的路由参数,这可以通过在参数名后加一个”?”标记来实现,这种情况下需要相应的变量指定默认值:
//可选参数
Route::any('user11/{id?}', function($id = '47') {
echo '可选参数的UserID是:' . $id;
});
(3)通过?的形式进行参数传递
可不需要去编写路由,直接进行参数传递
//通过?的形式传递get参数
Route::any('user3', function() {
echo '通过?的形式传递的UserID是:' . $_GET['id'];
});
5.路由别名
路由别名相当于在路由定义的时候,为路由起了一个别名,在以后的程序中可以通过这个别名来获取路由的信息。
// -> name('名字')
Route::any('user3', function() {
echo '通过?的形式传递的UserID是:' . $_GET['id'];
}) -> name('zhansan');
调用该路由则可以写成:route(‘名字’);
查看系统已经有的路由命令:#php artisan route:list
6.路由群组(理解)
当URL都有 /admin 做前缀,为了管理方便,可以把他们放到一个路由分组中。
使用prefⅸ属性指定路由前缀,比如,你想要为所有路由URIs前面添加前缀 admin
语法:Route:group(公共属性数组, 回调函数)
在后期会接触到 middlevare 属性(中间件)
// 路由群组
Route::group(['prefix' => 'admin'], function() {
Route::get('test1', function() {
echo '你好,我是test1';
// 匹配 "/admin/test1" URL
});
Route::get('test2', function() {
echo '你好,我是test2';
// 匹配 "/admin/test2" URL
});
Route::get('test3', function() {
echo '你好,我是test3';
// 匹配 "/admin/test3" URL
});
});
四、控制器使用
1.控制器文件位置
…\app\Http\Controllers
2.控制器命名
命名方式:
大驼峰的控制器名 + Controller.php
3.创建控制器
cmd 指令(两种方式)
php artisan make:controller [路径 + 控制器名 / 控制器名]
<?php
// (命名空间的三元素:常量、方法、类)
// 声明命名空间
namespace App\Http\Controllers;
// 引入
use Illuminate\Http\Request;
// 类继承
class TestController extends Controller
{
//
}
4.控制器路由
即,如何使用路由规则调用控制器下的方法,而不再走回调函数。
路由设置格式基本相同,只是将匿名函数换成“控制器类名@方法名”
laravel8 定义格式:(注意版本哟)
Route:请求方式(‘URL路径’, [控制器名::class, ‘方法名’]);
// web.php
// 引入命名空间
use App\Http\Controllers\TestController;
// 路由定义
Route::get('/home/test/test1', [TestController::class, 'test1']);
遇到的一个小问题:项目中的app目录是以小写字母的形式呈现,而命名空间所引入的App,首位字母是大写,导致我使用VsCode复制文件相对路径:app\Http\Controllers\TestController用作引入无法访问,给出无法找到的错误,换成App\Http\Controllers\TestController才可进行访问,对于这里可能是我本身不够熟悉laravel
5.控制器分目录管理
①先建立相关的区分目录
②创建控制器文件(使用artisan命令创建)
③编写测试代码
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TestController;
// 引入
use App\Http\Controllers\Home;
use App\Http\Controllers\Admin;
// 调用
Route::get('/home/test1', [Home\IndexController::class, 'test1']);
Route::get('/home/test1', [Admin\IndexController::class, 'test1']);
五、DB类操作数据库(重点)
1.创建数据库
CREATE TABLE test1(
id INT PRIMARY KEY auto_increment,
name VARCHAR(32) NOT NULL,
age TINYINT UNSIGNED NOT NULL,
email VARCHAR(32) NOT NULL
) ENGINE myisam CHARSET utf8;
2.数据库在laravel框架中的配置
在.env文件中
注意:如果是 php artisan serve方式启动的,修改了配置文件,则需要重新启动,才能读取修改后的配置文件;如果是 wamp / lamp等环境则不需要重启。
3.数据库操作
在test控制器中引入DB
在app.php中已经定义别名为:DB,可以直接引入,不需要写太长的命名空间
TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// 引入DB
use DB;
class TestController extends Controller
{
public function addTest() {
echo 'add';
}
public function deleteTest() {
echo 'delete';
}
public function updateTest() {
echo 'update';
}
public function selectTest() {
echo 'select';
}
}
web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TestController;
Route::group(['prefix' => 'home/admin'], function() {
Route::get('add', [TestController::class, 'addTest']);
Route::get('delete', [TestController::class, 'deleteTest']);
Route::get('update', [TestController::class, 'updateTest']);
Route::get('select', [TestController::class, 'selectTest']);
});
(1)增加(insert)
向数据库增加数据
语法:
DB::table('表名):操作的表名
insert(数组):同时添加多条或一条数据,返回值:布尔值
insertGetId():只可插入一条数据,返回值:自增id
public function addTest() {
// 定义关联操作的表
//链式操作
//DB::table('test1') -> insert();
$db = DB::table('test1');
// 使用insert增加记录
$result = $db -> insert([
[
'name' => '锤石',
'age' => '55',
'email' => 'chuishi@163.com'
],
[
'name' => '卢锡安',
'age' => '23',
'email' => 'luxian@163.com'
],
[
'name' => '塞纳',
'age' => '21',
'email' => 'saina@163.com'
],
]);
$result = $db -> insertGetId([
'name' => '死歌',
'age' => '111',
'email' => 'saina@163.com'
]);
dd($result);
}
(2)修改(update)
语法:共三种方式
update():可以修改整个记录中的全部字段
increment():用于修改数字字段的数值(递增)
decrement():用于修改数字字段的数值(递减)
返回值:受到影响的行数
update(数组)
increment(字段, 数值): 字段需为数字类型,每次运算增加相应数值,不写数值时运算一次 +1
decrement(字段, 数值): 字段需为数字类型,每次运算减少相应数值,不写数值时运算一次 -1
increment()、decrement() ,存在局限性 [ 典型的应用:记录登录次数、单一数值的递增或递减]
Where语法:(条件,运算符为“ = ”时,可省略不写)
where(字段, 运算符, 值) 这个语法是并且(and)关系语法
orWhere(字段, 运算符, 值) 这个语法是或者(or)关系语法
public function updateTest() {
// 修改id为1的名字为亚斯塔娜
$db = DB::table('test1');
// $result = $db -> where('id', '1')
$result = $db -> where('id', '=', '1') -> update([
// 需要修改字段的键值对
'name' => '亚斯塔娜'
]);
dd($result);
}
(3)查询(select)
查询全部数据
get():查询全部数据,返回值:结果集
public function selectTest() {
$db = DB::table('test1');
// 查询全部数据
$data = $db -> get();
// $value 类型为对象
foreach($data as $key => $value) {
echo "id是:{$value -> id},名字是{$value -> name},邮箱是:{$value -> email}<br/>";
}
}
有条件限制的查询结果
where() 跟 get() 一起使用
public function selectTest() {
$db = DB::table('test1');
// 查询id > 2的数据
$data = $db -> where('id', '>', '2') -> get();
foreach($data as $key => $value) {
echo "id是:{$value -> id},名字是{$value -> name},邮箱是:{$value -> email}<br/>";
}
}
取出单行数据
语法:
first(),返回值:对象(等价于limit 1)
public function selectTest() {
$db = DB::table('test1');
// 取出单行数据
$data = $db -> where('id', '>', '1') -> first();
dd($data);
}
获取某个字段的值(一个字段)
语法:
value(‘字段’):返回值:第一条数据
public function selectTest() {
$db = DB::table('test1');
// 获取name字段
$data = $db -> where('id', '2') -> value('name');
dd($data);
}
```php
获取某些字段的值(多个字段)
语法:
select(‘字段1’, ‘字段2’, ‘…’)
public function selectTest() {
$db = DB::table('test1');
// 获取某些字段的值(多个字段)
$data = $db -> select('id', 'name as username') -> get();
dd($data);
}
排序操作
语法:
orderBy(‘字段’, ‘[asc, desc]’)
public function selectTest() {
$db = DB::table('test1');
// 按年龄降序排序
$data = $db -> orderBy('age', 'desc') -> get();
dd($data);
}
分页操作
语法:
limit(数字):表示限制输出的条数
offset(数字):从什么地方开始
public function selectTest() {
$db = DB::table('test1');
// 分页操作
// limit(3):限制输出3条数据
// offset(1):第一个数据去除,从第二个数据开始
$data = $db -> limit(3) -> offset(1) -> get();
dd($data);
}
(4)删除(delete)
在删除中,有两种删除方式:物理删除(本质就是删除数据)、逻辑删除(本质是修改数据)
一些数据来之不易,实际操作中很少会使用物理删除,一般都是通过逻辑删除使用户看不见就可以了,实际上数据依旧存在,这里了解下删除功能怎么实现就可以了
语法:
delete():删除匹配的数据,返回值:受影响的行数
public function deleteTest() {
$db = DB::table('test1');
// 删除id为3的数据
$result = $db -> where('id', '3') -> delete();
dd($result);
}
删除全部数据,仅保留表结构(了解即可)
语法:
truncate():返回值:不明,运行结果返回的是null
public function deleteTest() {
$db = DB::table('test1');
// 删除全部数据,仅保留表结构
$result = $db -> truncate();
dd($result);
}
(5)执行自定义的SQL语句(了解即可)
语法:
- 执行任意的 insert、update、delete 语句[影响记录的语句使用 statement 语法]
DB::statement(‘insert、update、delete 语句’);
- 执行任意的 select 语句[不影响记录的语句使用 select 语法]
$res = DB::select(‘select 语句’);
public function selectTest() {
// 自定义查询语句
$data = DB::select('select * from test1');
dd($data);
}
public function updateTest() {
// 修改id为1的名字为易大师
$result = DB::statement("update test1 set name = '易大师' where id = 1");
dd($result);
}
总结
本意是用来给自己记录一些学习的事情,忘了的时候也可以翻一翻,加深下印象,文章有错误的地方拜托各位指出,有错会尽快修改的。
以上资料来自B站视频教程(传送门),视频是使用的Laravel5.x的版本,与现在Lara8有很多语法不同,这个需要注意:PHP web开发教程4天全面深入浅出Laravel 框架,快速网站开发必备技能