Laravel框架 笔记

Laravel框架 中文文档

环境开发和配置要求

  • PHP >= 7.1.3

  • OpenSSL PHP

  • PHP PDO 扩展

  • PHP Mbstring 扩展

  • PHP Tokenizer 扩展

  • PHP XML 扩展

    • extension=php_xmlrpc.dll
  • PHP Ctype 扩展

  • PHP JSON 扩展

  • php.ini 配置文件需要开启的扩展文件

    • extension=php_openssl.dll

    • extension=php_pdo_mysql.dll

    • extension=php_mbstring.dll

    • extension=php_fileinfo.dll (验证码代码依赖扩展)

    • extension=php_curl.dll (主要用于请求的发送)

  • httpd.conf 配置文件需要开启的模块

    • LoadModule deflate_module modules/mod_deflate.so
    • LoadModule rewrite_module modules/mod_rewrite.so

安装 Composer

Laravel 使用 Composer 来管理项目依赖。

  • 本地安装

    -安装之前需要配置好配置环境 找到php.exe 复制文件路径

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2DVRXDgP-1573614237316)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573611207644.png)]

  • 配置环境变量

    • 我的电脑->右键->属性->高级系统设置->环境变量
    • 选择系统变量点击path 新增

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rT7WcS5x-1573614237318)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573611328147.png)]

  • 开始安装Composer-Setup.exe

    • 直接Next
    • 环境变量配置成功的话 出现

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CrsjvyZT-1573614237318)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573611403230.png)]

    -直接一直Next即可

  • 安装后cmd 运行 composer

- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gxkT5ek6-1573614237319)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573611474343.png)]

  • 到此安装成功

使用 composer 方式部署laravel 项目

  • 切换到国内镜像

    镜像用法

    有两种方式启用本镜像服务:

    • 系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中。见“方法一”
    • 单个项目配置: 将配置信息添加到某个项目的 composer.json 文件中。见“方法二”

    方法一: 修改 composer 的全局配置文件**(推荐方式)**

    打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:

    复制

    composer config -g repo.packagist composer https://packagist.phpcomposer.com
    
  • 在对应目录下运行cmd

composer create-project --prefer-dist laravel/laravel ./blog
  • 指定版本号(5.4.*) *表示5.4.最新的版本
composer create-project --prefer-dist laravel/laravel=5.4.* ./blog

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GwaKmBSS-1573614237321)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1573612620369.png)]

通过 Laravel 安装器

首先,通过使用 Composer 安装 Laravel 安装器:

composer global require "laravel/installer"

确保将 composer vender bin 目录放置在你的系统环境变量 $PATH 中,以便系统可以找到 Laravel 的可执行文件。该目录根据您的操作系统存在不同的位置中;一些常见的配置包括:

  • macOS: $HOME/.composer/vendor/bin
  • GNU / Linux 发行版: $HOME/.config/composer/vendor/bin

安装完成后, laravel new 命令会在您指定的目录创建一个全新的 Laravel 项目。例如, laravel new blog 将会创建一个名为 blog 的目录,并已安装好所有的 Laravel 依赖项:

laravel new blog

项目目录

在这里插入图片描述

storage\framework缓存

启动方式

  • Larvael 框架提供了更简单的方式启动项目(相比配置apche)
    • 执行命令:php artisan server
    • 必须在 artisan 目录下
    • 不推荐使用
      • 能够跑PHP代码但是启动服务器
      • 该方法启动后,如果修改了项目配置.env的话,则需要重新启动项目
  • 用wamp环境(虚拟主机)(推荐使用)
    • 通过phpStudy 配置站点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kzKXhQJ1-1574220823158)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574211681883.png)]

  • 或者直接找到 vhosts.conf 配置文件 进行配置
<VirtualHost *:80>
    DocumentRoot "D:\laravel\blog\public"
    ServerName php.li
    ServerAlias gohosts.com
  <Directory "D:\laravel\blog\public">
      Options FollowSymLinks ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
     Require all granted
  </Directory>
</VirtualHost>
  • 配置后找到C:\Windows\System32\drivers\etc 下的 host 文件

    -线上叫DNS域名解析

    • 到最后添加

    • 127.0.0.1  php.li
      
  • 最后重启phpstudy

  • 浏览器输入配置好的域名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFgCFuBm-1574220823159)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574212274146.png)]

路由

  • 路由管理文件 项目目录 routes下的 web.php
<?php
// 请求方式为get 请求网站根路径
Route::get('/', function () {
	// 显示试图页面 试图页面在项目 resources/views/下
    return view('01');
});

  • 理由的请求方式

Route::post($url,$callback);
Route::pust($url,$callback);
Route::patch($url,$callback);
Route::delete($url,$callback);
Route::options($url,$callback);    
  • 当即要get又要post时 可以使用 match 或者 any
  • match 要使用什么方式就放到数组中
  • any 使用所有请求方式
Route::match(['get','post'],'/',function(){
    //
})
Router::any("/",function(){
    //
})
  • 路由参数

  • 必须参数

    <?php
    
    // 必填参数
    Route::get('/{id}', function ($id) {
    	echo "id为".$id;
    });
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eLcIdBCs-1574220823159)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574215276169.png)]

  • 选填参数
//选填参数 加个?号            不传默认为空 预付报错
Route::get('/home/{id?}', function ($id = "") {
	echo "id为".$id;
});
  • 不推荐以上参数方式
  • 推荐 127.0.0.1/home?id=111 的形式
Route::get('/home', function () {
	echo "id为".$_GET["id"];
});

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9CgWiR6d-1574220823160)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574215485745.png)]

  • 给路由起别名

    • name("别名")
    • 调用该路由可以写成:route(“名字”)
Route::get('/home', function () {
	echo "id为".$_GET["id"];
}) -> name("ABC");
  • 查看所有路由

    • 在项目下运行 cmd 收入

    • php artisan route:list
      

    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1KZwpWg-1574220823165)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574215796458.png)]

  • 路由群组

    • 当 home/ 下有多个请求时 如 home/index home/getUser gome/setMe
    • 共同点都有 home/前缀
    • 使用prefix 属性来指定路由前缀
Route::group(['prefix' => "home"],function(){
	Route::get("index",function(){
		echo "匹配的是127.0.0.1/home/index";
	});
	Route::get("getUser",function(){
		echo "匹配的是127.0.0.1/home/getUser";
	});
	Route::get("setMe",function(){
		echo "匹配的是127.0.0.1/home/setMe";
	});
});

控制器使用

  • 目录: 项目目录/app/Http/Controllers

  • 控制器命名规则: 首字母大写、驼峰命名法、最后加是controller.php

    • 列如:TextController.php
  • 创建控制器

    • 项目目录下通过artisan命令行来生成文件
      • php artisan make:controller 控制器名 + controller
        • L列如: php artisan make:controlle TextContoller

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1EF0DU2D-1574220823166)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574220105033.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WRjV9Iwp-1574220823166)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574217992196.png)]

  • 控制器路由

    • 在控制器中调用相应方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S6bEjqLS-1574220823167)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574219736074.png)]

    • 在路由管理 web.php 中
    //语法:Route::请求方式("路由表达式","控制器@方法名")
    //  "/home/test/show"  --》 home下的test下的show方法
    Route::get("/home/test/show","TextController@show");
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-peo3QpPD-1574220823168)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574220301753.png)]

  • 控制器分目录管理

    • 创建语法:php artisan make:controller Admin\IndexController

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uAiaswRq-1574220823169)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574220510225.png)]

    • ​ 分目录要用反斜杠 Home\IndexController
      • php artisan make:controller Home\IndexController

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4KV3iKkC-1574220823169)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574220690456.png)]

  • 分目录路由
    在这里插入图片描述
	Route::get("/admin/index/index","Admin\IndexController@index");
	Route::get("/home/index/index","Home\IndexController@index");

在这里插入图片描述

input 获取用户输入 (获取get传过来的信息)

在这里插入图片描述

  • ` input::get('参数的名字‘,‘如果没有被传递使用默认值’)
<?php
//引入 input
use Illuminate\Support\Facades\input;

Route::get('/Home',function(){
	$a = input::get("id");
	var_dump($a);
	echo "<br/>";
	dd($a); //dd 相当于 var_dump 和 die() dd是Laravel中才有
});

在这里插入图片描述

  • input::all() 获取所有的get参数
<?php
//引入 input
use Illuminate\Support\Facades\input;

Route::get('/Home',function(){
	$a = input::all("id");
	var_dump($a);
	echo "<br/>";
	dd($a); //dd 相当于 var_dump 和 die() dd是Laravel中才有
});

在这里插入图片描述

  • input::only([]); 获取指定的参数如: input::only(['id'])
  • input::except([]) 获取指定的参数以外的所有参数
  • input::has('name') 判断某个参数是否存在

上面的方法既可以获取get的参数 也可以获取post 的参数

Db类 操作数据库

  • 数据表的配置
    数据库的基本配置在 项目跟目录的 .env文件中
    在这里插入图片描述
    在这里插入图片描述
  • 增 (insert)

在这里插入图片描述

public function add(){
		//获取要操作的数据表 插入一维数组
		$text = DB::table("study") -> insert([
			"name" => "小明",
			"age" => 18,
			"emily" => "xiaoming@qq.com"
		]);
		//输出返回的结果
		dd($text);	
	}

在这里插入图片描述

  • 插入二维数组
    在这里插入图片描述
  • 改 (upDate)

在这里插入图片描述

  • 修改id为1的姓名
public function upDate(){
		//获取数据表
		$db = DB::table("study");
		
		$text = $db -> where("id","=","1") -> update([
			"name" => "大明"
		]);
		
		echo "返回结果为受影响的行数";
		dd($text);
	}

在这里插入图片描述
在这里插入图片描述

  • where() 条件

    • 单条件
    •   DB::table("study") -> where("id","=","1") -> update([])  
      
    • 并且语法 (and) 关系语法
    •   DB::table("study") -> where()->where()->where()
      
    • 或者语法 (or) 关系语法
      • orWhere 参数 与 where一样
    •   DB::table("study") -> where()->orWhere()->oWhere()
      
    • get() 获取所有数据

    •   get获取到的数据 是以对象的形式获取的 不是数组
      
public function select(){
		$data = DB::table('study') ->get();
		foreach($data as $key => $value) {
			echo "id:{$value -> name},姓名:{$value-> age},邮箱:{$value -> emily}<br/>";
		}
		dd($data);
		
	}

在这里插入图片描述

  • first()

    • 获取单条数据 返回值是一个对象
    • 有条件时 取出满足条件的第一条数据 等价于 limit 1
public function select(){
		$db = DB::table('study');
		$data1 = $db -> where("id",">","2") -> where("age",">","18") -> first();
		dd($dat11);
}
  • value() 取出某个字段的值

$date = DB::table("study") -> where("id","1") -> value("name");
  • select() 取出多个指定字段的值

$date = DB::table("study") -> where("id","1") -> select("name","age","emily") -> get();
										//起别名
$date = DB::table("study")  -> select("name as userName","age","emily") -> get();

在这里插入图片描述

  • 排序

$data = DB::table("study") ->orderBy('Id','desc')->get();

在这里插入图片描述

$data1 = DB::table("study") ->orderBy('age','asc')->get();

在这里插入图片描述

  • 分页

在这里插入图片描述

						//重第二条开始数一条 包含第二条
$data1 = DB::table("study") ->limit(2)->offset(1)->get();

在这里插入图片描述

  • 删 delete()

在这里插入图片描述

  • 执行容易的SQL语句

在这里插入图片描述

试图操作

试图目录
在这里插入图片描述

  • 试图文件 命名规则 name.blade.php
    在这里插入图片描述
  • 变量分配与展示

    • view(‘模板名称’,‘数组’)
    • view(模板文件名称)->with(数组)
    • view(模板文件名称)->with(名称,值)->(名称,值)
      在这里插入图片描述
    • 使用compact() 方法传参
      在这里插入图片描述
      在这里插入图片描述
  • 试图模板中使用函数
    • 语法 {{ 函数名(参数,参数,.....) }}
    • 函数名必须是已经申明好了的
      在这里插入图片描述
  • 循环与判断标签

    • foreact 循环

  语法格式
  @foreach ($data as $vkey => $value )
  	循环体
  @endforeach

在这里插入图片描述

  • if 判断

语法格式
@if(条件)
	代码
@elseif(条件)
 	代码
 @else
 	代码
 @endif

在这里插入图片描述

  • 模拟继承与包含

    • 继承

编写父级模板

  • 定义父级模板语法 @yield('名字')
  • 应入模板语法 @extends('模板文件路径')
  • 标签绑定区块:
   @section('名字')
   	html内容
   @endsection

在这里插入图片描述
在这里插入图片描述

  • 包含(引入模板)

在这里插入图片描述
在这里插入图片描述

  • 外部静态文件引入(了解)

在这里插入图片描述

项目中两种方式都可以使用

在这里插入图片描述

CSRF 攻击

在这里插入图片描述
在这里插入图片描述

上面的请求地址不同 Laravel防CSRF攻击 默认是开启的 会出现如下报错

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 针对 csrf_token() 简化 csrf_filed()
    在这里插入图片描述

在这里插入图片描述

  • 从 csrf 中校验中排除列外路由
    在这里插入图片描述

VerifyCsrfToken.php

<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
   
    protected $except = [
        //填写要排除的csrf校验 的路由
		"/home/text/text1",
		"/home/text/text2"
    ];
}
 protected $except = [
        //填写 * 排除所有的 csrf校验 的路由
		"*"
    ];

模型的操作 (AR模式)【理解】

在这里插入图片描述

创建语法

	php artisan make:model  模型名称

在这里插入图片描述

模型的存储路径 在项目目录的 app 目录下
在这里插入图片描述

  • 模型的规则
    在这里插入图片描述
<?php
namespace App\Home;
use Illuminate\Database\Eloquent\Model;
class IndexMode extends Model
{
    //必选 定义模型关联的数据表 (一个模型通常只关联一个数据表)
	protected $table = "study";
	//定义主键 (可选)
	protected $primaryKey = "Id";
	// 定义禁止操作时间 
	public $timestamps = false;
	//设置允许写入的数据字段
	protected $fillable = ['Id','name','age','emily'];
}
  • 模型的引用
    在这里插入图片描述

  • 模型的使用方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    $reques 语法 (获取用户提交参数的数据) 与input相类似

    • $reques->all();
    • $reques->input(‘name’);
    • $reques->only([‘name1’,‘name2’…])
    • $reques->except([‘name1’,‘name2’…])
    • $reques->has(‘name’)
    • $reques->get(‘name’)
  • 模型 新增数据 (create)

在这里插入图片描述

  • 模型 查数据

查询方法与DB 基本相同

  • get() 与 toArray()
    在这里插入图片描述
  • where
    在这里插入图片描述
    在这里插入图片描述
  • 模型修改数据

    • AR模式修改
      在这里插入图片描述
      在这里插入图片描述
    • update 修改
      在这里插入图片描述
  • 模型删除

    • AR 模式
      在这里插入图片描述
      在这里插入图片描述
  • delete
	$row = IndexHome::where("Id","3") -> delete();
    //返回受影响的行数
    dd($row);

表单自动验证

在这里插入图片描述

  • 基本验证规则

在这里插入图片描述

 public function text3(Request $Request){
	   if (input::method() == "POST"){
			   //配置规则
		   $this->validate($Request,[
						//不能为空 |最小2个字|最大100个
			   'name' => 'required|min:2|max:8',
			   'age' => 'required|min:1|max:100',
			   'emily' => 'required|email'
		   ]);
	   } else {
			return view('/Home/goIndex');
	   }   
   }
  • 错误提示信息

在这里插入图片描述

		@if (count($errors) > 0)
			<div class="alert alert-danger">
				<ul>
					@foreach ($errors->all() as $error)
						<li>{{ $error }}</li>
					@endforeach
				</ul>
			</div>
		@endif
		<form action="" method="post">
			<p>请输入姓名:<input type="text" name="name"></p>
			<p>请输入年龄:<input type="text" name="age"></p>
			<p>请输入邮箱:<input type="email" name="emily"></p>
			{{ csrf_field() }}
			<p><input type="submit" value="提交"> </p>
		</form>
  • 把输出结果输出成中午

网址:https://packagist.org/?query=laravel-lang

在这里插入图片描述
安装 composer require caouecs/laravel-lang:~3.0 指定版本
composer require caouecs/laravel-lang 不限定版本
在这里插入图片描述

安装后 文件目录
在这里插入图片描述
复制到
在这里插入图片描述
修改配置文件 app.php 文件中的配置项locale改成需要的语言简写
在这里插入图片描述

自定义翻译 文件路径
在这里插入图片描述

在这里插入图片描述

文件的上传

  • file
// Symfony\Component\HttpFoundation\File\UploadedFile类

// 判断请求中是否包含name=file的上传文件
    $file=$request->hasFile('file');


// 文件上传过程中是否出错
    $file->isValid();


// 获取原来的名字
$file->getClientOriginalName();


  // 扩展名
$file->getClientOriginalExtension();

 // 临时绝对路径
$realpath=$file->getRealPath();

//mime类型
$file->getClientMimeType();

// 转移实例目录
$file->move($destPath,$filename);

// Illuminate\Support\Facahes\Storage
Storage::disk('uploads')->put($filename,file_get_contents($realpath))

//public路径
public_path('uploads');

文件目录操作

File::exists('path');

// 获取文件内容
File::getRequire('path');

/ 将内容写入文件
File::put('path', 'contents');

// 将内容添加在文件原内容后
File::append('path', 'data');

// 通过给定的路径来删除文件
File::delete('path');


// 将文件复制到新目录下
File::copy('path', 'target');


// 从文件的路径地址提取文件的扩展
     File::extension('path');
// 获取文件类型
     File::type('path');
// 获取文件大小
     File::size('path');

// 获取一个目录下的所有文件, 以数组类型返回
 File::files('directory');

// 递归式删除目录
 File::deleteDirectory('directory', $preserve = false);


// 清空指定目录的所有文件和文件夹
 File::cleanDirectory('directory');

view

<form action="" method="post" enctype="multipart/form-data">
		<p>姓名:<input type="text" name="name" placeholder="请输入姓名"></p>
		<p>年龄:<input type="text" name="age" placeholder="请输入年龄"></p>
		<p>邮箱:<input type="emily" name="emily" placeholder="请输入邮箱"></p>
		<input type="file" name="sartar" />
		{{ csrf_field() }}
		<p><input type="submit" value="提交"></p>
	</form>

路由 Route::any(’/home/text/text5’,‘TextController@text5’);

模型

<?php

namespace App\Home;

use Illuminate\Database\Eloquent\Model;

class IndexMode extends Model
{
    //定义模型关联的数据表 (一个模型通常只关联一个数据表)
	protected $table = "study";
	//定义主键 (可选)
	protected $primaryKey = "Id";
	// 定义禁止操作时间 
	public $timestamps = false;
	//设置允许写入的数据字段
	protected $fillable = ['Id','name','age','emily','sartar'];
}

controller


namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\input;
//引入模型
use App\Home\IndexMode;
class TextController extends Controller
{
   public function text5(Request $Request){
	   if (input::method() == "POST"){
		   //获取数据 'name','age','emily'
			$data = $Request -> only(['name','age','emily']);	
			
			$file = $Request->file('sartar');
				// 此时 $this->upload如果成功就返回文件名不成功返回false
					$fileName = $this->upload($file);
					if ($fileName){
						$data['sartar'] = $fileName	;
						//保存到数据库
						dd(IndexMode::create($data));
					}
					return '上传失败';
		
			
	   }
	   
	  return view('/Home/text5');
   }
   public function upload($file, $disk='public') {
			
           // 1.是否上传成功
           if (! $file->isValid()) {
              return false;
           }
   
           // 2.是否符合文件类型 getClientOriginalExtension 获得文件后缀名
           $fileExtension = $file->getClientOriginalExtension();
           if(! in_array($fileExtension, ['png', 'jpg', 'gif','jpeg'])) {
			   
               return "文件类型错误";
			   die();
           }
   
           // 3.判断大小是否符合 2M
           $tmpFile = $file->getRealPath();
           if (filesize($tmpFile) >= 2048000) {
               return "文件过大";
			   die();
           }
   
           // 4.是否是通过http请求表单提交的文件
           if (! is_uploaded_file($tmpFile)) {
               return "提交错误";
			   die();
           }
   
           // 5.每天一个文件夹,分开存储, 生成一个随机文件名
           $fileName = date('Y_m_d').'/'.md5(time()) .mt_rand(0,9999).'.'. $fileExtension;
		   $filePate = "/upload/".date('Y_m_d');
		   if ($file ->move($filePate,$fileName)){
			   //返回文件目录
			   return '/upload/'.$fileName;
		   }
           
       }
}

分页

在这里插入图片描述

  • 使用
    在这里插入图片描述
 public function text6(){
 			//数据模型::paginate(1) 一个页面一条数据
		   $data = IndexMode::paginate(1);
		   return view('Home/text6',compact('data'));
	   }

在这里插入图片描述

  • 显示分页 按钮
    在这里插入图片描述
<table border="1">
			<tr>
				<td>姓名</td>
				<td>年龄</td>
				<td>邮箱</td>
				<td>头像</td>
			</tr>
			@foreach ($data as $value)
			<tr>
				<td>{{ $value -> name }}</td>
				<td>{{ $value -> age }}</td>
				<td>{{ $value -> emily }}</td>
				<td><img src="{{ ltrim($value -> sartar,".") }}" width="50px" alt=""></td>
			</tr>
			@endforeach		
		</table>
		//显示分页链接
		{{ $data ->links() }}

在这里插入图片描述

  • 修改链接模板
    在这里插入图片描述
    在这里插入图片描述

  • 分页链接默认是没有样式 将下面样式添加到试图中

 #pull_right{
	            text-align:center;
	        }
	        .pull-right {
	            /*float: left!important;*/
	        }
	        .pagination {
	            display: inline-block;
	            padding-left: 0;
	            margin: 20px 0;
	            border-radius: 4px;
	        }
	        .pagination > li {
	            display: inline;
	        }
	        .pagination > li > a,
	        .pagination > li > span {
	            position: relative;
	            float: left;
	            padding: 6px 12px;
	            margin-left: -1px;
	            line-height: 1.42857143;
	            color: #428bca;
	            text-decoration: none;
	            background-color: #fff;
	            border: 1px solid #ddd;
	        }
	        .pagination > li:first-child > a,
	        .pagination > li:first-child > span {
	            margin-left: 0;
	            border-top-left-radius: 4px;
	            border-bottom-left-radius: 4px;
	        }
	        .pagination > li:last-child > a,
	        .pagination > li:last-child > span {
	            border-top-right-radius: 4px;
	            border-bottom-right-radius: 4px;
	        }
	        .pagination > li > a:hover,
	        .pagination > li > span:hover,
	        .pagination > li > a:focus,
	        .pagination > li > span:focus {
	            color: #2a6496;
	            background-color: #eee;
	            border-color: #ddd;
	        }
	        .pagination > .active > a,
	        .pagination > .active > span,
	        .pagination > .active > a:hover,
	        .pagination > .active > span:hover,
	        .pagination > .active > a:focus,
	        .pagination > .active > span:focus {
	            z-index: 2;
	            color: #fff;
	            cursor: default;
	            background-color: #428bca;
	            border-color: #428bca;
	        }
	        .pagination > .disabled > span,
	        .pagination > .disabled > span:hover,
	        .pagination > .disabled > span:focus,
	        .pagination > .disabled > a,
	        .pagination > .disabled > a:hover,
	        .pagination > .disabled > a:focus {
	            color: #777;
	            cursor: not-allowed;
	            background-color: #fff;
	            border-color: #ddd;
	        }
	        .clear{
	            clear: both;
	        }

在这里插入图片描述

  • 验证码

https://packagist.org/?query=captcha
要求:
php: ^7.2
开启GD库
同时需要开启php_fileinfo.dll and php_mbstring.dll

在这里插入图片描述

安装 :
改镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com

cmd运行:composer require mews/captcha

修改配置文件:config/app.php
配置provider 信息

'providers' => [
        // ...
        Mews\Captcha\CaptchaServiceProvider::class,
    ]

在这里插入图片描述

配置别名

  'aliases' => [
        // ...
        'Captcha' => Mews\Captcha\Facades\Captcha::class,
    ]

基本使用

  • 返回图片
    • captcha();
    • Captcha::create();
  • 返回url 路径
    • captcha_src();
    • Captcha::src(‘default’);
  • 返回HTML
    • captcha_img();
    • Captcha::img();

如果需要自定义配置,则需要生成配置文件
cmd 项目根目录运行:php artisan vendor:publish
生成后目录:config/captcha.php

  • 案例
//表单的自动验证
		@if (count($errors) > 0)
			<div class="alert alert-danger">
				<ul>
					@foreach ($errors->all() as $error)
						<li>{{ $error }}</li>
					@endforeach
				</ul>
			</div>
		@endif
		<form action="" method="post">
			<p>请输入姓名:<input type="text" name="name"></p>
			<p>请输入年龄:<input type="text" name="age"></p>
			<p>请输入邮箱:<input type="email" name="email"></p>
			<p>请输入验证码:<input type="text" name="captcha"></p>
			<!-- //验证码图片 -->
			<img src="{{ captcha_src() }}" alt="">
			{{ csrf_field() }}
			<p><input type="submit" value="提交"> </p>

路由 Route::any(’/home/text/text3’,‘TextController@text3’);

	public function text3(Request $Request){
		   if (input::method() == "POST"){
				   //配置校验规则
			   $this->validate($Request,[
							//不能为空 |最小2个字|最大100个
				   'name' => 'required|min:2|max:8',
				   'age' => 'required|min:1|max:100',
				   'email' => 'required|email',
							//captcha 校验验证码
				   'captcha' => 'required|captcha'
			   ]);
		   } else {
				return view('/Home/goIndex');
		   }	   
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在数组中添加captcha即可
在这里插入图片描述

迁移文件的创建于编写

在这里插入图片描述
改目录的默认两个迁移文件建议删除

创建迁移文件语法:php artisan make:migration 迁移文件名
迁移文件无需目录管理

在这里插入图片描述

案列

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePaperTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
       Schema::create('paper', function (Blueprint $table) {
          //自增的主键id
		   $table->increments('id');
		   //试卷名称,唯一,varchar(100),不能为空
           $table -> string('paper_name','100') -> notNull() -> unique();
		   //试卷总分,整形数字,tinyint类型 不能空
           $table - >tinyInteger('total_score') -> default(100);
		   //试卷开始考试时间 时间戳类型 (整型int)
		   $table -> integer('start_time') -> nullable();
		   //考试时间长度,单位分钟,整型tinyint
			$table -> tinyInteger('duration');
			//试卷是否启用状态1表示启用2表示禁用
			$table -> tinyInteger('status')-> default(1);
       });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
      Schema::dropIfExists('password_resets');
    }
}
  • 执行迁移文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mQNIXb5p-1575114251987)(F:/md note/img/image-20191129192849461.png)]

​ 执行 php artisan migrate:install 会生成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CGdslF9F-1575114251990)(F:/md note/img/image-20191129193152567.png)]

​ 执行 php artisan migrate

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OoIW902G-1575114251996)(F:/md note/img/image-20191129194606547.png)]

  • 删除(回滚)

    • 不删除迁移文件 只删除记录和对应数据表

​ php artisan migrate:rollback

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sdm8ZzJT-1575114251999)(F:/md note/img/image-20191129194925667.png)]

  • 填充器(种子文件)的创建于编写

    ​ 填充操作就是数据表写参数数据的操作 (增加操作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUgb2aQB-1575114252000)(F:/md note/img/image-20191129195249794.png)]

  • 创建填充器

    • 语法 php artisan make:seeder 填充器名称 【约定俗称的语法 大写表面+TableSeeder】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hfHXMWGN-1575114252002)(F:/md note/img/image-20191129195832468.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vS2IlSOt-1575114252003)(F:/md note/img/image-20191129200117167.png)]

<?php

use Illuminate\Database\Seeder;

class PaperTableSeeder extends Seeder
{
    public function run()
    {
        $data = [
			[
				'paper_name'    =>  '五年高考,三年模拟',
				'start_time'	=>	strtotime('+7 days'),
				'duration'		=>	'120'
			],
			[
				'paper_name'    =>  '黄冈密卷',
				'start_time'	=>	strtotime('+7 days'),
				'duration'		=>	'120'
			],
			[
				'paper_name'    =>  'XXX高中期中考试试卷',
				'start_time'	=>	strtotime('+7 days'),
				'duration'		=>	'120'
			]
		];
		DB::table('paper') -> insert($data);
    }
}

  • 执行填充器文件

    • 命令: php artisan db:seed --class 需要执行的种子文件(不要.php)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxufRJhk-1575114252004)(F:/md note/img/image-20191129202751856.png)]

​ 填充器的执行操作没有回滚一说,没有删除,如果需要回滚,则可以手动亲空对应的数据表

ajax 的相应

<button id="btn">点击</button>
	<script src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.js"></script>
	<script>
		$(function($){
			$('#btn').click(function (){
				$.ajax({
					url:'/home/text/text7_ajax',
					type:'get',
					dataType:'json',
					success:function (res){
						console.log(res);
					}
				})
			})
		})
	</script>
public  function text7(){
		   return view('Home/text7');
	   }
	   public function text7_ajax(){
		   $data = IndexMode::all();
		   // php 返回json数据
		   // return json_encode($data);
		   
		   //laravel 框架 返回json数据
		   return response() -> json($data);
	   }

在这里插入图片描述

会话控制 (记忆)

  • session

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arCme2Y2-1575194244974)(F:/md note/img/image-20191201133347229.png)]

  • Laravel session 常用操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjvwBnAR-1575194244985)(F:/md note/img/image-20191201133448025.png)]

		//session 会话控制
		// use Session ....
		public function text8(){
			//设置Session
			Session::put('name',"小明");
			//获取Session
			echo '获取session-》'.Session::get('name');
			//获取session获取 如果没有返回默认值
			echo "<br/>";
			echo '获取失败返回默认值-》'.Session::get('age','not session');
			// echo Session::get('agee',function (){ return "没有";});
			//
			//删除
			Session::forget('name');
		}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q01twq72-1575194244986)(F:/md note/img/image-20191201134439897.png)]

缓存操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TA7IDRP1-1575194244987)(F:/md note/img/image-20191201134507156.png)]

  • 1.设置缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wCpXnwOU-1575194244988)(F:/md note/img/image-20191201143216477.png)]

			//设置存储数据 name  有效期10分钟
			Cache::put("name","小小明",10);
  • 2.获取缓存数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kf5JWulV-1575194244989)(F:/md note/img/image-20191201143508135.png)]

			//获取
			echo  Cache::get("name");
			//获取 如果不存在 返回默认值
			echo "<br/>";
			echo Cache::get("name1","这家伙很懒,什么都没有留下");
  • 3.删除数据缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDmybaAM-1575194244990)(F:/md note/img/image-20191201143713188.png)]

			//删除数据
			Cache::forget("name");
			//从缓存中获取数据然后删除
			Cache::put("name2","获取后删除",10);
			echo "<br/>";
			echo Cache::pull("name2");
			//删除所有
			Cache::flush();
  • 4.数据缓存的递增/递减

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n610V0jT-1575194244997)(F:/md note/img/image-20191201144327654.png)]

//默认每次递增1
			Cache::increment('key');
			//每次递增10
			Cache::increment('key',10);
			//每次递减10;
			Cache::decrement('key',10);
  • 5.获取并存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rYT2gGzE-1575194244998)(F:/md note/img/image-20191201144831688.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYdi54UI-1575194244999)(F:/md note/img/image-20191201144840897.png)]

连表查询案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9CNKOpR-1575194244999)(F:/md note/img/image-20191201160650839.png)]

​ 迁移文件 2019_12_01_071055_create_article_table.php

Schema::create('article',function(Blueprint $table){
			$table -> increments("id");
			$table -> string('article_name',100) -> notNull();
			$table -> integer('author_id') -> notNull();
		});

​ 迁移文件 2019_12_01_071253_create_author_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAuthorTable extends Migration
{

    public function up()
    {
        Schema::create('author',function(Blueprint $table){
			$table -> increments("id");
			$table -> string("author_name") -> notNull();
		});	
    }
    public function down()
    {
       Schema::dropIfExists('author');
      
    }
};

​ 填充器:authorAndAarticleTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class authorAndAarticleTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('article')->insert([
			[
				'article_name' => '我有棒棒糖你要嘛',
				'author_id'    => rand(1,3)
			],
			[
				'article_name' => '就是不给你',
				'author_id'    => rand(1,3)
			],
			[
				'article_name' => '哈哈!骗你的',
				'author_id'    => rand(1,3)
			]
		]);
		
		DB::table('author')->insert([
			['author_name' => '新浪网'],
			['author_name' => '和讯网'],
			['author_name' => '网易']	
		]);
		
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIJ20EhM-1575194245001)(F:/md note/img/image-20191201160939022.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2FFC579n-1575194245002)(F:/md note/img/image-20191201161034666.png)]

public function text10(){
			// sql语句
			//seclec t1.id,t1.article_name,t2.author_name from article as t1 left join author as t2 on ti.article_name = t2.id
			
			//laravel leftJoin
			
			$data = DB::table("article as t1") -> select("t1.id","t1.article_name","t2.author_name") -> leftJoin("author as t2","t1.author_id","=", "t2.id") -> get();
			dd($data);
		}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRJjqqR1-1575194245004)(F:/md note/img/image-20191201163038205.png)]

关联模型

在这里插入图片描述

  • 一对一关系

在这里插入图片描述

CreateArticleTable 迁移文件

public function up()
    {
        Schema::create('article',function(Blueprint $table){
			$table -> increments("id");
			$table -> string('article_name',100) -> notNull();
			$table -> integer('author_id') -> notNull();
		});
    }

CreateAuthorTable 迁移文件

 public function up()
    {
        Schema::create('author',function(Blueprint $table){
			$table -> increments("id");
			$table -> string("author_name") -> notNull();
		});
		
    }

authorAndAarticleTableSeeder 填充器

public function run()
    {
        DB::table('article')->insert([
			[
				'article_name' => '我有棒棒糖你要嘛',
				'author_id'    => rand(1,3)
			],
			[
				'article_name' => '就是不给你',
				'author_id'    => rand(1,3)
			],
			[
				'article_name' => '哈哈!骗你的',
				'author_id'    => rand(1,3)
			]
		]);
		
		DB::table('author')->insert([
			['author_name' => '新浪网'],
			['author_name' => '和讯网'],
			['author_name' => '网易']	
		]);
		
    }

ArtcleMode 模型

<?php

namespace App\Home;

use Illuminate\Database\Eloquent\Model;

class ArtcleModeextends Model
{
    protected $table = 'author';
}

AuthorMode 模型

<?php

namespace App\Home;

use Illuminate\Database\Eloquent\Model;

class AuthorMode extends Model
{
    protected $table = 'author';
}

在这里插入图片描述

在ArtcleMode 模型中

namespace App\Home;

use Illuminate\Database\Eloquent\Model;

class ArtcleMode extends Model
{
    protected $table = 'article';
	
	//模型的关联操作	(一对一) 函数名为要关联的表模型的小写名
	public function author(){
	//hasOne('要关联的表模型空间地址','被关联模型的关系字段','本模型关联的关系字段')
	return $this -> hasOne('App\Home\AuthorMode','id','author_id');
	}
}

路由 /home/text/test21

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 一对多

    • 案例 一篇文章有多个评论

CommentTable 迁移文件

 public function up()
    {
        Schema::create('comment',function(Blueprint $table){
			$table -> increments('id');
			$table -> string('comment') -> notNull;
			$table -> tinyInteger('article_id');
		});
    }	

commentTableSeefer 填充器

use Illuminate\Database\Seeder;

class commentTableSeefer extends Seeder
{
  
    public function run()
    {
		DB::table("comment") -> insert([
			[
				"comment" => "巴拉巴拉巴拉巴拉我是一条评论",
				"article_id" => rand(1,3),
			],
			[
				"comment" => "巴拉巴拉巴拉巴拉我是一坨评论",
				"article_id" => rand(1,3),
			],
			[
				"comment" => "巴拉巴拉巴拉巴拉我是一堆评论",
				"article_id" => rand(1,3),
			],
			[
				"comment" => "巴拉巴拉巴拉巴拉我是一行评论",
				"article_id" => rand(1,3),
			],
		]);	
    }
}

在这里插入图片描述

CommentMode 表模型

namespace App\Home;

use Illuminate\Database\Eloquent\Model;

class CommentMode extends Model
{
    protected $table = "comment";
}

在ArtcleMode 模型中

//模型的关联操作	(一对多
	public function comment(){
			//hasMany('要关联的表模型空间地址','被关联模型的关系字段','本模型关联的关系字段')
		return $this -> hasMany('App\Home\CommentMode','article_id','id');
	}

路由 /home/text/text12

//关联模型 一对d多
		public function text12(){
			$data = \App\Home\ArtcleMode::get();
			foreach ($data as $key => $value){
				echo "文章为:".$value -> article_name . "评论有:"."<br/>";
				//获取当前评论下的全部评论挨个输出
				foreach($value -> comment as $k => $v){
					echo "&nbsp;" . $v -> comment ."<br/>";
				}
			}
		}

在这里插入图片描述

  • 多对多

    • 案例 一篇文章有多个标签 一个标签有多个文章

在这里插入图片描述
在这里插入图片描述

CreateKeywordTable 迁移文件
在这里插入图片描述
CreateRelationTable 迁移文件
在这里插入图片描述
KeywordAndRelationSeeder 填充器
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

keywordMode 模型表

namespace App\Home;

use Illuminate\Database\Eloquent\Model;

class keywordMode extends Model
{
    protected $table = "keyword";
}

  在ArtcleMode 模型中
//模型的关联操作	(多对多
	public function keyword(){
			// belongToMany('被关联的表模型空间地址','多对多模型的关系表名','当模型中的关系键','被关联模型的关系键')
		return $this->belongSToMany('App\Home\keywordMode','relation','article_id','key_id');
	}

路由 /home/text/text13

//模型的关联操作	(多对多
	public function keyword(){
			// belongToMany('被关联的表模型空间地址','多对多模型的关系表名','当模型中的关系键','被关联模型的关系键')
		return $this->belongSToMany('App\Home\keywordMode','relation','article_id','key_id');
	}

在这里插入图片描述

faker 数据填充

packagist文档:https://packagist.org/packages/fzaninotto/faker

在这里插入图片描述

常用数据:https://www.cnblogs.com/hjcan/p/11551216.html

迁移文件
在这里插入图片描述
填充器

<?php

use Illuminate\Database\Seeder;

class managerTableSeeder extends Seeder
{
    public function run()
    {
        //生成faker实例                zh_CN 设置为中文区域
		$faker = \Faker\Factory::create('zh_CN');
		//循环生成数据
		$data = [];
		for($i = 0; $i < 100; $i++){
			$data[] = [
				'username'		=>	$faker -> name($gender = null|'male'|'female'), //生成用户名(姓名)
				'password'		=>	bcrypt('123456'),   //生成用户名
				'grender'		=>	rand(1,3),			//随机性别
				'moblie'		=>	$faker -> phoneNumber, //手机号
				'email'			=>  $faker -> email,			//邮箱
				'role_id'		=>	rand(1,6),			//角色ID
				'created_at'	=>	date("Y-m-d H:i:s",time()), //创建时间
				'status'		=>	rand(1,2) //账号状态
			];
		}
		DB::table('manager') -> insert($data);
    }
}

执行填充文件
在这里插入图片描述
在这里插入图片描述

Laravel Auth用户认证

配置文件 在config/auth.php

  • 如图分别配置 guards 和 providers

在这里插入图片描述

数据表模型 文件

namespace App\Admin;

use Illuminate\Database\Eloquent\Model;

class Manager extends Model 
{
    protected $table = "manager";

    
}

数据库
在这里插入图片描述

  • 开始使用
    在这里插入图片描述
//继续开始进行身份验证
			$data = $Request -> only(['username','password']);
			$data['status'] = '2'; //要求状态为启动的用户
			//传递给 guard 方法的 guard 名称对应配置文件 auth.php 中 guards 配置的某个键|| $Request -> get('online') 保持登录状态
			$result = Auth::guard('manager') -> attempt($data,$Request -> get('online')); 
			if ($result) {
				return 	redirect('/admin/public/index');
			} else {
				return redirect('/admin/public/login') -> withErrors([ //返回错误信息给MessageBag	实例
					"loginError"		=> "用户名或密码错误",
				]);
			}
 //判断是否登录
if (Auth::guard('manager') -> check()) {
    // 用户已登录...
}
// 获取当前已认证的用户...
$user = Auth::guard('manager') -> user();

// 获取当前已认证的用户 ID...
$id = Auth::guard('manager') -> id();

使用datatables插件实现列表的无刷新分页

Datatables插件是一款基于jQuery框架进行开发的无刷新分页插件,其除了分页还有排序、搜索等功能。
官网:https://www.datatables.net/
该分页插件有2种形式:客户端分页方式、服务端分页方式(limit)
在这里插入图片描述
在这里插入图片描述

  • 使用客户端分页方式实现分页
    • 使用步骤:
      ①先在确保引入jQuery之后,再去引入datatables的JavaScript文件;
      ②需要初始化datatables插件
      ③【可选】databtables支持一些扩展的配置

    • ①引入对应的文件
      在这里插入图片描述

    • ②初始化DT插件

    • 语法:$(选择器).dataTable();
      在这里插入图片描述

    • ③【可选】针对当前的情况来进行一些配置
      a. 禁用掉第一列(复选框)排序
      b. 更改默认的初始化排序操作
      在这里插入图片描述
      提示:后期需要用到这些配置项代码,不建议去记忆,用的时候直接百度搜索即可。

实现效果:
在这里插入图片描述

中间件

  • 创建语法

php artisan make:middleware isLogin
在这里插入图片描述
在这里插入图片描述

  • 将中间件配置到Route路由上
    在这里插入图片描述
    配置
  • 给需要中间件的路由用上中间件
    在这里插入图片描述
  • 屏蔽到中间件
    在这里插入图片描述
  • 中间件中
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值