参考 https://laravelacademy.org/
本文基于laravel文档总结
文档中有些概念解析的不是特别清楚,特此总结一下
概念 单词
- Facade 外观模式,门面模式;通过一个类名或函数 返回对象
- Contract 契约合同: 可以理解为接口,面向接口编程
- Container 容器: 存放对象的容器.
- ServiceProvider 服务提供者: 管理(注册,调用)服务,省去了创建对象的麻烦.
- Foundation 基础组件
- Kernel 核心, 有$app的核心,http的核心,和其他核心类
- Middleware 路由中间件,一些小的解决方案,比如登录权限限制,访问频率限制
- repository (~=Model层)
$app就是一个容器,是项目最先生成的. $app->bind() 等价于 App::bind() :自己绑定声明类的依赖关系
$app->make() 生成对象,调用对象 boot extend 覆盖 修改驱动
- 提示 英文单词的 动词,名词,单数,复数 不同地方用不同的单词.例如 seed和seeder
控制反转:在一个类使用另一个类的控制权反转了,现在不用在类里面直接new类
依赖倒置:不依赖手动new了,通过注入外部的对象,一般是通过构造方法的参数传入,多用组合少用继承
laravel很好的解决了类的依赖关系
路由
路由配置在routes目录
## 生成资源控制器 ,命令里加上 --resoure 生成带crud方法的控制器
php artisan make:controller PostController --resource
#资源路由,一次性绑定资源方法 curd等
Route::resource('post', 'PostController');
#模板内使用路由命名 生成url
<a href="{{ route('user.profile', ['id' => 100]) }}">
#控制器里使用 路由名字生成url
route('post.show', [$id]);
#路由分组,组内公用中间件 比如登录校: https://laravelacademy.org/post/9612.html#toc_0
#都进行登录验证的分组
Route::group(['middleware' => ['auth','verified']], function () {
Route::get('/pay/ordersubmit', 'PayController@ordersubmit')->name('pay.ordersubmit');
});
#兜底路由,
Route::fallback(function () {
return '没设置路由,会到这里';
});
#频率限制 利用内置的throttle中间件实现
Route::middleware('throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});
视图
#在视图间共享变量
我们可以在某个服务提供者如 AppServiceProvider 的 boot 方法中定义共享的视图变量:
view()->share('siteName', 'Laravel学院');
view()->share('siteUrl', 'https://laravelacademy.org');
#通过数组指定多个视图组件
view()->composer(['partials.header', 'partials.footer'], function ($view) {
$view->with('posts', Post::recent());
});
视图
变量自动htmlentities转义防止xss ,如果不想自动转义用{!! $variable !!},例如富文本编辑器的代码;
#注释
{{-- 注释内容 --}}
npm和前端编译
npm install 安装 前端库
package.json 可类比为前端的 composer.json,我们通过 npm install 安装该文件中定义的依赖
运行 npm run dev 编译前端资源
大多数时候我们需要在 resources/js/app.js 和 resources/sass/app.scss 中编写代码,引入其它模块,然后运行 npm run dev 就可以了
框架重点
读一遍框架自带的服务提供者源码可以帮助你熟悉各种类是怎么绑定进容器的,都绑定到哪些键上。这是学习 Laravel 框架底层究竟如何运转的最佳实践。
开发
config
根目录.env session驱动设置,如果使用php的redis扩展客户端请设置为phpredis,否则默认使用predis包.
artisan 命令行工具 好多功能
php artisan up
php artisan down
测试 分为 单元测试和功能测试
#执行测试
vendor/bin/phpunit
#运行单个测试用例
vendor/bin/phpunit --filter=UserTest
路由中间件
内置了 表单csrf,表单token auth模块中: guest中间件是游客判断(未登录用户)
auth是登录的用户判断
如果构造方法中调用中间件,可以用except() 排除哪些方法不验证.
可以自定义中间件
#该命令会在 app/Http/Middleware 目录下创建一个新的CheckAge 类
php artisan make:middleware CheckAge
常见契约 Contracts
验证email, user包含 email_verified_at 字段
常见方法
only() , except(), all(), has(), exists(),
$request->input() 智能读取变量 支持json(需要header头设置application/json)
Artisan 命令
#生成可调用的控制器
php artisan make:controller ShowProfile --invokable
#生成资源控制器 --resource参数自带curd方法的自动生成
php artisan make:controller PhotoController --resource
#创建模型 加上-m参数顺便创建迁移文件
php artisan make:model -m Models/Post
#模型工厂文件
php artisan make:factory PostFactory --model=Models/Post
#Schema 建立表
php artisan session:table
#执行数据迁移
php artisan migrate
#全部down,再次up,填充数据
php artisan migrate:refresh --seed
#回滚最后一批迁移
php artisan migrate:rollback
#回滚所有迁移,down方法
php artisan migrate:reset
#删除所有表 重建数据库(破坏性,如果有自己手动录入的表数据请不要执行此操作)
php artisan migrate:fresh
#删除所有表 重建数据库 并填充数据
php artisan migrate:fresh --seed
#生成数据迁移文件 创建新闻表
php artisan make:migration create_news_table --create news
#复杂表单验证 建立类去处理
php artisan make:request StoreBlogPost
#创建auth所需视图和控制器
php artisan make:auth
命令来生成密钥
php artisan key:generate
数据填充
#创建填充类对象
php artisan make:seeder PostsTableSeeder
运行填充器
编写好填充器类之后,需要通过 dump-autoload 命令重新生成 Composer 的自动加载器:
composer dump-autoload
运行之后可以使用 Artisan 命令 db:seed 来填充数据库。
默认情况下,db:seed 命令运行 DatabaseSeeder 类,
不过,你也可以使用 --class 选项来指定你想要运行的独立的填充器类:
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
你还可以使用 migrate:refresh 命令来填充数据库,该命令还可以回滚并重新运行所有迁移,这在需要完全重建数据库时很有用:
php artisan migrate:refresh --seed
#填充中文数据
$faker = Faker\Factory::create('zh_CN');
或者修改配置config/app.php 'faker_locale' => 'zh_CN',
Factory 只是生成了测试数据,但是插入还要 用模型和DB类去写;
数据库操作
DB:: 外观类操作数据库 查询构建器
where whereIn whereBetween orderBy first
模型 Eloquent ORM
生成模型文件,带上 -m 可以创建数据迁移文件
php artisan make:model Flight -m
Eloquent ORM 每个表对应一个类
模型有些默认规则,如果与规则不符,需要重新指定 如表名,主键名,时间戳,连接的库,
注:由于 Eloquent 模型本质上就是查询构建器,你可以在 Eloquent 查询中使用查询构建器的所有方法。
新增数据
1.save
$post = new Post;
$post->title = 'test 4';
$post->save()
2.
create方法可以传数组保存数据,
但是需要设置设置$fillable属性或者$guarded属性允许批量赋值的字段
3. firstOrCreate firstOrNew
修改数据
$post = Post::find(1);
$post->title = 'test 1 title';
$post->save();
关联查询 方便快速的查询其他表
hasOne/belongsTo
hasMany/belongsTo
belongsToMany
组块结果集chunk 游标cursor 根据主键获取记录find $flight = App\Flight::find(1);//可以传数组查多条 获取单条记录first $flight = App\Flight::where('active', 1)->first(); 如果无结果跑出异常findOrFail 和 firstOrFail
fillable guarded 二选一 赋值权限设置 在数组内的字段才能赋值 setXxxxAttribate() 对字段 数据处理 Carbon 时间库使用 显示人性化语言比如:1周前 $post=Post::where('a','<','1')->latest()->paginate(10);//倒序,分页
表单验证
简单验证:
$request->validate([
'title' => 'require'
]);
make:reuqest 自定义验证文件
删除数据: 表单提交到 资源路由的删除路由别名里 {{route('posts.destroy',$post->id)}}
可以用artisan命令查看路由列表.
调试
dd() 函数打印变量
composer dump-autoload
测试
部署后不对
# 清理
php artisan migrate
php artisan route:clear
php artisan cache:clear
php artisan config:clear
#
php artisan migrate
问题:
- 新安装的程序,执行数据迁移 就mysql报错
laravel 数据迁移文件没有指定varchar字符串长度,这是laravel官网推荐的,不必指定长度.
老版本低于5.7的mysql 必须设置最大字符长度
要配置自动指定长度 在Providers/AppServiceProvider 的boot方法内 加上下面的代码.这样你不指定长度,框架也会自动给加上默认长度191.
Schema::defaultStringLength(191);
//Schema是数据迁移用的类
- 安装扩展 数据库报错 清除配置缓存试试
php artisan config:clear
- 提示找不到类:
被提示的类中有语法错误,就会提示找不到
laravel获取不到session
- dd(), die() 等终止函数导致不会写入session;
- 普通web网页要启用 web中间件才行 开启seesion;
- session自动开启服务配置
- 在登录操作的 后面执行了dump也会导致不能保存seesion登录状态;
cookie 为空,不生成
路由没有在web中间件下
登录一次session id变化一次
框架的机制 为了安全
常见namespace
use Illuminate\Support\Facades\Auth;//Auth外观
低级错误
用户名写错了 报错root@localhost
getConnectionName() 自己写的模型类 没继承Model
缓存使用
$value = Cache::remember('users', $seconds, function () {
return DB::table('users')->get();
});
模板
{{ route('register') }}
{{ url('/home') }}
@if (session('status'))
@endif
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="{{ asset('js/app.js') }}" defer></script>
@csrf
@guest @else @endguest
@if (Route::has('register')) @endif
@yield('content')
语言包{{ __('Logout') }}
laravel设置 cookie
Cookie::queue('a', 'aaaa', 1440);
//这样就行了;
//注意cookie是默认加密存储,你看到的值是加密后的;