laravel 5.6入门
文章目录
- 第一章:laravel安装
- 第二章:laravel目录结构介绍
- 第三章:laravel路由
- 第四章:laravel 控制器
- 第六章 HTTP请求
- 第七章 HTTP响应
- 第八章 Cookie
- 第九章 Session
- 第十章 视图
- 第十一章 Blade 模板引擎
- 第十二章 Laravel 数据库
- 第十二章 Laravel 表单验证
- 1. 使用 Validator
- 2. 判断验证是否通过
- 3. 获取错误信息
- 4. 常用的几种验证规则
- 5. 自定义验证规则
- 第十三章 Laravel 配置文件
- 1. 配置文件有两个地方
- 第十四章 Laravel 全局「辅助」PHP 函数
- 第十五章 Laravel 上传图片
- 第十六章 Laravel 验证码
- 第十七章 Laravel 日志
- 第十八章 Laravel artisan 命令
- 第十九章 Laravel 类别名
第一章:laravel安装
1. 安装方法一:homestead 虚拟机
2. 安装方法二:composer安装
环境要求
PHP >= 7.1.3
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
XML PHP Extension
Ctype PHP Extension
JSON PHP Extension
-
首先:安装composer 修改为中国镜像
-
其次:composer安装框架
- 第一种:laravel安装器:
- composer global require “laravel/installer”
- 进入到项目目录执行
laravel new xxxproject
- 第二种:直接创建目录:执行
composer create-project --prefer-dist laravel/laravel xxxproject
- 第一种:laravel安装器:
-
最后,修改nginx配置
-
首先,配置根目录到项目目录的public下
-
其次,添加如下代码:
location / { try_files $uri $uri/ /index.php?$query_string; }
-
第二章:laravel目录结构介绍
- 目录介绍:
app //应用目录 代码基本都在这里写
bootstrap //框架启动文件 路由缓存目录
config //框架的配置目录
database //数据库目录 数据迁移以及种子
public //框架入口文件 以及静态文件
resources //资源目录 视图文件未编译的jscss
routes //路由目录
storage //存储目录 编译模板 日志等。。
tests //测试文件
vendor //composer依赖包
.env //环境配置文件
artisan //命令行使用文件
第三章:laravel路由
1. 基本路由 Route:
构建最基本的路由只需要一个 URI 与一个 闭包Route::get('foo', function () {});
-
默认路由文件
Route::get('/user', 'UserController@index');
-
可用的路由方法
路由器允许你注册能响应任何 HTTP 请求的路由:请求方式包含[get/post/put/delete/patch/options];有的时候你可能需要注册一个可响应多个 HTTP 请求的路由,这时你可以使用 match 方法,也可以使用 any方法注册一个实现响应所有 HTTP 请求的路由规则:
Route::match(['get', 'post'], '/', $callback); Route::any('foo', $callback);
-
CSRF 保护
指向 web 路由文件中定义的 POST、PUT 或 DELETE 路由的任何 HTML 表都应该包含一个 CSRF 令牌字段,否则,这个请求将会被拒绝。
<form method="POST" action="/profile"> @csrf //或 {{ csrf_field() }} {{ method_field(方法名)}} </form>
取消csrf保护:app/Http/Middleware/VerifyCsrfToken.php
protected $except = ['your/route'];
-
redirect() 重定向路由:
Route::redirect('/here', '/there', 301);
-
view() 视图路由
其中前两个是必填参数,分别是 URI 和视图名称。第三个参数选填,可以传入一个数组,数组中的数据会被传递给视图:
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
2. 路由参数:
- 必填参数:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {});
- 可选参数:
Route::get('user/{nane?}',function($name='123'){});
- 过滤参数正则:
Route::get('user/{ids?}',function($ids){
return $ids;
})->where(‘ids’,‘[a-z]+’); //多个参数过滤 后面加数组
- 全局约束:
某个具体的路由参数都遵循同一个正则表达式的约束,就使用 pattern 方法在 RouteServiceProvider 的 boot 方法中定义这些模式:
public function boot(){
Route::pattern('id', '[0-9]+');
parent::boot();
}
一旦定义好之后,便会自动应用这些规则到所有使用该参数名称的路由上
3. 路由命名:
路由指定了名称后,就可以使用全局辅助函数 route 来生成链接或者重定向到该路由:
Route::get('user/{id}/profile', function ($id) {})->name('profile');
$url = route('profile', ['id' => 1]);// 生成 URL...
return redirect()->route('profile'); // 生成重定向...
- 检查当前路由:
判断当前请求是否指向了某个路由,你可以调用路由实例上的 named 方法。例如,你可以在路由中间件中检查当前路由名称:
/**
*处理一次请求。
*@param \Illuminate\Http\Request $request
*@param \Closure $next
*@return mixed
*/
public function handle($request, Closure $next){
if ($request->route()->named('profile')) {}
return $next($request);
}
4. 路由组
路由组允许你在大量路由之间共享路由属性,例如中间件或命名空间,而不需要为每个路由单独定义这些属性。共享属性应该以数组的形式传入 Route::group 方法的第一个参数中。
- 中间件
要给路由组中所有的路由分配中间件,可以在 group 之前调用 middleware 方法,中间件会依照它们在数组中列出的顺序来运行:
Route::middleware(['first', 'second'])->group(function () {
// 一下两个路由均使用 first 和 second 中间件
Route::get('/', function () {});
Route::get('user/profile', function () {});
});
- 命名空间
另一个常见用例是使用 namespace 方法将相同的 PHP 命名空间分配给路由组的中所有的控制器:
Route::namespace('Admin')->group(function () {
// 在 "App\Http\Controllers\Admin" 命名空间下的控制器
});
请记住,默认情况下,RouteServiceProvider 会在命名空间组中引入你的路由文件,让你不用指定完整的 App\Http\Controllers 命名空间前缀就能注册控制器路由。因此,你只需要指定命名空间 App\Http\Controllers 之后的部分。
- 子域名路由
路由组也可以用来处理子域名。子域名可以像路由 URI 一样被分配路由参数,允许你获取一部分子域名作为参数给路由或控制器使用。可以在 group 之前调用 domain 方法来指定子域名:
Route::domain('{account}.myapp.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {});
});
- 路由前缀
可以用 prefix 方法为路由组中给定的 URL 增加前缀。例如,你可以为组中所有路由的 URI 加上 admin 前缀:
Route::prefix('admin')->group(function () {
// 匹配包含 "/admin/users" 的 URL
Route::get('users', function () {});
});
- 路由名称前缀
name 方法可以用来给路由组中的每个路由名称添加一个给定的字符串。 例如,您可能希望以 「admin」为所有分组路由的名称加前缀。 给定的字符串与指定的路由名称前缀完全相同,因此我们将确保在前缀中提供尾部的 . 字符:
Route::name('admin.')->group(function () {
// Route assigned name "admin.users"...
Route::get('users', function () {})->name('users');
});
5. 路由模型绑定
当向路由或控制器行为注入模型 ID 时,就需要查询这个 ID 对应的模型。Laravel 为路由模型绑定提供了一个直接自动将模型实例注入到路由中的方法。例如,你可以注入与给定 ID 匹配的整个 User 模型实例,而不是注入用户的 ID。
- 隐式绑定
在如下这个例子中,由于 $user 变量被类型提示为 Eloquent 模型 App\User,变量名称又与 URI 中的 {user} 匹配,因此,Laravel 会自动注入与请求 URI 中传入的 ID 匹配的用户模型实例。如果在数据库中找不到对应的模型实例,将会自动生成 404 异常。
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
- 自定义键名
如果你想要模型绑定在检索给定的模型类时使用除 id 之外的数据库字段,你可以在 Eloquent 模型上重写 getRouteKeyName 方法:
/**
*获取该模型的路由的自定义键名。
*@return string
*/
public function getRouteKeyName(){
return 'slug';
}
- 显式绑定
要注册显式绑定,使用路由器的 model 方法来为给定参数指定类。在 RouteServiceProvider 类中的 boot方法内定义这些显式模型绑定:
public function boot(){
parent::boot();
Route::model('user', App\User::class);
}
接着,定义一个包含 {user} 参数的路由:
Route::get('profile/{user}', function (App\User $user) {});
6. 回退路由
使用 Route::fallback 方法,你可以定义在没有其他路由匹配传入请求时执行的路由。通常,未处理的请求会通过应用程序的异常处理程序自动呈现 “404” 页面。但是,因为你可以在 routes/web.php 文件中定义 fallback 路由,web 中间件的所有中间件都将应用到路由中。当然,你也可以根据需要向这条路由中添加额外的中间件:
Route::fallback(function () {});
7. 访问控制
Laravel 包含了一个 中间件 用于控制应用程序对路由的访问。如果想要使用,请将 throttle 中间件分配给一个路由或一个路由组。throttle 中间件会接收两个参数,这两个参数决定了在给定的分钟数内可以进行的最大请求数。 例如,让我们指定一个经过身份验证并且用户每分钟访问频率不超过 60 次的路由:
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {});
});
- 动态访问控制
你可以根据已验证的 User 模型的属性指定动态请求的最大值。 例如,如果你的 User 模型包含rate_limit属性,则可以将属性名称传递给 throttle 中间件,以便它用于计算最大请求计数:
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
Route::get('/user', function () {});
});
8. 表单方法伪造
HTML 表单不支持 PUT、PATCH 或 DELETE 行为。所以当你要从 HTML 表单中调用定义了 PUT、PATCH 或 DELETE 路由时,你将需要在表单中增加隐藏的 _method 输入标签。使用 _method 字段的值作为 HTTP 的请求方法:
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token()}}">
</form>
//你也可以使用 @ method Blade 指令生成 _method 输入:
<form action="/foo/bar" method="POST">
@method('PUT')
@csrf
</form>
9. 访问当前路由
你可以使用 Route Facade 上的 current、currentRouteName 和 currentRouteAction 方法来访问处理传入请求的路由的信息:
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();
如果你想知道所有可访问的方法,可以查看 API 文档,了解 Route facade and Route 实例 的基础类。
10. 路由缓存
如果你的应用只使用了基于控制器的路由,那么你应该利用路由缓存。 使用路由缓存将极大地减少注册所有应用路由所需的时间。某些情况下,路由注册的速度甚至会快100倍。
# 需要执行 Artisan 命令
php artisan route:cache #要生成路由缓存
php artisan route:clear #清除路由缓存
第四章:laravel 控制器
1. 控制器的定义 遵循规则
- 统一放在 app/Http/Controllers
- 命名空间 namespace App\Http\Controllers;
- 遵循PSR-4 类定义规范 文件名和类名一样 首字母大写
- 类名Controller.php 默认规则
- 可以继承 Controller.php 也可以不继承,推荐继承。(控制器并 不是强制要求 继承基础类。但是,如果控制器没有继承基础类,你将无法使用一些便捷的功能,比如 middleware, validate 和 dispatch 方法。)
- 可以 app/Http/Controllers 继续创建目录 目录名首字母大写
- 命名空间 namespace App\Http\Controllers\目录名
2. 基础控制器
需要着重指出的是,在定义控制器路由时我们不需要指定完整的控制器命名空间。因为 RouteServiceProvider会在一个包含命名空间的路由器组中加载路由文件,所以我们只需指定类名中 App\Http\Controllers 命名空间之后的部分就可以了
- 单个行为控制器
如果你想定义一个只处理单个行为的控制器,你可以在这个控制器中放置一个 __invoke方法,这样在定义路有中就无需指明方法:
class ShowProfile extends Controller{
/**
*展示给定用户的资料
*@param int $id
*@return Response
*/
public function __invoke($id){
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
定义路由:Route::get('user/{id}', 'ShowProfile');
你可以通过 Artisan 命令工具里的make:controller命令中的–invokable 选项来生成一个可调用的控制器:php artisan make:controller ShowProfile --invokable
3. 控制器中间件
- Middleware 可以在路由文件中被分配给控制器路由:
Route::get('profile', 'UserController@show')->middleware('auth');
- 在控制器的构造方法中指定中间件会更方便。使用控制器构造函数中的 middleware 方法, 你可以很容易地将中间件分配给控制器的行为。你甚至可以约束中间件只对控制器类中的某些特定方法生效:
class UserController extends Controller{
/**
*实例化一个控制器实例
*@return void
*/
public function __construct(){
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}
- 还能使用闭包来为控制器注册中间件。闭包的方便之处在于,你无需特地创建一个中间件类来为某一个特殊的控制器注册中间件
$this->middleware(function ($request, $next) {
return $next($request);
});
4. 资源控制器
Laravel 资源路由将典型的「CRUD」路由分配给具有单行代码的控制器。比如,你希望创建一个控制器来处理应用保存的「照片」的所有 HTTP 请求。
- 使用 Artisan 命令make:controller,我们可以快速创建这样一个控制器:
php artisan make:controller PhotoController --resource
- 给控制器注册一个资源路由:
Route::resource('photos', 'PhotoController');
- 注册多个资源路由:
Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
- 资源控制器操作处理
- 指定资源模型:
php artisan make:controller PhotoController --resource --model=Photo
- 部分资源路由
Route::resource('photos', 'PhotoController')->only([
'index', 'show'
]);
Route::resource('photos', 'PhotoController')->except([
'create', 'store', 'update', 'destroy'
]);
-
API 资源路由
当声明用于 APIs 的资源路由时,通常需要排除显示 HTML 模板的路由, 如 create 和 edit。 为了方便起见,你可以使用 apiResource 方法自动排除这两个路由,并且aip资源路由,也包含资源路由组的功能.
为了快速生成一个不包含 create 和 edit 方法的 API 资源控制器,可以在执行 make:controller 命令时加上 --api 选项:php artisan make:controller API/PhotoController --api
-
命名资源路由
默认情况下,所有的资源控制器行为都有一个路由名称。 但是,你可以传入一个 names 数组来覆盖这些名称:Route::resource('photos', 'PhotoController')->names([ 'create' => 'photos.build' ]);
-
命名资源路由参数
默认情况下, Route::resource 会根据资源名称的「单数」形式创建资源路由的路由参数。 你可以在选项数组中传入 parameters参数来轻松地覆盖每个资源。 parameters 数组应当是一个资源名称和参数名称的关联数组:Route::resource('users', 'AdminUserController')->parameters(['users' => 'admin_user']);
上例将会为资源的 show 路由生成如下的 URI :/users/{admin_user}
-
本地化资源 URIs
默认情况下,Route::resource 将会使用英文动词来创建资源 URI。如果你需要本地化 create 和 edit 行为动作名,你可以在AppServiceProvider 的 boot 方法中使用 Route::resourceVerbs 方法实现 :use Illuminate\Support\Facades\Route; /** *初始化任何应用服务 *@return void */ public function boot(){ Route::resourceVerbs([ 'create' => 'crear', 'edit' => 'editar', ]); }
一旦动作被自定义后,像 Route::resource(‘fotos’, ‘PhotoController’) 这样注册的资源路由将会产生如下的 URI:
/fotos/crear /fotos/{foto}/editar
-
补充资源控制器
如果你需要为资源控制器添加默认路由之外的额外路由,你应该在调用 Route::resource 之前定义这些路由;否则, 由 resource 方法定义的路由可能会无意中优先于你补充的路由 :Route::get('photos/popular', 'PhotoController@method'); Route::resource('photos', 'PhotoController');
6. 依赖注入 & 控制器
-
构造函数注入
Laravel使用 服务容器 解析所有的控制器。因此,你可以在控制器的构造函数中使用类型提示可能需要的依赖项。依赖声明会被自动解析并注入到控制器实例<?php namespace App\Http\Controllers; use App\Repositories\UserRepository; class UserController extends Controller{ /** *用户 repository 实例 ??? */ protected $users; /** *创建一个新的控制器实例 *@param UserRepository $users *@return void */ public function __construct(UserRepository $users){ $this->users = $users; } }
当然,你可以输入任何的 Laravel 契约 类型提示。 只要容器可以解析它。根据你的应用,注入你的类型提示到控制器会提供更好可测试性。
-
方法注入
方法注入最常见的用例是在控制器方法中注入 Illuminate\Http\Request 的实例 :<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class UserController extends Controller{ /** *保存新用户 *@param Request $request *@return Response */ public function store(Request $request){ $name = $request->name; } }
第六章 HTTP请求
1. 获取请求
要通过依赖注入的方式来获取当前 HTTP 请求的实例,你应该在控制器方法中引入 Illuminate\Http\Request类。传入的请求实例将通过 服务容器 自动注入:
- 依赖注入 & 路由参数【控制器中引入 Illuminate\Http\Request】
- 通过路由闭包获取请求【路由中引入 Illuminate\Http\Request】
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {});
- Illuminate\Http\Request的方法
ip() 获取访问者ip 地址 // dd() 打印数据 并退出
userAgent() 获取访问者代理
route() 获取路由请求的详情
header() 获取请求头信息
url() 获取请求地址 不包括查询字符串
fullUrl() 获取请求地址 包括查询字符串
path() 获取请求路径
is() 方法可以验证传入的请求路径和指定规则是否匹配。
method() 获取请求的方法
isMethod(方法名) 判断请求方法
merge(数组) 合并新的数据到请求数据中
replace(数组) 替换请求数据
keys() 获取所有的name
has(name) 判断是否传过来值,当提供一个数组作为参数时,has 方法将确定是否存在数组中所有给定的值:
filled('name') //确定请求中是否存在值并且不为空
file() 获取文件的信息
all() 获取所有发送的数据
input(name,默认值) 获取get/post发送的数据 //不带参数 获取所有
query(name,默认值) 从查询字符串获取输入 不加任何参数 获取所有的
only(数组) 获取指定的name
except(数组) 不获取指定的name
2. 输入预处理 & 规范化
3. 获取输入
-
通过动态属性获取输入
通过 Illuminate\Http\Request 实例的动态属性来获取用户输入。例如,如果你应用的表单中包含 name 字段,那么可以像这样访问该字段的值:$name = $request->name;
-
获取 JSON 输入信息
如果发送到应用程序的请求数据是 JSON,只要请求的 Content-Type 标头正确设置为 application/json,就可以通过 input 方法访问 JSON 数据。你甚至可以使用 「点」式语法来读取 JSON 数组: -
旧输入
Laravel 允许你将本次请求的数据保留到下一次请求发送前。如果第一次请求的表单不能通过验证,就可以使用这个功能重新填充表单。但是,如果你使用了 Laravel 的 验证功能,你就不需要在手动实现这些方法,因为 Laravel 内置的验证工具会自动调用他们。 -
获取旧输入
若要获取上一次请求中闪存的输入,则可以使用 Request 实例中的 old 方法。old 方法会从 Session 取出之前被闪存的输入数据:$username = $request->old('username');
Laravel 也提供了全局辅助函数 old。如果你要在 Blade 模板 中显示旧的输入,使用 old 会更加方便。如果给定字段没有旧的输入,则返回 null:<input type="text" name="username" value="{{ old('username') }}">
-
Session
$request->session()->put('key', 'value’); //存 $request->session()->get('key', 'default’); //取 $request->session()->has('users’); //判断 $request->session()->forget('key') && $request->session()->flush();//删除 flash(); //将输入闪存至 Session flashOnly(); //将输入闪存至 Session flashExcept();//将输入闪存至 Session return redirect('form')->withInput( $request->except('password') );//把输入闪存到 session 然后重定向到上一页,这时只需要在重定向方法后加上 withInput 即可
-
Cookies
-
从请求中获取 Cookies:
$request->cookie('name');
或使用 Cookie Facade 来访问 cookie 的值:$value = Cookie::get('name');
() -
将 Cookies 附加到响应
response('Hello World')->cookie('name', 'value', $minutes[, $path, $domain, $secure, $httpOnly]);
或者可以使用 Cookie Facade 来 queue Cookie,以将其与应用程序的传出响应连接起来。queue 方法接受 Cookie 实例或创建 Cookie 实例所需的参数。在发送到浏览器之前,这些 cookie 将被附加到输出响应:Cookie::queue(Cookie::make('name', 'value', $minutes)); Cookie::queue('name', 'value', $minutes);
-
生成 Cookie 实例
如果你想要在一段时间以后生成一个可以给定 Symfony\Component\HttpFoundation\Cookie 的响应实例,你可以使用全局辅助函数 cookie。除非此 cookie 被附加到响应实例,否则不会发送回客户端:$cookie = cookie('name', 'value', $minutes); return response('Hello World')->cookie($cookie);
-
文件
file() ;//获取上传文件,该file方法返回一个Illuminate\Http\UploadedFile类的实例,该类继承了PHP的SplFileInfo 类的同时也提供了各种与文件交互的方法:
hasFile() //确认请求中是否存在文件:
isValid() /验证上传的文件是否有效:
$request->photo->path(); //文件路径
$request->photo->extension();//根据文件内容判断文件的实际扩展名
//其它文件方法:UploadedFile 实例上还有许多可用的方法,可以查看该类的 API 文档 了解这些方法的详细信息。
//存储上传文件
$request->photo->store('images'[, 's3']);//第二个参数,用于存储文件的磁盘名称。这个方法会返回相对于磁盘根目录的文件路径;`
$request->photo->storeAs('images', 'filename.jpg'[, 's3']);//如果你不想自动生成文件名,那么可以使用 storeAs 方法,它接受路径、文件名和磁盘名作为其参数:
第七章 HTTP响应
1. 创建响应
- 为响应增加响应头信息
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
//或者,你可以使用 withHeaders 方法来指定要添加到响应的头信息数组:
return response($content)
->withHeaders([
'Content-Type' => $type,
'X-Header-One' => 'Header Value',
'X-Header-Two' => 'Header Value']);
- 为响应增加cookie
return response($content)
->header('Content-Type', $type)
->cookie($name, $value, $minutes[, $path, $domain, $secure, $httpOnly])
//或者,使用 Cookie facade 「队列」, Cookie 以附加到应用程序的传出响应。 queue 方法接受一个 Cookie 实例或创建 Cookie 实例所需的参数。 这些 cookie 在发送到浏览器之前会附加到传出响应中:
Cookie::queue(Cookie::make('name', 'value', $minutes));
Cookie::queue('name', 'value', $minutes);
- Cookie & 加密
默认情况下,Laravel 生成的所有 Cookie 都是经过加密和签名,因此不能被客户端修改或读取。 如果你想要应用程序生成的部分 Cookie 不被加密,那么可以使用在 app/Http/Middleware 目录中 App\Http\Middleware\EncryptCookies 中间件的 $except 属性:
/**
*设置不加密的 Cookie 名称,数组形式
*@var array
*/
protected $except = [
'cookie_name',
];
2. 重定向
重定向响应是 Illuminate\Http\RedirectResponse 类的实例 助手函数redirect()
back()->withInput() //重定向到之前位置
redirect()->route('profile', ['id' => 1]) //重定向至命名路由
redirect()->action('UserController@profile', ['id' => 1]); //重定向至控制器行为
redirect()->away('https://www.google.com'); //重定向到外部域
redirect('dashboard')->with('status', 'Profile updated!');重定向并使用with方法将数据闪存在 Session 中,
redirect()->route('profile', [$user]); //通过 Eloquent 模型填充参数
如果要自定义路由参数中的值,那么应该覆盖 Eloquent 模型里面的 getRouteKey 方法:
/**
*获取模型的路由键
*@return mixed
*/
public function getRouteKey(){
return $this->slug;
}
3. 其他响应类型
使用辅助函数 response 可以用来生成其他类型的响应实例。当不带参数调用辅助函数 response 时,会返回 Illuminate\Contracts\Routing\ResponseFactory 契约 的实例。 契约提供了几种辅助生成响应的方法。
- 视图响应
return response()
->view('hello', $data, 200)
->header('Content-Type', $type);
- JSON响应
return response()
->json(['name' => 'Abigail', 'state' => 'CA'])
[->withCallback($request->input('callback'))];
- 文件下载
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);//download 方法的第二个参数接受一个文件名,它将作为用户下载的时所看见的文件名。最后,你可以传递一个 HTTP 响应头数组作为该方法的第三个参数
return response()->download($pathToFile)->deleteFileAfterSend(true);
管理文件下载的扩展包 Symfony HttpFoundation,要求下载文件名必须是 ASCII 编码的。
- 流式下载
- File 响应(file 方法可以直接在用户浏览器中显示文件(不是发起下载),例如图像或者 PDF)
return response()->file($pathToFile[, $headers]);//此方法接受文件的路径作为其第一个参数和头信息数组作为其第二个参数:
- 响应宏
第八章 Cookie
1. 使用
引入 Cookie :use Illuminate\Support\Facades\Cookie;
// 写入 cookie
$cookie = Cookie::make($key,$value,$minutest); //创建一个cookie实例
Cookie::queue($cookie ); //将新的实例加入到队列
// 获取 cookie
Cookie::get($key)
// 删除 cookie
$user = Cookie::forget('username');
Cookie::queue($user); //将新的实例加入到队列
// 判断 cookie 是否存在
Cookie::has('username');
2. 注意事项
默认情况下,Laravel 生成的所有 Cookie 都是经过加密和签名,因此不能被客户端修改或读取。 如果你想要应用程序生成的部分 Cookie 不被加密,那么可以使用在 app/Http/Middleware 目录中 App\Http\Middleware\EncryptCookies 中间件的 $except 属性:
protected $except = [
'cookie_name',
];
3. 助手函数
cookie([‘ag’=>33]); // 存储,必须传数组形式
cookie('ag’); // 获取
第九章 Session
1. 使用
引入 use Illuminate\Support\Facades\Session;
// 存储 session
Session::put(‘name’,‘liudehua’); //里面也可以用数组形式
// 获取
Session::get(‘name’)
// 删除
Session::forget('name’);
// 清空所有session
Session::flush();
// 判断是否存在session
Session::has('key1’)
2. 助手函数
session([‘ag’=>33]); // 存储,必须传数组形式
session('ag’); // 获取
第十章 视图
Blade 是 Laravel 提供的一个简单而又强大的模板引擎。和其他流行的 PHP 模板引擎不同,Blade 并不限制你在视图中使用原生 PHP 代码。所有 Blade 视图文件都将被编译成原生的 PHP 代码并缓存起来,除非它被修改,否则不会重新编译,这就意味着 Blade 基本上不会给你的应用增加任何负担。
1. 普通使用
- 定义规则:
- 存放在 resources/views 目录。
- Blade 视图文件使用 .blade.php 作为文件扩展名
- 模板引擎展示
view(‘index’) => index.blade.php
view(‘user.index’) => user/index.blade.php - 判断视图文件是否存在
如果需要判断视图文件是否存在,可以使用 View Facade 上的 exists 方法。如果视图文件存在,该方法会返回 true :
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {}
2. 创建第一个可用视图
使用 first 方法,你可以创建存在于给定数组视图中的第一个视图。 如果你的应用程序或开发的第三方包允许定制或覆盖视图,这非常有用:return view()->first(['custom.admin', 'admin'], $data);
当然,你也可以通过 View facade 调用这个方法:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
-
传数据到视图
view(‘index’,[‘name’=>’liudehua’]) 或 view('index‘)->with(‘age’,33) -
与所有视图共享数据
如果需要共享一段数据给应用程序的所有视图,你可以在服务提供器的 boot 方法中调用视图 Facade 的 share 方法。例如,可以将它们添加到 AppServiceProvider 或者为它们生成一个单独的服务提供器:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider{
/**
*引导任何应用程序服务。
*@return void
*/
public function boot(){
View::share('key', 'value');
}
/**
*注册服务提供商。
*@return void
*/
public function register(){}
}
3. 视图合成器
视图合成器是在渲染视图时调用的回调或者类方法。如果你每次渲染视图时都要绑定视图的数据,视图合成器可以帮你将这些逻辑整理到特定的位置。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
//在下面这个例子中,我们会在一个 服务提供商 中注册视图合成器,使用 View Facade 来访问底层的 Illuminate\Contracts\View\Factory 契约实现。默认情况下,Laravel 没有存放视图合成器的目录,你需要根据需求来重新建立目录,例如:App\Http\ViewComposers
class ComposerServiceProvider extends ServiceProvider{
/**
*在容器中注册绑定。
*@return void
*/
public function boot(){
// 使用基于类的 composer...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// 使用基于闭包的 composers...
View::composer('dashboard', function ($view) {});
}
/**
*注册服务器提供者。
*@return void
*/
public function register(){}
}
注意,如果你创建了新的一个服务提供器来存放你注册视图合成器的代码,那么你需要将这个服务提供器添加到配置文件 config/app.php 的 providers 数组中。
到此我们已经注册了视图合成器,每次渲染 profile 视图时都会执行 ProfileComposer@compose 方法。那么下面我们来定义视图合成器的这个类吧:
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use App\Repositories\UserRepository;
class ProfileComposer{
/**
*用户 repository 实现。
*@var UserRepository
*/
protected $users;
/**
*创建一个新的 profile composer。
*@param UserRepository $users
*@return void
*/
public function __construct(UserRepository $users){
// 依赖关系由服务容器自动解析...
$this->users = $users;
}
/**
*将数据绑定到视图。
*@param View $view
*@return void
*/
public function compose(View $view){
$view->with('count', $this->users->count());
}
}
视图合成器的 compose方法会在视图渲染之前被调用,并传入一个 Illuminate\View\View 实例。你可以使用 with 方法将数据绑定到视图。
4. 将视图构造器添加到多个视图
通过将一组视图作为第一个参数传入 composer 方法,将一个视图合成器添加到多个视图:
View::composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
composer 方法同时也接受通配符 ,表示将一个视图合成器添加到所有视图:
View::composer('*', function ($view) {});
5. 视图构造器
视图 构造器 和视图合成器非常相似。唯一不同之处在于:视图构造器在视图实例化之后立即执行,而视图合成器在视图即将渲染时执行。使用 creator 方法注册视图构造器:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
第十一章 Blade 模板引擎
1. 模板变量输出
- 模板变量输出(模板内部可以直接使用php函数处理) {{变量名}}
- 原样输出 @{{ name }}, 由于许多 JavaScript 框架也是用花括号来表示要显示在浏览器的表达式, 可以使用 @ 符告诉 Blade 渲染引擎保持这个表达式不变
2. 过滤
Blade {{}} 声明中的内容是自动通过 PHP 的 htmlentities 方法过滤的,用来防止 XSS 攻击.不对变量进行过滤 {!! 变量名 !!}
3. 注释
注释 {{-- 此注释将不会出现在渲染后的 HTML --}}
4. 流程控制
if语句: @if-@elseif-@else-@endif 指令构建
isset: @isset-@endisset `<p>{{ $name or ‘default’ }}</p> //短语法`
switch: @switch、@case、@break、@default 和 @endswitch
for循环 :@for-@endfor, @continue($i==5),@break($i==7)
foreach 循环:@foreach-@endforeach
$loop 变量
纯PHP代码: @php-@endphp
$loop 变量
5. 模板继承和布局
@section 命令定义了视图的一部分内容
@show
@extends
@yield('content') 用来显示指定部分的内容。
例1:master.blade.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" >
<title> @yield('title') </title>
<head>
<body>
@section('left')
这是left侧边栏。
@show
@section('right')
这是right的侧边栏。
@show
åååååå<div>
@yield('content')
</div>
</body>
</html>
例2:index.blade.php
@extends('layout.master')
@section('title','这是个首页')
@section('left’)
@parent
我是左边的
@endsection
@section('right')
我是右边的
@endsection
@section('content')
<p>第一篇文章</p>
<p>第二篇文章</p>
@endsection
6. 引入子视图
@include('layout.header’);
7. 视图数据共享
app/Providers/AppServiceProvider.php boot方法
use Illuminate\Support\Facades\View;
View::share('username','liudehua');
8. 引入js/css资源
直接放到 public 文件加下面,引入 的话 就是从 public下面开始
<script src="/js/jQuery.min.js"></script>
第十二章 Laravel 数据库
Laravel 能使用原生 SQL、查询构造器 和 Eloquent ORM 对数据库进行操作
目前laravel支持 下面4种数据库:MySQL/Postgres/SQLiteSQL/Server
1. 配置数据库连接
#(配置文件放置在 config/database.php 文件和.env)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=123456
'charset' => 'utf8',
'collation' => 'utf8_general_ci',
2. 原生sql语句操作
DB Facade 运行查询。 DB Facade 为每种类型的查询提供了方法: select 、 update 、 insert 、 delete 和 statement。
引入 use Illuminate\Support\Facades\DB;
// 插入数据 返回 true 或者false
DB::insert('insert into test (name,age) values (?,?)',['liming',23]);
// 更新数据 返回影响的行数
DB::update('update test set age=? where id=?',[55,1]);
// 查询 数据返回一个数组,数组中的每个结果都是一个 StdClass 对象
DB::select('select name,age from test where id=?',[2]);
// 删除 返回影响的行数
DB::delete('delete from test where id=?',[1]);
3. 查询构造器
//1. 插入
//table 方法为给定的表返回一个查询构造器实例
DB::table('test')->insert(['name'=>'liudehua']); //插入一条数据,返回true、false
DB::table('test')->insertGetId(['name'=>'liudehua']);//获取插入数据的id
批量插入二维数组ååååå
//2. 更新数据
$res = DB::åtable('test')->where('id',5)->update(['age'=>33]);
//多条件
$res = DB::table('test')->where(['id'=>7,'name'=>'liudehua'])->update(['age'=>33]);
$res = DB::table('test')->where('id','>',5)->update(['age'=>99]);
//自增 默认为自增 1
$res = DB::table('test')->where('id',4)->increment('age’);
//自增 3
$res = DB::table('test')->where('id',4)->increment('age',3);
//自减 默认为 1
$res = DB::table('test')->where('id',4)->decrement(‘age’);
//自减 3
$res = DB::table('test')->where('id',4)->decrement('age',3);
//3. 删除
$res = DB::table('test')->where('id',5)->delete();
//4. 获取数据 :toArray() ,结果集转数组
$res = DB::table('test')->get();//获取多条数据
//获取一条数据 不加条件默认获取 第一条
$res = DB::table('test')->first();
//获取某个字段的值
$res = DB::table('test')->where('id',3)->value('age’);
//获取一列的值
$res = DB::table('test')->pluck('age’);
//获取指定字段的值
$res = DB::table('test')->select('name','age')->get();
//5. 聚合函数: count, max, min, avg, 和 sum
$res = DB::table('test')->sum('age’);
$res = DB::table('test')->avg('age’);
$res = DB::table('test')->min('age’);
$res = DB::table('test')->max('age’);
$res = DB::table('test')->count();
//6. sql组合语句:
//where('列名‘[,'运算符’,‘比较值’])
//whereBetween whereNotBetween whereIn / whereNotIn
$res = DB::table('test')->whereBetween('id',[4,7])->get();
$res = DB::table('test')->whereIn('id',[4,7])->get();
//or 语句[orWhere 方法接受与 where 方法相同的参]
$res = DB::table('test')->where('id','3')->orWhere('age',23)->get();
//orderBy
$res = DB::table('test')->orderBy('id','desc')->get();
//limit
$res = DB::table('test')->orderBy('id','desc')->limit(2)->get();
//join 四个参数:内链接,左链接,union :
$res = DB::table('test')->join('em ','test.id','=','em.test_id')->get();
//groupBy
//having….
//7. 事务
//手动抛出 数据库的引擎 是innodb 三个过程DB::beginTransaction(),DB::commit(),DB::rollback();
DB::beginTransaction();
try{
DB::table('test')->where('id',4)->decrement('age',4);
//throw new \Exception('出问题了');
DB::table('test')->where('id',6)->increment('age',4);
DB::commit();
}catch(\Exception $e){
echo $e->getMessage();
DB::rollback();
}
//自动操作
DB::transaction(function () {
DB::table('test')->where('id',4)->decrement('age',4);
DB::table('test')->where('id',222)->increment('age',4);
});
4. Eloquent ORM
Laravel 的 Eloquent ORM (Object Relational Mapping) 提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。
- 模型定义规则:model
- 默认定义到 app目录下面 // 建议单独放到Model的文件夹
- 所有模型都要继承 基类Model
use Illuminate\Database\Eloquent\Model;
- 模型名Model.php
- 类名和文件名一致 例如:UserController.php UserModel.php
- 模型与表一一对应,一个模型一定对应一个表,但一个表不一定要对应一个模型,例如:UserModel.php 模型默认会和 user_models 表对应,模型里添加 $table属性修改表名:protected $table=‘lampol_user’;
- 默认情况下,Eloquent 会默认数据表中存在 created_at 和 updated_at 这两个字段。如果你不需要这两个字段,则需要在模型内将 $timestamps 属性设置为 false
// 时间默认存储的是 年月日 时分秒
public $timestamps = false;
//修改 存储时间格式 为字符串
protected $dateFormat = 'U’;
自定义用于存储时间戳的字段名
const CREATED_AT = ‘login_time’;
const UPDATED_AT = reg_time';
5. 数据操作【控制器实现/模型实现】
- 插入数据
类名::insert() //和DB的用发基本一样,返回bool
类名::insertGetId() //返回插入的id
save() 方法 //返回bool
类名::create() //返回实例模型
//需要先在你的模型上指定 fillable 或 guarded 的属性
protected $fillable = [] 可以赋值的白名单
protected $guarded = [] 可以赋值的黑名单
- 更新数据
//第一种
$user = self::find(1);
$user->name='liming';
$user->save(); //Eloquent 也会假定每个数据表都有一个名为 id 的主键字段。你可以定义一个受保护的 $primaryKey 属性来覆盖这个约定。例如:protected $primaryKey =‘uid’; 修改主键名
//第二种
self::where('uid',2)->update(['name'=>'xiaolizi']);
- 删除数据
//第一种
$user = self::find(1);
return $user->delete();
//第二种
$user = self::destroy(2); //主键
//第三种
$user = self::where('uid',3)->delete();
- 查询数据
返回数据 toArray()
//获取一条数据
$user = self::find(4); // 查询一条数据 主键默认 返回模型实例
$user = self::first()
//获取多条数据
$user = self::all()//查询所有数据 返回数据集
$user = self::get()//查询所有数据 返回数据集,和查询构造器用法一样
-
模型关联
[一对一/一对多/多对多]一个用户对应一个电话号码,一个用户对应多个收货地址,一个用户对应多个角色而一个角色对应多个用户-
一对一
一个User 对应一个 Mobile public function mobile(){ return $this->hasOne('App\Model\MobileModel’,’foregin_id’,’local_id’); //第一个参数是Mobile模型,第二个参数关联的键,默认是模型_id,第三个参数是Mobile模型id } //使用 $mobile = self::find(4)->mobile->toArray(); $mobile = self::find(4)->mobile()->value('mobile');
-
一对多
public function address(){ return $this->hasMany('App\Model\AddressModel','user_id'); } //hasMany 和 hasOne 用法一样 $mobile = self::find(4)->mobile $mobile = self::find(4)->mobile()->value('mobile');
-
-
分页
查询构造器分页
$users = DB::table('lampol_user')->paginate(3);
ORM分页
self::paginate(4);
//简单的分页
simplePaginate(15)
视图展示
引入 bootstrap
return view('index',['page'=>$page]);
添加查询参数到分页 {{ $page->appends(['vip' => 'y'])->links() }}
第十二章 Laravel 表单验证
框架对表单传过来的数据内置了一套机制,进行数据的合法性验证。
1. 使用 Validator
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($data,$rules[,$messages]);//(参数一:是要验证的数据,参数二:是验证规则,参数三: 错误提示信息选填
$rules = [‘username’=>’required’];
$messages = [‘username.required’=>’用户名不能为空’];
2. 判断验证是否通过
$validator->fails(); //不通过 返回true 否则返回false
$validator->passes(); //通过 返回true 否则返回 false
3. 获取错误信息
$validator->errors()->first(); //获取第一个错误信息
$validator->errors()->all(); //获取所有错误信息
4. 常用的几种验证规则
email //必须是email格式
numeric //必须是整数
ip //必须是ip地址
required //必须 不为空
url // 必须是url地址
max //字段的最大值
min //字段的最小值
between:min,max // 字段值的范围
5. 自定义验证规则
第一种:boot方法推荐,可以写到控制器里也可以写到 \app\Providers\AppServiceProvider.php
Validator::extend('mobile', function($attribute, $value, $parameters){
return preg_match('/^1[34578][0-9]{9}$/', $value);
});//属性名称 $attribute、属性的值 $value、传入验证规则的参数数组 $parameter
//添加 错误提示信息
resources\lang\en\validation.php
第二种方式:在app下面创建一个Rules文件夹 然后创建一个验证文件 CheckMobile.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class CheckMobile implements Rule{
public function passes($attribute, $value){
return preg_match('/^1[34578][0-9]{9}$/', $value);
}
public function message(){
return '电话好默哀好像不太对吧大兄弟';
}
}
然后使用
use App\Rules\CheckMobile;
$rules = ['phone'=>new CheckMobile]; // [‘phone’=>[‘require’, new CheckMobile]]
第十三章 Laravel 配置文件
1. 配置文件有两个地方
env(配置名) :获取根目录下面的 .env文件 //
.env文件主要存一些随环境变化而变化的配置,不会被加到版本管理系统
读里面env的配置,只放部分配置.
config(文件名.key); 访问config目录下面的配置
第十四章 Laravel 全局「辅助」PHP 函数
框架本身也大量地使用了这些功能;如果你觉得方便,你可以在你的应用中自由的使用它们。
- 关于路径助手函数
app_path() //获取app目录的全路径
base_path() //项目目录的路径
config_path() //配置文件 config全路径
database_path() //database目录全路径
public_path() //public 目录全路径
resource_path() //resource 目录全路径
storage_path() //storage 目录全路径
- URL
action(‘UserController@index’) 获取 路由
asset(‘js/app.js’) //静态资源路径
secure_asset(‘js/app.js’) //https 静态资源路径
url(‘user’) //路由生成全路径url
secure_url(‘user’) //路由生成https路径
- 字符串处理
camel_case('hello_world’); 函数将给定的值符传转换为「驼峰命名」helloWorld
kebab_case('helloWorld’);函数将给定的字符串转换为「短横线命名」hello-world
snake_case('helloWorld’); 函数将给定的字符串转换为「蛇形命名」hello_world
starts_with('hello world', 'hello’) //true
ends_with('hello world', 'd’) //true
str_limit('hello world', '3’) // hel...
str_random(4) //函数生成一个指定长度的随机字符串
- 数组处理
array_add([‘name’=>‘liudehua’],‘age’,33) 添加键值到数组中
array_except(['name'=>'liudehua','age'=>33],['age’]) 从数组中删除给定的键/值对
array_has([‘name’=>‘liudehua’,‘age’=>33],[‘age’]) 判断数组是否有键
array_only([‘name’=>‘liudehua’,‘age’=>33],[‘age’]) 获取指定的键值
array_random([‘name’=>‘liudehua’,‘age’=>33]) 随机返回数组值
head([‘name’=>‘liudehua’,‘age’=>33]) 返回数组第一个值
last([‘name’=>‘liudehua’,‘age’=>33]) 返回数组最后一个值
- 其他助手
app() 函数返回 服务容器 实例
back() 函数生成一个 重定向 HTTP 响应 到用户之前的位置:
config() 函数获取 配置 变量的值。
env() 函数获取 环境变量 的值或者返回默认值
cookie() 函数创建一个新的 cookie 实例
session 函数可以用来获取或者设置 Session 值
csrf_field() 函数生成包含 CSRF 令牌值的 HTML hidden 表单字段
csrf_token() 函数获取当前 CSRF 令牌的值
method_field() 函数生成一个 HTML hidden 表单字段
dd() 函数输出给定的值并结束脚本运行
dump() 函数打印给定的变量 不结束运行
request() 函数返回当前 请求 实例或者获取输入项
response 函数创建 响应 实例或者获取响应工厂实例
view() 函数获取一个 视图 实例
redirect() 函数返回一个 重定向 HTTP 响应
info() 函数将信息写入日志
logger() 函数可以将一个 debug 级别的消息写入到 日志 中
encrypt() 函数使用 Laravel 的 加密器 对给定的值进行加密
decrypt() 函数使用 Laravel 的 加密器 来解密给定的值
第十五章 Laravel 上传图片
$img = $request->file(‘img’); //获取上传图片的信息
$img->isValid() //验证图片合法性
$img->getClientOriginalName(); //获取图片名
$img->getClientOriginalExtension(); //获取图片扩展名
$img->getClientMimeType(); //获取图片mime
$img->getClientSize(); //获取图片的大小
$img->move($img_path,$img_name) //开始上传,第一个图片存放目录,第二个图片名
第十六章 Laravel 验证码
gd 库 以及 fileinfo扩展打开 https://packagist.org/
//1. composer下载验证码 `composer require mews/captcha`
//2. 配置 添加下面的 config/app.php
'providers' => [
Mews\Captcha\CaptchaServiceProvider::class,
]
'aliases' => [
'Captcha' => Mews\Captcha\Facades\Captcha::class,
]
//3.生成配置
php artisan vendor:publish
//4. 输出 captcha
Captcha::src()
//5. 验证验证码
$rules = ['cap' => 'required|captcha'];
$message = ['cap.captcha'=>'验证码不正确啊'];
$validator = Validator::make($request->input(), $rules,$message);
if($validator->fails()){
dd($validator->errors()->all());
}
第十七章 Laravel 日志
1. 配置文件在 config/logging.php
‘default’ => env(‘LOG_CHANNEL’, ‘stack’)
//默认配置single,daily,第二个参数 可以带数据`
2. 使用
use Illuminate\Support\Facades\Log;
Log::info('hello this is info');
Log::debug('hello this is debug');
Log::notice('hello this is notice');
Log::warning('hello this is warning');
Log::error('hello this is error');
Log::critical('hello this is critical');
Log::alert('hello this is alert');
Log::emergency('hello this is emergency’);
3. 助手函数
logger(‘Debug message’); //debug 级别
logger()->error(‘error’);
第十八章 Laravel artisan 命令
- 配置:php 命令添加到 环境变量
- 常见用法:
php astisan list 列出所有的参数
php artisan key:generate 重新生成 app key
php artisan cache:clear 清空缓存
php artisan config:clear 清空配置缓存
php artisan route:clear 清空配置缓存
php artisan view:clear 清空视图缓存
php artisan route:list 列出配置的路由
//创建控制器
php artisan make:controller OrderController
php artisan make:controller Admin/OrderController
php artisan make:controller TestController -r
创建模型
php artisan make:model TestModel
php artisan make:model Admin\TestModel
创建规则
php artisan make:rule CheckEmail
第十九章 Laravel 类别名
下面两种引入都可以
- 门面模式
use Illuminate\Support\Facades\Log;
use Log;
- 配置文件
config/app.php alias 别名配置