- 课程介绍
- 开发流程:核心模块到周边模块,从中心到周边
- 优势
- 定时任务
- 队列
- composer
- 思想
- 服务容器
- 服务提供者
- PHPStorm
- Shift + F6 统一修改变量名
- Composer 安装 Laravel
- https://pkg.phpcomposer.com
- 配置中文镜像:composer config -g repo.packagist composer https://packagist.phpcomposer.com
- 安装:composer create-project laravel/laravel laravel54 "5.4.*"
- 启动Laravel
- WebServer: Nginx Apache
- php artisan serve (php artisan help serve)
- .env
- 路由
- PUT方法的form表达: {{ method_field('PUT') }}
- 模型绑定:Route::get('/posts/{article}', 'ArticleController@show')
function show( \App\Article $article) { ... }
article => 表:articles => 主键:id
-
- RESTful
-
- 模板
- main.blade.php @yield("content")
- main.blade.php @include("layout.footer")
- index.blade.php @extends("layout.main")
- index.blade.php @section("content") ... @endsection
- 数据表
-
- 规则
- 表名:复数
- 外键:user_id
- 时间:created_at / updated_at / deleted_at
- migration
-
- 创建:php artisan make:migration create_posts_table
- 执行:php artisan migrate
- 回滚:php artisan migrate:rollback
- migration文件
-
- up():
- 设置default:$table->string('title', 100)->default("");
- 时间:$table->timestamps();
- down():
-
- Schema::dropIfExists('table');
- tinker
- 数据填充
-
- database/factories/ModelFactory.php
- Faker类:三方库,生成随机字符串
-
- $faker->sentence(6) //6个词
- $faker->paragraph(10) //10句话
- 在tinker里填充:
-
- factory( App\Post:class, 10)->make();
- factory( App\Post:class, 20)->create();
- 分页
-
- paginate()
- {{ $posts->links() }}
- 字符串截断
-
- {{ str_limit($post->content, 100, '...') }}
- 规则
- 创建文章:
-
- csrf保护
- <input name="_token" value="csrf_token()">
- {{ csrf_field() }}
- create()
-
- Post::create( request(['title', 'content']) );
- 在模型里设置 protected $fillable //可以插入的字段
- 在模型里设置 protected $guarded //不可以插入的字段
- 验证操作validate
-
$this->validate(request(), [ 'title' => 'required|string|max:100|min:5', 'content' => 'required|string|min:10', ],[ 'title.min' => '文章标题过短'; ]); //ajax请求 $validator = Validator::make($request->all(), [ 'name' => 'required|string', 'en_name' => 'required|string', 'platform' => 'required|string', 'type' => 'required|string|min:10', ],[ 'name.required' => '运营商名称是必须的', 'name.min' => '运营商名称是必须的', 'title.min' => '文章标题过短', ]); if ($validator->fails()) { return $validator->errors()->all(); }
- csrf保护
- 模板
-
- 修改提示语
- resources/lang/en/validation.php -> resources/lang/zh/validation.php
- 替换文件: https://gist.github.com/linkdesu/994b59c8dc6217dd299a
- 修改config/app.php下的 'locale' => 'zh'
- 表单提交过程
-
- 验证
- 逻辑
- 渲染
- Ajax上传图片: X-CSRF-TOKEN
-
- main.blade.php: <meta name="csrf-token" content="{{ csrf_token() }}">
- js里:'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content')
- 处理上传图片
-
- 关键词:公共磁盘:
- php artisan storage:link
- 代码
-
//保存图片 public function imageUpload(Request $request) { $path = $request->file('editorH5File')->storePublicly(md5(time())); return asset('storage/' . $path); }
- 关键词:公共磁盘:
- 修改提示语
-
-
- 其他
- 模板里显示时间:{{ $post->created_at->toFormattedDateString() }}
- 大驼峰命名
- 设置时区:config/app.php 'timezone' => 'UTC' ---> 'Asia/Shanghai'
- 模型里时间对象是carbon对象,对象里有很多方法,正如第一点
-
- form的字段尽量与数据库的一致
- 模板原生代码:{!! str_limit($post->content, 100 , '...') !!}
- Laravel核心思想
- 服务容器
- 容器概念
- 绑定
- $this->app->bind('HelpSpot\API', function ($app) { return new HelpSpot\API($app->make('HttpClient'))});
- $this->app->singleton('HelpSpot\API', function ($app) { return new HelpSpot\API($app->make('HttpClient'))});
- 解析
- $api = $this->app->make('HelpSpot\API');
- 绑定
- IOC控制反转
- DI 依赖注入
- 容器概念
- 服务提供者
- 概念
- 服务提供注册
- public function register();
- public function boot();
- 延迟服务提供
- protected $defer = true;
- 门脸模式
- 用户授权Policy
- 定义策略类
- php artisan make:policy PostPolicy
- 在app/Http/Policies/PostPolicy.php
-
//修改文章权限,判断当前登陆用户与文章user_id是否一致 public function update(User $user, Post $post) { return $user->id == $post->user_id; }
- 定义策略类
- 注册策略类和模型关联
- 注册:在 app/Providers/AuthServiceProvider.php 里 protected $policies = [ 'App\Post' => 'App\Policies\PostPolicy']
- 将该策略注册到模型
- 使用
- $this->authorize('update', $post);
- @can('update', $post) ...... @endcan
- 评论模块
- 模型关联
- 一对一 hasOne (用户 - 手机号)
- 一对多 hasMany (文章 - 评论)
- 一对多方向 belongsTo (评论 - 文章)
- 多对多 belongsToMany (用户 - 角色)
- 远程一对多 hasManyThrough (国家 - 作者 - 文章)
- 多态关联 morphMany (文章/视频 - 评论)
- 多态多对多 morphToMany (文章/视频 - 标签)
- 模型关联预加载
- $books = App\Book::where($map)->with('author')->get();
- $books = App\Book::where($map)->get(); $books->load('author', 'publisher');
- 直接在模板中使用
- 模型关联计数
- $post = App\Post::withCount('comments')->get();
- 模型关联
- 赞模块
- Zan::firstOrCreate( $array );
- $post->zan(\Auth::id())->exists();
- $post = App\Post::withCount(['zan', 'comments'])->get();
- 搜索模块
- ElasticSearch 以及 中文分词(ik插件)
- Laravel安装elastic包
- composer install laravel/scr
- Laravel自定义命令行
- php artisan make:command ESInit
- app/Console/Commands/ESInit.php
- $signature = 'es:init';
- handle() //实际要做的事情
- 挂载:app/Console/Kernel.php protected $commands = [ \App\Console\Commands\ESInit::class ];
- 安装guzzlehttp/guzzle: composer require guzzlehttp/guzzle
- 个人中心模块
- //todo: 再看一遍
- 专题模块
- //todo:再看一遍
-
- 视图合成器
- 模型的scope
- 后台管理
- 专题管理页面
- Resource:
- Route::resource('photos', 'PothoController', ['only' => ['index', 'update', 'store', 'destroy']] );
- ajax:
- data:{"_method":"DELETE"}
动作
|
URI
|
操作
|
解释
|
路由名城
|
GET | /photos | index | 首页列表 | photos.index |
GET | /photos/create | create | 创建页面 | photos.create |
POST | /photos | store | 创建操作 | photos.store |
GET | /photos/{photo} | show | 详情页面 | photos.show |
GET | /photos/{photo}/edit | edit | 修改页面 | photos.edit |
PUT/PATCH | /photos/{photo} | update | 修改操作 | photos.update |
DELETE | /photos/{photo} | destroy | 删除操作 | photos.destroy |
- 系统通知模块
- 优化
- 使用预加载进行优化