php微服务,在laravel中集成nacos配置中心

php微服务的资料一直比java少,不过java微服务的一些组件php也是可以复用的,就拿配置中心这个组件举例,来看看在php里如何使用😀

配置中心作为微服务不可缺少的关键组件,下面就在laravel中集成配置中心nacos

nacos是由阿里巴巴开发的微服务配置中心,参考:nacos

下面用到了由作者写的php的nacos客户端php-nacos: https://github.com/neatlife/php-nacos
欢迎star,欢迎pr(求star, 求star, 求star)

启动nacos配置中心

可以使用docker启动

git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker

docker-compose -f example/standalone-derby.yaml up

然后打开 本机ip:8848端口查看效果,nacos默认的登录用户名密码都是 nacos

Read more   2019/5/2 posted in  LARAVEL

在phpstorm中三分钟搭建laravel框架源码阅读环境

laravel框架作为php语言排名第一的框架,源码也是非常值得研究的

作者在phpstorm里搭建了一套源码阅读环境,研究搭建这套环境花了些时间,作者对这个搭建步骤进行优化总结,使用下面的步骤就可以快速完成搭建了

下载源代码

github源码地址:https://github.com/laravel/framework

使用git下载源码

git clone https://github.com/laravel/framework.git

效果如下

下载依赖

laravel框架使用composer管理依赖,进入到framework目录,使用composer install命令下载依赖就可以了,命令如下

cd framework
composer install

查看执行效果:

Read more   2018/5/13 posted in  LARAVEL 源码分析

Laravel中RBAC权限控制核心技术要点

SQL设计如下

DROP SCHEMA IF EXISTS `mydb` ;
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`admin`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`admin` ;
CREATE TABLE IF NOT EXISTS `mydb`.`admin` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(16) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;
CREATE UNIQUE INDEX `username_UNIQUE` ON `mydb`.`admin` (`username` ASC);
  
-- -----------------------------------------------------
-- Table `mydb`.`role`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`role` ;
CREATE TABLE IF NOT EXISTS `mydb`.`role` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;
CREATE UNIQUE INDEX `name_UNIQUE` ON `mydb`.`role` (`name` ASC);
  
-- -----------------------------------------------------
-- Table `mydb`.`role_admin`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`role_admin` ;
CREATE TABLE IF NOT EXISTS `mydb`.`role_admin` (
  `admin_id` INT UNSIGNED NOT NULL,
  `role_id` INT UNSIGNED NOT NULL)
ENGINE = InnoDB;
  
-- -----------------------------------------------------
-- Table `mydb`.`permission`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`permission` ;
CREATE TABLE IF NOT EXISTS `mydb`.`permission` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;
CREATE UNIQUE INDEX `name_UNIQUE` ON `mydb`.`permission` (`name` ASC);
  
-- -----------------------------------------------------
-- Table `mydb`.`role_permission`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`role_permission` ;
CREATE TABLE IF NOT EXISTS `mydb`.`role_permission` (
  `role_id` INT UNSIGNED NOT NULL,
  `permission_id` INT UNSIGNED NOT NULL)
ENGINE = InnoDB;

管理员模型

public function roles()
{
    return $this->belongsToMany('App\Role', 'role_admin', 'admin_id', 'role_id');
}
public function hasRole($roleName)
{
    foreach($this->roles()->get() as $role) {
        if ($role->name == $roleName) {
            return true;
        }
    }
    return false;
}
public function hasPermission($permissionName)
{
    foreach($this->roles()->get() as $role) {
        foreach($role->permissions as $permission) {
            if ($permission->name == $permissionName) {
                return true;
            }
        }
    }
    return false;
}

角色模型

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
    //
    protected $table = 'role';
    protected $fillable = ['name', 'display_name'];
    protected static $list = null;
    public static function getList($refresh = false)
    {
        if ($refresh || is_null(self::$list)) {
            self::$list = static::with('permissions')->get();
        }
        return self::$list;
    }
    public static function getById($roleId)
    {
        $key = static::getList()->search(function($role) use ($roleId) {
            return $role->id == $roleId;
        });
        return $key ? static::getList()->get($key) : null;
    }
    public function permissions()
    {
        return $this->belongsToMany('App\Permission', 'role_permission', 'role_id', 'permission_id');
    }
}

权限模型

<?php
namespace App;
use App\Role;
use Illuminate\Database\Eloquent\Model;
class Permission extends Model
{
    //
    protected $table = 'permission';
    protected $fillable = ['name', 'display_name'];
    public function role()
    {
        foreach(Role::getList() as $role) {
            foreach($role->permissions as $permission) {
                if ($permission->id == $this->id) {
                    return $role;
                }
            }
        }
        return false;
    }
}
2017/3/29 posted in  LARAVEL

Laravel中利用中间表处理多对多的关系

今天谈谈Laravel中非常有用但是又非常难以理解的特性:中间表

拿博客和博客的标签举例:一个博客有多个标签,形成了多对多的关系,使用中间表来表示这种关系,数据库结构设计如下:

博文表:blog

– id
– title
- content

标签表:tag

- id
- name

博文和标签的关联表:blog_tag

- blog_id
- tag_id

然后我们在模型中使用BelongsToMany()来使用中间表表示博文和标签关系
博文模型app/Blog.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    protected $table = 'blog';
    public $timestamps = false;

    public function tag()
    {
        return $this->belongsToMany('App\Tag');
    }
}

标签模型app/Tag.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    protected $table = 'tag';
    public $timestamps = false;

    public function blog()
    {
        return $this->belongsToMany('App\Blog');
    }
}

我们可以进一步指定中间表的表名和关联的字段:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    //
    protected $table = 'blog';
    public $timestamps = false;

    public function tag()
    {
        return $this->belongsToMany('App\Tag', 'blog_tag', 'blog_id', 'tag_id');
    }
}

博文新关联一个标签

$blog = Blog::find($blogId);
$blog->tag()->attach($tagId);// $tagId就是需要关联的标签的id

博文删除关联的一个标签

$blog = Blog::find($blogId);
$blog->tag()->detach($tagId);// $tagId就是需要删除的关联的标签的id

删除所有与标签的关联

$blog = Blog::find($blogId);
$blog->tag()->detach();

注意:attach和detach的参数都可以是一个数组,表示添加或者删除多个关联的标签。

博文使用新的标签关联替换原有的关联:

$blog->tag()->sync([1, 2, 3]);

参考资料

Pivot tables and many-to-many relationships

2017/3/15 posted in  LARAVEL

Laravel的api接口包dingo的用法要点

准备环境(php7+laravel)

-> composer create-project --prefer-dist laravel/laravel laravel-dingo`

安装dingo

-> composer require dingo/api:1.0.x@dev

编辑app/config.php、在provider配置块里注册dingo包到laravel框架中

Laravel\Tinker\TinkerServiceProvider::class,
Dingo\Api\Provider\LaravelServiceProvider::class,
```php
在config目录生成dingo的配置配置文件
```shell
-> php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
Read more   2017/2/21 posted in  LARAVEL

使用Laravel框架开发核心技术要点和开发技巧

2017/2/21 posted in  LARAVEL