Pass Paremeter to Middleware 传递变量

我只能说这种方式实在太神奇,居然是用冒号连接。 public function __construct(){ $path=’manage/user’; $this->middleware(‘CheckUserGroup:’.$path); } public function handle($request, Closure $next, $path) { $permit = false; if (Auth::user()) { $user_class = Auth::user()->user_class(); $sidebar=Sidebar::where(‘url’,$path)->first(); if ($user_class>=$sidebar->visible){ $permit=true; } } if($permit==true){ return $next($request); }else{ return redirect(‘/’)->withErrors(‘Sorry, you\’re not authorized to visit that page.’); } }  

修修补补

看着 Phpstorm 里面各种花花绿绿的提示,深感不爽,决定暂时进入修补阶段。 其实代码能运行,只是有些东西强大如 phpstorm 都解析不出来,这样可能会降低运行效率吧,还是修正一下比较好。 顺带简化一些 template 中的数据调用逻辑,现在感觉一些前台调用写得太复杂了。 还有一个严重的问题是载入的 js 文件实在太多,需要做整合。什么 gulp,什么 node.js,还不太会用,伤感。 另外会给尝试 Sidebar 加入一个新功能,直接在前台控制权限,而不是在页面中写死(hard coding)。 其实要做的事情还真的挺多。

Laravel Path 路径判断

{{ strstr(Route::getCurrentRoute()->getPath(),$item->url) ? ‘class=active’ : ”}} strstr 函数还有个坑,如果第二个参数 $item->url 是 empty 会报错,NULL 不会报错,Laravel 中 NULL 跟 empty 的坑参见这个帖子。

吐槽一下 laravel

表单为空的时候,居然不能解析为 NULL,而是 update 成 empty 字段,这实在是无语。 需要在 model 中进行修正: public function setUrlAttribute($value){ $this->attributes[‘url’] = $value ?:NULL; } SoftDelete 用起来也不方便,需要现在 Model 中声明: use Illuminate\Database\Eloquent\SoftDeletes; class Sidebar extends Model { use SoftDeletes; protected $dates = [‘deleted_at’]; …. 用 where() 方法,返回 array 要加 get(),find() 就不用,什么时候要加 get() 什么时候不用我现在还是分不太清。

PHP 历遍 Json 子节点的方法

对 Json 是又爱又恨,不太会用 PHP 解析,研究了半天,终于找到点门道。 <?php $a='[{“id”:1},{“id”:2},{“id”:3},{“id”:4},{“id”:5},{“id”:6},{“id”:8,”children”:[{“id”:9},{“id”:7}]}]’; $json=json_decode($a); foreach($json as $item){ if (isset($item->children)){ echo $item->id; foreach($item->children as $sub_item){ echo $sub_item->id; } }else{ echo $item->id; } } 这种做法必须知道子节点的名称,不然就只能逐个 node 去历遍了。

用户模块基本完成

感谢 laracast,学会了 many to many relationship。 INSPINIA 模板果然给力,有很多 JQuery Plugin 可以直接拿来用,要是能多提供点 Document 就好了,目前还是主要靠猜。 剩下一些小 bug,比方 Administrator 不能需改自己的用户组的限定,目前好像还是不太行,会导致循环 redirect。 还有就是想一下,怎样可以在不泄露 group_id 的情况下改用户组,这样会安全一点。感觉可以实现,就是有点麻烦。

让 Phpstorm 完整支持 Laravel 并自动补全函数

这里用到了一个 IDE helper,我暂时还不是非常了解 PhpDoc 的原理,不过依葫芦画瓢吧。 Laravel 5 IDE Helper Generator 根据 Readme 安装即可,这样 routes.php 就不会报错了。 不过还有一个问题,在写 migration 的时候,->unsigned()->index() 不能自动补全,还会有函数报错。在 stackoverflow 找到了答案: Calling $table->integer(‘user_id’) returns a new instance of Illuminate\Support\Fluent. But the Fluent class does not provide an unique() method. Instead it’s using PHP magic method __call. That’s why PHPStorm is complaining. 然后解决办法是在 IDE Helper 的末尾增加以下几行: … Read more

完成用户密码修改

原来 User 模块做起来并没有那么容易。 首先验证是否登陆,Laravel 的 middleware 真的很强大: public function __construct() { $this->middleware(‘auth’); } 然后设定好 Validator,用户要先输入原密码,然后输入两次新密码: protected function validator(array $data) { return Validator::make($data, [ ‘old_password’ => ‘required|min:6’, ‘new_password’ => ‘required|confirmed|min:6’, ]); } 接着建立一个 function 去处理用户密码,这里用到了 hash facade,新密码直接 bcrypt: public function ChangePassword(Request $request) { // $validator = $this->validator($request->all()); if ($validator->fails()) { $this->throwValidationException( $request, $validator ); }else{ $user=Auth::user(); … Read more

注册时默认用户组为 1 组

这周末如果不是很懒的话,应该可以把 user profile 模块初步做起来。 protected function create(array $data) { $user=User::create([ ‘name’ => $data[‘name’], ’email’ => $data[’email’], ‘password’ => bcrypt($data[‘password’]) ]); $profile=new Profile([‘nickname’=>$data[‘name’]]); $user->profiles()->save($profile); $user->profiles->group_id=1; $user->profiles->save(); return $user; } 目前 group_id 显然不能放在 mass assign 中,于是采取了先新建记录,再 update 用户组权限的办法。

重新整理思路

为了提高开发效率,我决定不再闭门造车,直接基于已有的轮子做二次开发。 Template:Inspinia 安装 Laravel: composer create-project laravel/laravel /home/wwwroot/onemstar.com Require package: composer require illuminate/html composer require guzzlehttp/guzzle 修改配置: #config\app.php Illuminate\Html\HtmlServiceProvider::class, … ‘Form’ => Illuminate\Html\FormFacade::class, ‘Html’ => Illuminate\Html\HtmlFacade::class, Git: git init git remote add origin https://flymemory@bitbucket.org/flymemory/qualityoa.git git add . git commit -m “initial commit” git push origin master