laravel笔记

## 使用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 //清除所有已编译的视图文件  
原文地址:https://www.cnblogs.com/ziyandeyanhuo/p/12023863.html