就是i18n了. 要在.vue 组件里用,还有点不同:

https://blog.csdn.net/qq_25324335/article/details/80767749

yarn 安装依赖:

yarn add vue-i18n
yarn add --dev @kazupon/vue-i18n-loader vue-cli-plugin-i18n

因为没直接用 webpack,laravel-mix 的配置有些不同,看了这个几个帖子:

https://laracasts.com/discuss/channels/vue/using-vue-i18n-single-file-components-with-laravel-mix

https://stackoverflow.com/questions/46787646/vue-i18n-single-file-component-in-laravel-project/46810772#46810772

https://github.com/JeffreyWay/laravel-mix/issues/1882

https://www.codeandweb.com/babeledit/tutorials/how-to-translate-your-vue-app-with-vue-i18n

特别注意 laravel-mix 的版本,我的是 2.14.

终极解决方案在这里: http://kazupon.github.io/vue-i18n/guide/sfc.html#laravel-mix

Read More

laradock

git pull 后记得把最新的 env-sample copy 到.env.

.env就是核心,各种配置都在里面,可能有的需要 build,有的直接 docker restart 就生效.

lnmp 环境:

docker-compose up -d nginx mariadb php-fpm phpmyadmin

build 肯定很慢…,而且容易各种问题…

失败了多来几次..

其实都是下载出了问题…不行挂个全局代理 https://www.looaon.com/index.php/%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE/832.html

export http_proxy="http://127.0.0.1:8123/"

代理不行再挂回来…我服了我自己…

systemctl start polipo.service
systemctl stop polipo.service

workspace

貌似很有用,不用每个工程都安装一堆依赖了.(但是需要 laradock…一回事儿么..)

例如项目分布如下:

+project
+laradock

例如把当前工作区(../) 挂载到 workspace 容器的 /var/www/

添加个 alias,爽歪歪:

alias lbash='docker exec -ti --user=laradock laradock_workspace_1 bash'
alias lnginx='docker exec -ti laradock_nginx_1 bash'
alias lmysql='docker exec -ti laradock_mariadb_1 bash'
alias lphp='docker exec -ti laradock_php-fpm_1 bash'

其他配置

  • php-fpm 有报错:
PHP Warning:  PHP Startup: Unable to load dynamic library 'tideways.so' (tried: /usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so: cannot open shared object file: No such file or directory), /usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so.so (/usr/local/lib/php/extensions/no-debug-non-zts-20170718/tideways.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

某个插件没装好?https://github.com/laradock/laradock/issues/2169

  • laravel 权限问题

https://laracasts.com/discuss/channels/general-discussion/laravel-framework-file-permission-security

  • phpmyadmin 登录

因为自己配置了 mariadb..所以登录的 docker host 是 mariadb.

laravel 工程里的配置也改为相应的 mariadb.

如果 local mysql-cli 直接用mysql -h 127.0.0.1 -u xx -p xx即可登录

增加 database 通过 phpmyadmin 体验更佳…命令行从来就没注意过.

  • php artisan

这个不是在 workspace 里运行…是在 docker php-fpm 里..记住了.

workspace 里的 php 有啥用?估计配合 composer 来安装,也可以做 phpstorm 的 interpreter.

  • 容器内 api 函数

其实也就是想彻底的前后端分离。controller 想调用 api 来拉数据,而不是重新写一遍 model…

超级坑爹的点. 应该是仅在 docker 环境下有.

php-fpm 容器里 curl 访问localhost/api/v2/xxx,是不行的..

必须用http://laradock_nginx_1/api/v2/xxx的方式.

http://172.22.0.3/api/v2/xxx都不行…也是醉了.

具体来说.

具体是这函数:

function api($method = 'POST', $url = '', $params = [])
{
    $client = new Client([
//        'base_uri' =>  config('app.url'),
        'base_uri' => config('app.docker_nginx_host'),
        'defaults' => [
            'exceptions' => false
        ]
    ]);
    $headers = ['Accept' => 'application/json', 'Authorization' => 'Bearer '.Session::get('token')];
    if ($method == 'GET') {
        $response = $client->request($method, $url, [
            'query' => $params,
            'headers' => $headers,
            'http_errors' => false,
        ]);
    } else {
        $response = $client->request($method, $url, [
            'form_params' => $params,
            'headers' => $headers,
            'http_errors' => false,
        ]);
    }
    return json_decode($response->getBody(), true);
}
  • xdebug

一直没真正搞清楚 xdebug 的真正原理.

大概有 2 种模式,一种非代理(直连),一种代理模式.

第 1 种模式:

phpstorm及配置的php interpreter端为server, listen 9000;
   注意这个配置的interpreter,可以是本机直接安装的,docker,甚至远程的...
   最直观就是本机直接安装的

web server端的php-fpm为client,通过其xdebug模块连接到server,进行debug交互.

第 2 种模式:

  • 切换端口

好吧..调试环境 xx.xx 很 ok,如果是xx.xx:8000,需要哪些改动?

1. laradocker nginx 对外映射端口改为8000;
2. laravel 工程 app.url改为`xx.xx:8000`;
3. js axios的baseurl改为`xx:xx:8000`;
4. xdebug的端口同样改为`localhost:8000`;

至此,可以告别之前的 dnmp 了, 艰难的开始 laradock 之旅.

  • 时区纠正 .env:
WORKSPACE_TIMEZONE=PRC

我用的 mariadb,但是 laradock 里又没有添加 TZ 设置: docker-compose.yml:

mariadb:
  environment:
        # add
        - TZ=${WORKSPACE_TIMEZONE}
      n

然后重启 mariadb 容器服务即可.

理想的前端调试环境

折腾了一个周六,终于可以小小的总结一把了.

因为分本地和云端. .js/css 等开发的文件在本地.

  • app.url APP_URL 等变量都写 localhost.

  • laravel-mix 的 browserify proxy 代理本地

mix.browserSync({
    proxy: 'http://localhost:8000',
    files: [
        xxx,
    ],
    reloadOnRestart: true,
    watchOptions: {
        usePolling: true,
    },
  • mariadb 在 laravel 工程的.env(or env.yml),配置为云端.

  • js 里的 axios 请求仍然采用云端,(restful 最新实现在云端)

  • 本地 js/css 基于上面弄好的 laradock. laravel-mix 配置 browserify, 改后即见.

复杂是复杂了点,但再也不用疯狂传云端,然后 F5 的土鳖 debug 法了…

而是考虑了项目实际同时又采用了比较现代的前端构建与开发的方式.

Read More

dnmp 环境,nginx php72 仅在容器主机内.

结果 laravel guzzlehttp 访问为 localhost 时,打死不成功.

function api($method = 'POST', $url = '', $params = [])
{
    $client = new Client([
        //docker addr
//        'base_uri' =>  config('app.url'),
        'base_uri' =>  config('app.url'),
        'defaults' => [
            'exceptions' => false
        ]
    ]);

    $headers = ['Accept' => 'application/json', 'Authorization' => 'Bearer '.Session::get('token')];
    if ($method == 'GET') {
        $response = $client->request($method, $url, [
            'query' => $params,
            'headers' => $headers,
            'http_errors' => false,
        ]);
    } else {
        $response = $client->request($method, $url, [
            'form_params' => $params,
            'headers' => $headers,
            'http_errors' => false,
        ]);
    }

    return json_decode($response->getBody(), true);
}

排查了好久,发现直接设置上面的base_url为 nginx 容器内 ip(172.21.0.x)时,可以的!

经过确认是 docker-compose 启动 nginx 时,应该选择 network_mode:host

network_mode: host
#networks:
#- default

为啥这么做呢? 看完下面 2 个帖子就大概知道了.

https://laracasts.com/discuss/channels/laravel/guzzlehttp-exception-connectexception-curl-error-7-failed-to-connect-to-localhost-port-8087-connection-refused https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach

Read More

要点

直接看代码:

class A {
public:
    int pub_a;
    void pub_fun();
private:
    //private成员 派生类不能访问,使用者不能使用
    int pri_a;
    void pri_fun();
protected:
    //protected成员 变成派生类的private成员 对类使用者是private,不可访问
    void pro_fun();
    int pro_a;
};


class ProA;
//Public继承不改变任何基类的访问属性.原来pub还是pub,原来protected还是protected.
struct PubA : public A {
    void func()
    {
        pub_fun();
        pub_a = 100;
        pro_fun();
        pro_a = 100;
        //pri_a  =100;
        //pri_fun();
    }
    void func(A & a)
    {
        a.pub_a = 10;
        //类成员为基类时时,仍然遵循"类使用者"的原则.即它只能访问pub成员
        //a.pro_a =10;
    }
    void func(PubA & pa)
    {
        //类成员为自身or成员函数的使用的类为自身时,就像是"自己的成员一样", 可以访问pub和protected成员
        pa.pub_a = 100;
        //Amazing here
        pa.pro_a  = 100;
        pro_a = 100;
    }
};


//Privte继承 将所有父类的属性修改为private
struct PriA : private A {
    void func()
    {
        pub_fun();
        pub_a = 100;
        pro_fun();
        pro_a = 100;
        //pri_a  =100;
        //pri_fun();
    }
};


struct ChildOfPriA : public PriA {
    void fun()
    {
        //都不能用
        //pub_a =100;
        //pub_fun();
    }
};

//Protect继承 里把基类的public属性变成自己的protected属性
struct ProA : protected A {
    void func()
       {
        pub_a = 100;
        pro_a = 100;
        //pri_a = 100;
}
};

struct B: private ProA {
public:
    //using 可以覆盖访问属性的继承关系
    //本来private继承过来的所有变量都是private.
    //但是using 一声明,意味着将它的访问属性改成public
    //注意作用域符号用了2层
    using PubA::A::pub_a;

    void fun(PubA & puba, ProA & proa, PriA & pria, A & a)
    {
        a.pub_a = 100;
        puba.pub_a = 100;

    }
};

struct C : public  A {
    //这里定义的变量隐藏了基类A中的pub_a
    int pub_a;
    void func()
    {
        //加上作用域符号显示使用基类被隐藏的变量
        auto ret = pub_a + A::pub_a;
        ret  += 100;
    }
};

int main()
{

    ProA a;
    //pub_a变成了ProA的protected变量,类使用者不能访问.
    //a.pub_a = 100;
    PubA puba;

    puba.pub_a = 100;
    //类使用者不能访问protected
    //b.pro_a = 100;
    //
    B b;
    b.pub_a = 100;

    return 0;
}

Read More

Read More