如果你对该文章中的内容有疑问/不解,可以点击此处链接提问
要注明问题和此文章链接地址 点击此处跳转
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
服务容器 绑定(使用bind 或 singleton) public/indx.php下的 $app = require_once __DIR__.'/../bootstrap/app.php'; app.php 下(字符串绑定到对象中) $app->singleton( Illuminate\Contracts\Http\Kernel::class,//字符串 App\Http\Kernel::class//对象 ); 解析(使用make) $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 依赖注入 public function index(Illuminate\Http\Request $request, \Illuminate\Contracts\Logging\Log $log){ //在参数中加入一个类 这个参数就会直接实例化这个类 , 直接可以使用 $log->info("直接使用"); } 服务提供者 绑定一般由服务提供者来做 服务提供注册 public function register()//服务提供之前进行注册 public function boot()//服务提供加载之后进行注册 延迟服务提供 protected $defer = true; 提供2种写入方式 1.config/app.php====>providers 2.框架中写入的 门脸模式 不需要new,直接静态调用 public function index(Illuminate\Http\Request $request){ dd($request->all()); } //门脸模式 public function index(){ dd(\Rrequest::all()); } 解析在config/app.php aliases 'Request' => Illuminate\Support\Facades\Request::class, 打开当前门脸类 \vendor\laravel\framework\src\Illuminate\Support\Facades demo(服务容器/服务提供者/门脸) 容器 public function index(){ $app = app();//获取容器 <!--\vendor\laravel\framework\src\Illuminate\Log\LogServiceProvider.php public function register() { $this->app->singleton('log', function () { return $this->createLogger(); }); } --> $log = $app-> make('log');//make('注册时的字符串') $log()->info('111'); } 门脸 public function index(){ \Log::info("1111"); } 如何查找门脸/注入类 有哪些函数 php artisan tinker app('Psr\Log\LoggerInterface'); // ==>app('log') 查找方法 https://laravel.com/api/5.4 Illuminate\Log\Writer 用户注册/登陆 //验证 'name'=>'required|min:3|unique:users,name'//z在users表name唯一 密码加密 laravel默认(bcrypt()加密) $pwd = bcrypt(request('pwd')) use App\Model;//model use App\User;//controller $user = User::create(compact('name','email','password')); AUTH门脸类 登录 if(Auth::attempt(['email'=>$email,'password'=>$password],$remember)) 登出 Auth::logout(); $user = Auth::user()//获取当前已通过认证的用户 $id = Auth::id//已认证的用户id 使用: <!-- model User.php --> use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { protected $fillable = [ 'name','email','password' ] } <!-- conteoller --> $user = request(['email','password']); $is_remember = boolval(request('is_remember')); if(\Auth::attempt($user,$is_remember)){ return redirect('/index'); } return \Redirect::back()->withErrors("密码不匹配");//表单提交的上一页 用户授权Policy 定义策略类 注册策略类和模型相关 策略判断 1.if($user->can('update',$post)){....} 2.$this->authorize('update',$post); 3.@can('update',$post) 可操作 @elsecan('create',$post) 可创建 @endcan demo 文章中加入用户id $user_id = \Auth::id(); $params = array_merge(request(['title','content']),compact("user_id")) $post = Post::create($params); 页面当前登录用户 {{\Auth::user()->name}} 文章关联用户(model ) class Post extends Model{ public function user(){ return $this->belongTo('App\User','user_id','id');//post表的外键user_id/user表的主键id return $this->belongTo('App\User');//如果遵循表_id id ,后面两参数可不写 } } 页面中通过user_id获取用户名 {{$post->user->name}} // 不加括号 user不加括号返回关联关系对应的对象,加括号返回关联关系 权限policy 1.定义 php artisan make:policy PostPolicy //\app\Policies 2.注册/关联 //PostPolicy.php use App\User; use App\Post; //修改 public function update(User $user,Post $post){ return $user->id ==$post->user_id; } //删除 public function delete(User $user,Post $post){ return $user->id ==$post->user_id; } 注册\app\Providers\AuthServiceProvider.php protected $policies = [ 'App\Model' => 'App\Policies\PostPolicy', ]; 3.策略判断 <!-- controller --> $this->authorize("update",$post); 模型关联 hasone 一对一(用户-手机号) hasMany一对多(文章-评论) belongsTo 一对多反向(评论-文章) belongsToMany 多对多(用户-用户) hasManyThrough 远层一对多(国家-作者-文章) morphMany 多态关联(文章/视频-评论) morphToMany 多态多对多(文章/评论-标签) demo 文章中的评论 post.php (model) public function commons() { return $this->hasMany('App\Commons')->orderBy('created','desc'); } 评论所属的文章 commons.php (model) public function(){ return $this->belongsTo('App\Post'); } 提交评论 model中是用APP的model use App\Model use \App\commons; $comment = new Comment(); $comment->user_id = \Auth::id();//当前用户id $comment->content = request('content');//评论的内容 $post->commons()->save($comment);//保存 return back();//返回上一页面 模型关联预加载 1.$books = App\Book::with('author')->get(); //渲染之后架子啊 2.$books = load('author','punlisher'); //推荐,渲染之前加载 public function show(Post $post){ $post->load('comments');//controller } @foreach($post->comments as $comment) {{$comment->name}} @endforeach 模型关联计数 $num = App\Post::withCount('comments')->get demo $posts = Post::orderBy('created','desc')->withCount("comments")->paginate(6); {{$post->comments_count}} 点赞 //赞 public function zam(Post $post){ $param = [ 'user_id' => \Auth::id(), 'post_id'=>$post->id ]; Zan::firstOrCreate($param);//判断数据库是否有此数据,如果有,则读取,如果没有则创建 return back(); } //取消赞 用户--赞关联 //post model public function zan($user_id){ return $this->hasOne(\App\Zan::class)->where('user_id',$user_id); } //controller public function unzan(Post $post){ $post->zan(\Auth::id())->delete(); return back; } 页面 @if($post->zan(\Auth::id())->exist())//判断是否已经存在 .. @else .. @endif withCount扩展 withCount(模型关联的函数名) $posts = Post::orderBy('created','desc')->withCount(['comments',zans])->paginate(6); {{$post->comments_count}} {{$post->zans_count}} laravel项目开发规范 https://laravel-china.org/docs/laravel-specification/5.5 |