## 使用composer安装;
composer create-project --prefer-dist laravel/laravel blog "5.8.*"
服务器满足要求:
PHP >= 7.1.3
OpenSSL PHP 拓展
PDO PHP 拓展
Mbstring PHP 拓展
Tokenizer PHP 拓展
XML PHP 拓展
Ctype PHP 拓展
JSON PHP 拓展
BCMath PHP 拓展
## 目录结构:
App-----包含了站点的controllers(控制器),models(模型),views(视图)和assets(资源)。这些是网站运行的主要代码,你会将你大部分的时间花在这些上面.
Bootstrap--------用来存放系统启动时需要的文件,这些文件会被如index.php这样的文件调用。
public ------这个文件夹是唯一外界可以看到的,是必须指向你web服务器的目录。它含有laravel框架核心的引导文件index.php,这个目录也可用来存放任何可以公开的静态资源,如css,Javascript,images等。
vendor ------用来存放所有的第三方代码,在一个典型的Laravel应用程序,这包括Laravel源代码及其相关,并含有额外的预包装功能的插件.
## 安装laravel提示插件:
composer require barryvdh/laravel-ide-helper
在config/app.php的providers中加入:
BarryvdhLaravelIdeHelperIdeHelperServiceProvider::class,
之后运行:
php artisan ide-helper:generate
## 连接数据库:
对于本地的开发环境,数据库配置文件 config/database.php 中的数据库相关配置就会随着 .env 文件中的对应配置项的改变而改变。而线上的生产环境中并没有 .env 文件,这样生产环境的数据库配置完全由 config/database.php 来决定。这也轻松实现了不同环境的不同配置。
## 一、首先配置路由:
```php
// 文件位置:Routes/web.php
Route::get('',function(){});
Route::post('',function(){});
// 多路由,相应制定的路由
Route::match(['get','post'],'',function(){});
// 响应所有请求的路由
Route::any('',function(){});
// 路由参数
Route::any('/index/{参数名}',function(){});
// 路由参数必填
Route::any('/index/{id}',function($id){
echo 此参数为必填
});
// 路由参数可选
Route::any('/index/{id?}',function($id = 0){
echo 此参数为可选
});
```
> *通过?传的参数不需要路由;*
// 正则匹配
```php
Route::get('user/{name?}',function($name){
return $name;
})->where('name','[A-Za-z]+');
// 路由别名
Route::get('user/center',['as'=>'center',function(){
return route('center');
}])
Route::any('/test',function(){
echo '当前别名';
})->name('名字');
// 路由群组
Route::group(['prefix'=>'admin'],function(){
//增加前缀
Route::get('/users',function(){
echo "匹配的admin/users这个URL";
});
});
// 视图
Route::get('/', function () {
return view('welcome');
});
// 控制器路由
Route::get('/','IndexController@index');
```
查看系统路由 php artisan route:llist
## 二、控制器
位置:app/Http/Controllers
命名方式:大驼峰的控制器名+Controller.php 如:GoodController.php
使用artisan命令创建控制器:
PHP artisan make:controller 控制器名字(TestController)
控制器路由:路由规则调用控制器的方法;
Route::get('/','IndexController@index');
支持分目录管理:
```php
Route::get('/','HomeIndexController@index');
Route::get('/admin/index/index','AdminIndexController@index');
```
## 接受用户输入
接受用户输入的类:IlluminateSupportFacadesInput
```php
Input::get('参数的名字','如果参数没有被传递使用该默认值');
Input::all(); 获取所有的用户的输入
Input::get(''); 获取单个的用户的输入
Input::only([]); 获取指定几个用户的输入
Input::except([]); 获取指定几个用户的输入以外的所有的参数
Input::has('name'); 判断某个输入的参数是否存在
```
如果需要使用别名引入类;----在config/app.php中创建别名;
dd()相当于var_dump();-----格式会处理dump+die;
不仅仅input可以获取;Request方法也可以获取;
## 三、模型(AR模型)
如app/user.php
php artisan make:model member
每张数据表都对应一个与该表进行交互的“Model模型”;
建议分目录进行管理
* 建立好模型后,将模型与表进行对应:
* (必选)$table属性,如果不指定默认对应复数表member-----members
* (可选)$primaryKey属性,主键名称,
* (可选)$timestamps属性,false;如果不设置false,会生成created_at和updated_at字段
* (可选)$fillable属性,插入数据时,允许插入数据库的字段
* 控制器中引入模型:
use 命名空间模型名;
* 使用方法:
```php
* Member::get();
* $model = New Member(); $model->get();
```
* 添加操作:
* AR模式
``` php
$model = New Member();
$model->age = '21'; //字段赋值
$model->save(); //保存记录
```
* 使用creat方法
```php
Member::create($request->all());
$model->create($request->all());
```
* request类的使用,需要通过形参的方式接受;与input方法类似
``` php
public function test(Request $request){
$request->all(); //
$request->input('name');
$request->only(['name1','name2']);
$request->except(['name1','name2']);
$request->has('name');
$request->get('name');
}
```
* 查询操作
* 通过主键获取一条数据
``` php
$res = Member::find(3);//通过主键获取一条数据,结果没对象;
$res = $res->toArray(); //将结果集转成数组形式,此方法是laravel自带的
```
* 获取指定条件的第一条数据
``` php
$res = Member::where("id",">",3)->first();//通过主键获取一条数据,结果没对象;
```
* 查询多行并指定字段
``` php
$res = Member::all();//all方法不支持链接其他的辅助方法
$res = Member::where('id','>',2)->get([]);
$res = Member::where('id','>',2)->select([])->get([]);
```
* 修改操作
* 首先通过find()方法查询到此数据,然后修改之后save();
* 使用update()方法;
```php
Member::where('id',22)->update([]);
```
* 删除操作
* 首先通过find()找到数据,然后使用delete()方法删除;
* 通过DB方法删除也是可以
```php
Member::where('id',2)->delete();
```
## 四、数据库
提供了DB facade(原始查找)、*查找构造器、Eloquent ORM三种操作方法
构造器自增自减:
```php
DB::table('student')->increment('字段');
DB::table('student')->decrement('字段');
```
Eloquent ORM是一个优美简洁的ActiveRecord实现数据库操作,每个数据的表都对应模型model
// DB类操作
navicat中的F6命令行
#### 增加方法:
insert();可以同时增加一条或多条,返回值是布尔类型;
insertGetId(),只能增加一条数据,返回自增ID;
```php
DB::table('无前缀表名')->insert(['name'=>'zhangsan','sex'=>0]);//单条数据;
DB::table('无前缀表名')->insert([
['name'=>'zhangsan','sex'=>0],
['name'=>'zhangsan','sex'=>0]
]);//多条数据;
$id = DB::table('无前缀表名')->insertGetId(['name'=>'zhangsan','sex'=>0]);//单条数据;
```
#### 更新方法:
update([]); 更新所有的字段,返回值为受到影响的行数;
increment('字段',值)--递增; decrement()--递减; 只是修改某个字段
where('字段','运算符','值')如果运算符为‘=’,可以不写
```php
DB::table('无前缀表名')->where('id','2')->update(['name'=>'张三丰']);
```
#### 查询方法:
* 取出基本数据
DB::table('表')->get() 相当于:select * from 表;
返回值为集合对象
获取循环数据:
```php
foreach($res as $k=>$v){
echo $v->id; //此处是对象,不是数组
}
```
配合where()方法,还有'或者'关系:orWhere()
```php
DB::table('表')->where()->orWhere()->get();
```
* 取单行数据
first()方法:返回值是一个对象;等价于limit 1;
```php
DB::table('表')->first();
```
* 取出某一行的某一个值
value()方法;
```php
DB::table('表')->where('id','2')->value('name');
```
* 获取某些字段的值
select()方法;
```php
DB::table('表')->where('id','2')->select('name','sex')->get();
```
设置别名:
```php
DB::table('表')->where('id','2')->select('name as na','sex')->get();
```
排序操作:orderBy('name','desc')
分页操作:
limit():限制输出条数;
offset(n):从第n+1条开始;
#### 删除操作(工作中使用修改代替删除)
物理删除,逻辑删除;
delete():删除记录;返回的是影响的数据;
truncate():清空整个数据表;
```php
DB::table('表')->where('id','2')->delete();
```
#### 执行任意的SQL语句
* 执行任意的insert、update、delete语句
DB::statement('');
* 执行任意的select语句
DB::select('');
-----------------------------------------
## 五、视图
* 创建(最好创建目录管理)命名方式:
新建视图:resources/views/XXXX.blade.php
使用blade.php可以使用{{$title}}方法,也可使用PHP原生语法
如果使用.php只能使用PHP原生语法
优先展示blade.php文件
* 展示视图的方法(可以分目录挂你)
控制器中加载视图;return view('home/test');
最好,一个控制器对应一个视图文件夹;
return view('home.test');
* 变量的分配和展示,将控制器中的变量分配到view中;
view(模板文件名称,数组);
view(模板文件名称)->with(数组);
view(模板文件名称)->with(名称,值)->with(名称,值)
* 使用compact方法进行参数传递,是php内置函数
compact('变量名1','变量名2'); 返回一个变量名和变量的数组;
```php
$firstname = "Peter";
$lastname = "Griffin";
$age = "41";
$name = array("firstname", "lastname");
$result = compact($name, "location", "age");//结果:Array ( [firstname] => Peter [lastname] => Griffin [age] => 41 )
```
* 模板中使用函数{{函数名}}
函数可以是PHP内置,也可是框架定义的
* 循环与判断标签
```html
@foreach($arr as $k=>$v)
{{$v->id}}
@endforeach
@if(条件表达式1)
@elseif(条件表达式2)
@else
@endif
```
* 模板继承
* 父级中设置:
@yield('content','主要内容');-------------占位符
* 子模板:
@extends('需要继承的父级模板');--------------继承
@section('content');
@endsection
* 基本使用和include();
@include('student.common',['aa'=>'asssss']);---引用其他模板,可以传变量
* 外部静态文件的引入(js/css/image)
静态文件放到public下的文件/,使用根目录
或者使用asset()方法{{asset('css/app.css')}}
## 六、CSRF攻击--跨站请求伪造
默认是开启的,所有的表单提交都需要有;
视图中增加一个csrf_token
```html
<input type="hidden" name="_token" value="<?php echo csrf_token() ?>">
```
此隐藏域等价于此函数:csrf_field();
* 全局关闭csrf:
在app/Http/Kernel.php文件中有如下配置:
注释掉// AppHttpMiddlewareVerifyCsrfToken::class
* 局部关闭:
修改appHttpMiddlewareVerifyCsrfToken.php
$except中设置不用做验证的路由
例如:'/home/*'表示排除home下的所以路由;
## 七、自动验证(重点)
* 验证方式一:(控制器验证)
Input::method()得到获取方法;
```php
public function valite(Request $request){
$this->validate($request,[
'title' => "required" //验证的规则,多个规则通过“|”隔开
]);
}
```
如果验证不通过会重定向返回原来的页面;
常用的规则有:
错误信息的输出:从session中获取错误信息;$errors变量中;可以直接在视图中显示
```html
@if(count($errors)>0)
@foreach($errors->all as $error)
{{$error}}
@endforeach
@endif
```
错误信息的转成中文,需要下载对应的语言包;网址:[https://packagist.org] laravel-lang
将下载的语言包放到resources/lang/
修改config/app.php中的配置项:'locale' => 'zh-CN',如果没有的直接修改语言包
# 其他工具使用说明
## 文件上传
* 在http请求中,使用file()方法
```php
public function tofile(Request $request){
$file = $request->file('photo');
// 或者使用下面方法:
$file = $request->photo;
// 判断是否有文件存在
$isok = $request->hasFile('photo');
// 验证文件是否上传成功
$isok = $request->file('photo')->isValid();
// 使用move(目录,文件名)方法保存文件
$path = md5(time().rand(100000,999999)).'.'.$request->file('photo')->getClientOriginalExtension()
$request->file('photo')->move('./uploads',$path);
}
```
## 数据分页
* 直接调用模型中的分页方法;Paginator.php
在数据库中分页中说明
```php
$data = Member::paginate(12);// 每页显示的条数,语法类似get()方法;
$data -> links(); // 分页数,其他类函数说明
```
## 验证码
* 安装扩展包:composer require mews/captcha
如果需要其他版本,可以在composer.json中添加版本,然后更新
```json
{
"require":{
"mews/captcha":"^2.3.0"
}
}
```
使用composer update 更新
* 修改配置config/app.php
```php
'providers' => [
MewsCaptchaCaptchaServiceProvider::class,
],
'aliases' => [
'Captcha' => MewsCaptchaFacadesCaptcha::class,
],
```
如果想用自己配置文件可以
php artisan vendor:publish 生成自己的config/captcha.php配置文件
* 应用:使用captcha_img();根据扩展中的函数进行使用;
* 验证:validator(['captcha'=>"required|captcha"]);
## 八、数据表的迁移和填充
* 迁移:创建数据表和删除数据表的操作;
* 迁移文件的位置:database/migrations
* 创建迁移文件:php artisan make:migration 迁移文件名
php artisan make:migration create_paper_table //创建表
* 编写迁移文件:
```php
// 创建表
public function up()
{
Schema::create('paper', function (Blueprint $table) {
// $table->列类型方法(字段名,[长度/值范围])->列修饰方法();
$table->bigIncrements('id');
$table->timestamps();
});
}
// 删除表
public function down()
{
Schema::dropIfExists('paper');
}
```
* 运行迁移:
* 当前项目第一次执行迁移文件:php artisan migrate:install 生成一个迁移表(高版本可以省略)
* 需要执行up()方法:php artisan migrate
* 需要执行down()方法:php artisan migrate:rollback;删除的是同批次;最新批次的表;
* 填充:往数据表了填充写入测试数据;
* 填充器位置:database/seeds
* 创建填充器:php artisan make:seeder 填充器名称【大写表名+TableSeeder】
* 编辑填充器:
```php
public function run()
{
$data = [
[
'name' => '姓名'
],
];
//写入数据,建议使用DB方法
DB::table('paper')->insert($data);
}
```
* 执行填充器文件:php artisan db:seed --class=PaparTableSeeder
## 项目初始化
* 创建laravel项目
* 建立数据库
* 设置本地化为中文
* 设置项目时区(Aisa/shanghai、Aisa/chongqing、PRC)
* 清理项目(删除不需要的文件)
* app/Http/Controllers/Auth
* database/migrations/下的文件表
* database/seeds下的文件
* resources/views/welcome.blade.php
* public下的css、js文件也可删除
* 关闭Mysql严格模式
config/database.php将static改为false
* 不支持对not null字段插入null
* 不支持对自增长字段插入“”值
* 不支持对text字段有默认值
* 安装debuger工具条(可选)
PHP版本>=7.0; 下载
### ajax
* return json_encode($data);
* return response()->json($data);
### 跳转响应
* return redirect(路由);
* return redirect()->to(路由);
### 会话控制
* session 文件位置:storage/framework/sessions
```php
use IlluminatesupportfacadesSession;
Session::get('key');
Session::put('key','value');
Session::all(); // 获取所有变量
Session::has('key');
Session::forget('key'); //删除一个变量
Session::flush(); //删除所有变量
```
### 缓存操作
* 配置在config/cache.php 文件位置:storage/framework/cache/data
* 支持的后端缓存Memcached 和 Redis 等
```php
use IlluminatesupportfacadesCache;
// 设置缓存;有效期必须设置,单位是分钟
Cache::put('key','value',$minutes);
// 获取缓存数据
Cache::get('key');
// 获取缓存数据,如没有加默认值
Cache::get('key','default');
// 获取缓存数据,如没有通过回调函数
Cache::get('key',function(){
return 'default';
});
// 只有在缓存项不存在是才添加数据到缓存,返回true,否则false
Cache::add('key','value',$minutes);
// 获取缓存项并删除
Cache::pull('key');
// 持久化存储数据到缓存,需要通过forget方法手动移除
Cache::forever('key','value');
// 移除缓存数据
Cache::forget();
// 判断缓存是否存在
Cache::has('key');
// 清除所有缓存,并删除目录
Cache::flush();
// 缓存数据的增加和减少
Cache::increment('key');
Cache::increment('key',$amount);
Cache::decrement('key');
Cache::decrement('key',$amount);
// 获取某缓存但是没有的话给个默认值并存储
Cache::remember('key',$minutes,function(){
return 'ssss';
});
Cache::rememberForever('key',function(){
return 'ssss';
});
```
### 联表查询
* 多表联合查询:
```php
DB::table('author as 别名')->join('表名 as 别名','表1字段','运算符','表2字段')->get();
// leftJoin 和 rightJoin
DB::table('author')->leftJoin('表名','表1字段','运算符','表2字段')->get();
// crossJoin 交叉连接在第一个表和被连接的表之间会生成笛卡尔积
DB::table('author')->crossJoin('colours')->get();
```
* 关联模型:
* 创建对应的模型:
* 需要将关联的方法放到主模型中;
* 定义好关联方法
```php
// 模型的关联方法:分析谁关联谁,
public function gl(){
// 一对一关联关系
return $this->hasOne('需要关联模型的命名空间模型名','被关联模型的字段','此模型的字段');
}
public function comments(){
// 一对多
return $this->hasMany('需要关联模型的命名空间模型名','被关联模型的字段','此模型的字段');
}
public function keyword(){
// 多对多,一个文章对多个关键词,一个关键词对多个文章;需要第三章关联表;
return $this->belongsToMany('需要关联模型的命名空间模型名', '关系表名', '当前模型连接表里的外键名', '被关联模型连接表里的外键名');
}
```
* 使用方法
```php
// 一对一关联关系
echo User::find(1)->gl->title;//此处的关联就是模型中的方法;title是被关联模型的字段
// 一对多
$data = User::get();
foreach($data as $k=>$v){
echo $v->id;
$comment = $v->comments;
foreach($comment as $kk=>$vv){
echo $vv->content;
}
}
// 多对多
$data = Article::get();
foreach($data as $k=>$v){
echo $v->id;
$keys = $v->keyword;
foreach($keys as $kk=>$vv){
echo $vv->content;
}
}
```
Artisan 是 Laravel 中自带的命令行工具的名称。
php artisan make:controller MsgController 创建控制器
php artisan tinker 进行测试
php artisan list 查看所有的命令
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message //显示此帮助消息
-q, --quiet Do not output any message //不输出任何消息
-V, --version Display this application version //显示此应用程序版本
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
--env[=ENV] The environment the command should run under
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 f
Available commands:
clear-compiled Remove the compiled class file //删除编译后的类文件
down Put the application into maintenance mode //使应用程序进入维护模式
dump-server Start the dump server to collect dump information. //启动转储服务器来收集转储信息
env Display the current framework environment //显示当前框架环境
help Displays help for a command //显示命令的帮助
inspire Display an inspiring quote //引用鼓舞人心的话
list Lists commands //列表命令
migrate Run the database migrations //运行数据库迁移
optimize Cache the framework bootstrap files //缓存框架引导文件
preset Swap the front-end scaffolding for the application //将前端支架替换为应用程序
serve Serve the application on the PHP development server //在PHP开发服务器上提供应用程序
tinker Interact with your application //与应用程序交互
up Bring the application out of maintenance mode //使应用程序脱离维护模式
app
app:name Set the application namespace //设置应用程序名称空间
auth
auth:clear-resets Flush expired password reset tokens //刷新过期的密码重置令牌
cache
cache:clear Flush the application cache //刷新应用程序缓存
cache:forget Remove an item from the cache //从缓存中删除一个项
cache:table Create a migration for the cache database table //为缓存数据库表创建迁移
config
config:cache Create a cache file for faster configuration loading //创建一个缓存文件,以便更快地加载配置
config:clear Remove the configuration cache file //删除配置缓存文件
db
db:seed Seed the database with records //用记录种子数据库
event
event:cache Discover and cache the application's events and listeners //发现并缓存应用程序的事件和侦听器
event:clear Clear all cached events and listeners //清除所有缓存的事件和侦听器
event:generate Generate the missing events and listeners based on registrati //基于registrati生成缺少的事件和侦听器
event:list List the application's events and listeners //列出应用程序的事件和监听器
ide-helper
ide-helper:eloquent Add Eloquent helper to EloquentModel //将“有说服力”助手添加到“有说服力”模型中
ide-helper:generate Generate a new IDE Helper file. //生成一个新的IDE帮助文件。
ide-helper:meta Generate metadata for PhpStorm //为PhpStorm生成元数据
ide-helper:models Generate autocompletion for models //为模型生成自动完成
key
key:generate Set the application key //设置应用程序键
make
make:auth Scaffold basic login and registration views and routes //脚手架基本的登录和注册视图和路由
make:channel Create a new channel class //创建一个新的channel类
make:command Create a new Artisan command //创建一个新的Artisan命令
make:controller Create a new controller class //创建一个新的控制器类
make:event Create a new event class //创建一个新的事件类
make:exception Create a new custom exception class //创建一个新的自定义异常类
make:factory Create a new model factory //创建一个新的模型工厂
make:job Create a new job class //创建一个新的job类
make:listener Create a new event listener class //创建一个新的事件监听器类
make:mail Create a new email class //创建一个新的email类
make:middleware Create a new middleware class //创建一个新的中间件类
make:migration Create a new migration file //创建一个新的迁移文件
make:model Create a new Eloquent model class //创建一个新的有说服力的模型类
make:notification Create a new notification class //创建一个新的通知类
make:observer Create a new observer class //创建一个新的观察者类
make:policy Create a new policy class //创建一个新的policy类
make:provider Create a new service provider class //创建一个新的服务提供者类
make:request Create a new form request class //创建一个新的表单请求类
make:resource Create a new resource //创建新资源
/public"
vendor
vendor:publish Publish any publishable assets from vendor packages //发布来自供应商包的任何可发布资产
view
view:cache Compile all of the application's Blade templates //编译应用程序的所有刀片服务器模板
view:clear Clear all compiled view files //清除所有已编译的视图文件