热度

Laravel

iFaithFreedom

composer的安装和使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>> php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
>> php composer-setup.php
>> mv composer.phar /usr/local/bin/composer
>> composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
>> 取消配置: composer config -g --unset repos.packagist
>> composer install
>> composer search xxx
>> composer selfupdate
>> composer show | composer show xxx
>> curl -sS https://getcomposer.org/installer | php
>> mv composer.phar /usr/local/bin/composer
>> composer require xxx/xxx
>> composer remove xxx/xxx | xxx
>> composer.json
{
"require": {
"xxx/xxx":"1.0.*@beta",
"xxx/xxx":"@dev"
}
}

Laravel 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Laravel install Tool:	composer global require "laravel/install"
添加laravel 到系统环境变量:
export PATH=“root/.config/composer/vendor/bin:$PATH
$HOME/.composer/vendor/bin 主要让系统找到laravel的可执行文件
laravel new xxx
composer install laravel:
composer create-project --prefer-dist laravel/laravel xxx "5.5.*"

Web 服务器配置:
Nginx:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
具体看微信图片收藏中的配置信息

php artisan serve
php artisan --version | php artisan -V
php artisan down | up

// 设置时区
在 app.php 中
'timezone' => 'Asia/Shanghai';
'timezone' => 'PRC';

初始化完成后,修改.env配置文件,配置数据库等
exec: php artisan migrate:install // 检测数据是否迁移成功

文章模块

路由: 路由 模板
表设计: 表设计 模型

页面逻辑: 文章列表 添加文章 编辑文章 删除文章 文章详情

路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- HTTP 方法:
Route::get($uri,$callback);
get | post | put | patch | delete | options | any | macth

- 路由参数
Route::get('uri1'/{param1}/uri2/{param2}',function($param1,$param2){
...
})->where('param','[a-zA-z0-9]+');

- 路由分组
Route::group(['prefix' => 'xxx'],function(){
Route:;get('xxx',function(){
xxx
});
});

Route::middleware(['xxx','xxxx']) -> group(function(){
Route::get('x',function(){
...
});
});

模型绑定

1
2
3
Route::get('api/users/{user}',function(\App\User $user){
return $user -> email;
});

创建控制器,路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
php artisan make:controller PostController 
Route:
文章列表
Route:;get('/posts','\App\Http\Controllers\PostController@index');
创建文章
Route:;get('/posts/create','\App\Http\Controllers\PostController@create');
Route:;post('/posts','\App\Http\Controllers\PostController@store');
文章详情页
Route:;post('/posts/{post}','\App\Http\Controllers\PostController@show');
编辑文章
Route:;get('/posts/{post}/edit','\App\Http\Controllers\PostController@edit');
Route:;put('/posts/{post}','\App\Http\Controllers\PostController@update');
删除文章
Route:;get('/posts/{post}/delete','\App\Http\Controllers\PostController@delete');
-- 控制器
Controller:
namespace \App\Http\Controllers;
use Illuminate\Http\Request;
class PostController exntends Controller {
public function xxx(){ ... }
}

页面渲染

创建文章 编辑文章 文章列表 文章详情

在控制器进行页面渲染:

1
2
3
4
5
6
7
8
9
10
11
Extends Controller:
public function index(){
$arrs = [
['title' => 'totle ...'], ['title' => 'titles ...'], ['ok' => 'okoko'],
];
return view('post/index',['arrs' => $arr]); // 指 post文件夹下的index.blade.php 页面
}
-- 传递参数
$tit = 'a tit';
view('post/index',['title' => 'text','isTrue' => false,'arrs' => $arrs] );
view('post/index',compact('tit','arrs')); view('post/index',compact('arrs'));

– Blade模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
模板语法:{{ }}   @if	@foreach	 
参数传递:
继承模板:extends/ section/ yield/ content
引入视图:include

-- index.blade.php
{{$title}} // 解析控制器中传递的变量值
@if($isTrue == true)
Message
@endif
@foreach($arrs as $arr)
{{$arr}}
@endforeach

- 文章模块页面模板调整
提取 layout
提取 footer
提取 nav

layout/main.blade.php
公用头部
@yield('content')
公用尾部

单独拆解
layout/footer.blade.php
footer 的页面内容
layout/nav.blade.php
nav 的页面内容

模板集成与包含
post/index.blade.php
@extends('layout.main')
@section('content')
@include('layout.nav')
index 中的页面内容
@include(layout.footer)
@endsection

文章模块数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
使用 migrate 创建数据表
外键 user_id
时间 created_at/updated_at
migration: 数据库同步迁移
php artisan make:migration create_posts_table // 格式:create_ 数据表名_table
在创建好的create_posts_table.php中
pubic function up(){ // 创建表用crate 更新表用 table
Scheme::create('posts',function(Blueprint $table){ // 创建表
$table -> increment('id');
$table -> string('title',100) -> default('');
$table -> text('content');
$table -> integer('user_id') -> default(0);
$table -> timestamps();
});
}
public function down(){
Scheme::dropIfExists('posts'); // 删除表
}
// 如果报错 SQL max key length 767 bytes,就需要在 app\Providers 文件的boot() 方法中添加 一下代码
public function boot(){
Schema::defaultStringLength(191); // 191 = 797 / 4
}
php artisan migrate // 完成数据表的迁移
数据库的回滚
php artisan migrate:rollback

表名 posts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ORM:		
创建posts 的模型:
php artisan make:model Post

tinker 的使用:
php artisan think
基本的增删改查
增加:
$post = new \App\Post();
$post -> title = 'title text';
$post -> content = 'content text';
$post -> save();
查找:
\App\Post::find(3);
\App\Post::where('title','titel text') -> get() | -> first();
更新:
$post = \App\Post::find(3);
$post -> title = 'new title text';
删除:
$post = \App\Post::find(3);
$post -> delete();

文章列表逻辑

模型查找 页面渲染 时间格式 数据填充 字符截断 分页

在列表控制器中实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
PostController.php
use \App\Post;
public function index(){
$posts = Post::orderBy('created_at','desc') -> get(); // 模型查找
return view('posts/index',compact('posts')); // 页面渲染
}

接着在模板中修改页面渲染:
如果传递过来的是数组:
@foreach($arrs as $arr)
{{$arr['title']}}
@endforeach
如果传递过来的是对象
@foreach($posts as $post)
{{$post -> title}} // post 的 title 属性 和其他属性
{{$post -> created_at}} | {{$pos -> id}} | {{$post -> content}} | {{$post -> updated_at}}
@endforeach

时间格式渲染:
{{$post -> created_at -> toFormattedDateString()}} // 格式化时间

数据填充:
在 database\factories\ModelFactory.php 文件中设置以下代码
$factory -> define(App\Post::class,function(Faker\Generator $faker){
return [
'title' => $faker -> sentence(6); // 6个单词
'content' => $faker -> paragraph(10); // 10个句子
];
});
php artisan tinker
: factory(App\Post::class,20) -> create(); //生成 make-> (); //演示

分页:
控制器PostController index()
$posts = Post::orderBy('created_at','desc') -> paginate(n); // n 一个页面显示的数量
模板 view/post/index.blade.php
{{$posts -> links()}}

字符截取:
{{str__limit($post -> content,'100','...')}} // str__limit() 100:显示的数量 ... 显示文本

文章添加逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
控制器
模板 form 中传递的参数名和数据库字段名保持一致
文章列表 详情页面 创建页面 创建逻辑 编辑页面 编辑逻辑
控制器对应的方法中在接收传递数据的内容调试时使用 dd(\Request::all()); == dd(request()); // dd(request('title')); dd = dump and die

CSRF
在模板页面需要设置 csrf_token() 字段
<input type='hidden' name='_token' value="{{csrf_token()}}"> == {{csrf_field()}}

保存model
1. 第一种方式
$post = new Post();
$post -> title = request('title'); // 通过request 获取title数据
$post -> content = request('content'); // 通过request 获取content数据
$post -> save(); // 通过 save() 进行保存
2. 第二种方式
$params = ['title' => request('title'), 'content' => request('content')];
Post::create($params);
3. 第三种方式是第二种方式的简写
Post::create(request(['title','content']));
如果报错,create方法需要在模型中设置相对应的规则
app/Post.php
class Post extends Model{
protected $guarded = []; // 不可以注入数据的字段 为空的话,所有数据都可以注入
protected $fillable = ['title','content']; // 可以注入数据的字段
}
此处可以把$guarded $fillable 提取到新的model 类文件中, post.php 集成新的model类就可以简写很多代码

验证和错误提示
控制器做数据的验证:
public function store(){
// 验证
$this -> validate(request()[
'title' => 'required|string|max:100|min:5',
'content' => 'required|string|min:10'
]);
}
// 逻辑
$post = Post::create(request(['title','content']));
// 渲染
return redirect('/posts');
视图层做错误的提示:
@if(count($errors) > 0)
@foreach($errors as $error)
{{$error}}
@endforeach
@endif

错误提示本地化
resources/lang/zh/ 复制 en中的文件到zh中,中文汉化放到validation.php中, 在config/app.php 中修改 locale en 为 zh

富文本编辑器的使用

1
2
3
4
5
6
7
8
下载wangEdit2 js 和其他的
模板中对标签的格式化
{!! str_limit($post -> content),'100','...' !!}
图片上传
设置 路由
Route::post('/posts/image/upload','\App\Http\PostController@imageUpload');
控制器
这一部分不是最重要的,暂时不细研究

文章编辑逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
路由:
Route::get('/posts/{post}/edit','\App\Http\PostController@edit'); // 传递 post 模型绑定
控制器:
如果路由中有传递 模型绑定,那么控制器也需要在相对应的方法中注入模型参数
public function edit(Post $post){
return view('/posts/edit',compact('posts'));
}

CSRF 视图层:
{{ method_field('PUT') }} // 视图层
{{ csrf_field() }}
{{ $posts -> title }} //
{{ $posts -> content }}

更新 Model:
路由:
Route::put('/posts/{post}/','\App\Http\PostController@update');
控制器 PostController:
public function update(Post $post){
// 验证
$this -> validate(requset()[
'title' => 'required|string|max:100|min:5',
'content' => 'required|string|min:10'
]);
// 逻辑
$post -> title = request('title');
$post -> content = request('content');
$post -> save();
// 渲染
return redirect('/posts/{$post -> id}');
}
视图层:
错误提示代码提取到 layout/error.blade.php
edit.blade.php
@extends('layout.main')
@section('content')
some html code ...
@include('layout.error')
@endsection

删除文章:
路由:
Route::get('/posts/{post}','\App\Http\PostController@delete');
控制器:
public function delete(Post $post){
// TODO: 用户的权限认证
$post -> delete();
return redirect('/posts');
}

本文标题:Laravel

文章作者:

Hale Lv

发布时间:2019年08月16日 - 21:08

最后更新:2019年08月16日 - 21:08

原始链接:http://yoursite.com/2019/08/16/Laravel-Note/

许可协议: 转载请保留原文链接及作者。

<center> Hale Lv </center> wechat
扫一扫,公众号!
文能提笔安天下,武能上马定乾坤!
-------------本文结束感谢您的阅读-------------