menu
阿波銘木 公式ブログ

有限会社 阿波銘木 公式ブログ

Symfony4 Release!!

東京もすっかり寒くなりました。

 

東京では僕の地元の北海道とは違って、クーラーをつけていてもジャージとかの長袖で過ごす毎日です。

ストーブのパワーに脱帽しますね。

 

お久しぶりのwebシステム担当です。

 

さて、前回のブログでSymfony3について書かせて頂きましたが、

ついにSymfony4が正式にリリースされました!!

 

当サイトも既にSymfony4へのコンバートに取り掛かっており、来年頭には4系での運用に入る予定です。

ちなみに同時期にリリースされた3.4は長期サポートになっておりますのでリスクを背負わずにSymfonyを使いたい方はまだ4系にするべきではないですね。

この辺は好みにもよると思いますが。

(追記:2017年12月26日により、当サイトはSymfony4.0.2・PHP7.2.0での運用を開始致しました。)

 

そんなSymfony4ですが2系3系と比べて非常に大きく変わった印象を受けます。

と、言うコトで下記にまとめてみます。

 

Bundleless Applicationになった↓↓

これが最も大きく変わった部分ですね。Bundlelessにするのは想定外でした。

Symfonyといえば2系からはBundleを切りながら、そのBundle内で1アプリケーションの機能を完結させるフレームワーク設計だったのですが、それがなくなりました(1系は忘れましたが似たような機能があったような)。

僕個人の感想ですが、Bundleを切ることでその中で完結できる反面、各Bundleごとに似たようなロジックを書くことも多いなという印象がありました。

もちろん共通のBundleを切るなりclassを実装するなりしてそっちを見ろよという意見もあると思いますが。

 

Controller Action Namingの変更↓↓

毎度恒例だったController内のfunctionにActionサフィックスをつける必要がなくなりました。

 

DIが使いやすい↓↓

DIとはDependency Injection(依存性注入)のコトを指します。

3.3系の時からなのですが4系も変わらずDIが圧倒的に使いやすいです。それまでずっと設定ファイルがカオスになってましたからね^^;

PHPのフレームワークではLaravelのDIが衝撃的に使いやすかったのですが、今のSymfonyも同じくらい使いやすいと思います。

詳しいコトはこちらのリファレンスを見れば分かるかと思います。

 

Annotationで設定を記述するのがBest Practices↓↓

Best PracticesではRoutingなどはAnnotationで記述したほうがいいとのことです。

従来と同じく設定ファイルにまとめる方法でも出来ますが、デフォルトの設定がAnnotationでやろうねってなっていますね。

当サイトも現在、設定ファイルから各Annotationへの記述に寄せています。

正直、yamlで設定するほうがいいんですが。。。

 

ディレクトリ構造が変わった(おまけ)↓↓

メジャーバージョンアップの際は毎度好例なのですが今回もディレクトリ構造に変更があります。

また、設定ファイルにも変更があります。

まぁ儀式のようなものなのでリファレンスを読めば問題ないですね。

 

 

サンプルロジックもGitHubに上がっていますのでそれを見たほうがしっくりくるかもしれません。

僕はサンプルロジック等は見ていません。リファレンスを見た結果、内部で使われているclass何かはほとんど同じと判断したので。

思想は大きく変わりましたが、1つ1つのclass自体はほとんど変化はないように思えます。

 

個人的には、旧バージョンより非常に使いやすくなった印象を持ちました。

 

 

 

これからバグなんかも出てきて何度かマイナーバージョンアップがあるかと思います。

Symfony4がどのように評価されるか今から楽しみです。

Symfonyの奏でかた

最近は阿波銘木のシステム開発にも精力的に関わっています。

 

お久しぶりです。webシステム担当です。

 

今日の東京は暑かったです。

朝から中央線が人身事故で動かなかったのが悲しかった。。。

なぜ自分はこんな日に限って早起きしたのだろうと^^;

 

まぁ、それはいいや^^

 

さてさて、

7月に当サイトのレスポンシブWebデザイン版をロンチした後は、臼・杵のページをアップデートしただけでフロントにはほとんど手を入れていません。

では、何をしてるの??と言いますとサーバーサイドの改修を行っています。

 

いつかのブログでも書きましたが当サイトはフレームワークにSymfonyを採用しています。

 

開発当初は最新版が2.3だったのですが現在はサポートも切れてしまったので(まぁサポートなどどうでもいいが^^;)現在はSymfonyのバージョンアップに注力しています。

 

現在はSymfony2.8で運用しているのですが、開発環境では3系にバージョンアップをしています。

ロンチ出来るのもまもなくではないでしょうか。

(追記:2017年09月30日により、当サイトはSymfony3.3.10での運用を開始致しました。)

まぁロンチしたところで誰も分からない部分ではありますが。。。

開発者としては最新版で運用することはとても大切なことです^^

 

また、それと平行してPHPを5系から7系にバージョンアップしました。

PHP7は無名クラスやメソッドの引数・戻り値での型付けなどの点で大きな変更があり、限りなくJavaに寄せてきたなという印象です。7.1からはNullableやvoidの指定(今までは戻り値の指定がない場合はnullが返る仕様でした)もできます。

これはJava出身の僕からするとありがたい話で、Symfonyのバージョンアップと平行して7系にどんどん寄せています。

当サイトは今現在、PHP7.1.10で運用しています。

 

本当にこの世界は移り変わりが激しいですね。

もう8年前になります。

僕が初めてSymfonyを採用したときは最新バージョンが1.2でした。

当時はSymfonyの奏でかたというブログを見ながら開発していました。懐かしい。

そんなSymfonyも今では3.3までバージョンが上がっています。

そして、PHP4大フレームワーク(CakePHP、Symfony、Zend Framework、CodeIgniter)と言われていた時代も終わり、今はLaravelに人気が集まっています(僕も何度もLaravelのプロジェクトに参画しましたが確かに使いやすい)。

 

ちなみに東京ではPHPを上回る勢いでRuby(Ruby on Rails)が伸びている印象です。

現在は僕も、Ruby on Rails + React.jsの開発に携わっています。

 

アニメーション以外でjQueryを使用するのもそろそろ終わりそうです。Ajaxもaxiosのほうが推奨されてますしね。

 

 

とりあえず今の仕事が落ち着いたらプログラミング言語の勉強を一旦止めて旅行に行きたいです^^

 

最後に大好きなSymfonyのロゴ↓↓

 

 

もうすぐ選挙だ!!

 

 

docker勉強

ブログを書くのは本当に久しぶりのwebシステム担当です^^

 

と言っても阿波銘木の仕事もぼちぼちしています。

今は僕が東京の現場で仕事をしているので思うようには出来ませんが。。。

 

このブログシステムも僕が作りました(ナイショ)。

 

まぁ、エンジニアなんてそんなもんだろうと思うワケですw

 

今日はdockerの勉強をしていました。

OSはCentOSを指定したのですが、まさかまさかのsystemctlで怒られるという、とんでも事件に巻き込まれていますwww

 

いつもはvagrantで開発していたのですがGCPがdockerとの連携を強めたので、これはやらないとダメだと^^;

 

以下はDockerfile

 

-----Dockerfile-----

 

# Pull base image.
FROM centos

MAINTAINER development

# timezone
RUN cp -fp /usr/share/zoneinfo/Japan /etc/localtime

# yum update
RUN yum -y install yum-plugin-priorities
RUN yum -y update

# SELinux(入ってないっぽいのでコメントアウト)
# RUN setenforce 0

# kernel
RUN yum -y update kernel*
RUN yum -y install kernel-devel kernel-headers dkms gcc gcc-c++

# repository
RUN yum -y install epel-release
RUN curl -sL https://rpm.nodesource.com/setup_4.x | bash -
RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# wget
RUN yum -y install wget

# zip unzip
RUN yum install -y zip unzip bzip2
    
# make
RUN yum -y install make

# Git(makeで死んだのでとりあえずyumで落とす)
RUN yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
RUN yum -y install git

#uninstall apache
RUN yum -y remove httpd

# nginx for centos7
RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install nginx

# PHP7
RUN yum -y install --enablerepo=remi-php70 php php php-mbstring php-pear php-mcrypt php-mysql php-fpm

# composer
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

# rbenv
RUN yum -y install readline-devel
RUN git clone https://github.com/sstephenson/rbenv.git /root/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /root/.rbenv/plugins/ruby-build
RUN ./root/.rbenv/plugins/ruby-build/install.sh
ENV PATH /root/.rbenv/bin:$PATH
RUN echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
RUN echo 'eval "$(rbenv init -)"' >> .bashrc

# add Ruby version
RUN rbenv install 2.4.0
RUN rbenv global 2.4.0

# rybygames
RUN bash -l -c "gem install bundler"
RUN rbenv rehash

# node.js
RUN yum -y install nodejs

# mariaDB
RUN yum -y install mariadb-server mariadb-devel galera

# iptables
RUN yum -y install iptables-services

 

# Java
RUN yum -y install java-1.8.0-openjdk

# jenkins
RUN wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
RUN rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
RUN yum -y install jenkins

 
# postfix(SMTPはログイン後に設定)
RUN yum -y install postfix
RUN yum -y install cyrus-sasl*
RUN yum -y install telnet
RUN yum -y install mailx

#root no password(とりあえずrootだけでやってみるのでコメントアウト)
#RUN echo 'LoginGraceTime 120' >> /etc/ssh/sshd_config
#RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
#RUN echo 'StrictModes yes' >> /etc/ssh/sshd_config

# docker user setup(とりあえずrootだけでやってみるのでコメントアウト)
#RUN useradd docker
#USER docker
#ORKDIR /home/docker
#ENV HOME /home/docker

#RUN mkdir .ssh
#RUN chmod 700 .ssh

# waiting port
EXPOSE 22
EXPOSE 80
EXPOSE 443

EXPOSE 3306
EXPOSE 8080

#mount
VOLUME [ '/var/www/html' ]

 

-----/Dockerfile-----

 

 

以下はdockerのimageにログインしてcommitしたいもの

 

-----docker images-----

 

# vi /etc/nginx/nginx.conf

------vi /etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    index   index.php index.html index.htm;

    upstream phpfcgi {
        server 127.0.0.1:9000;
        # server unix:/var/run/php5-fpm.sock; #for PHP-FPM running on UNIX socket
    }

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
}
------/vi /etc/nginx/nginx.conf


# vi /etc/nginx/conf.d/web.conf

------vi /etc/nginx/conf.d/web.conf
server {
    listen 80;

    server_name localhost;
    root /var/www/html/public;

    fastcgi_read_timeout 120;

    client_max_body_size 5M;


    location / {
        try_files $uri /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }
}
------/vi /etc/nginx/conf.d/web.conf

# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
# systemctl start nginx
# systemctl enable nginx

# vi /etc/php-fpm.d/www.conf
user = root
group = root

# systemctl start php-fpm
# systemctl enable php-fpm

 

# systemctl start mariadb
# systemctl enable mariadb
# mysql -u root
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO administrator IDENTIFIED BY 'admin' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> quit;

# iptables -P FORWARD DROP
# systemctl stop iptables
# systemctl disable iptables

# systemctl stop firewalld
# systemctl disable firewalld

 

-----docker images-----

 

 

systemctlさえ問題なければすぐに開発環境の構築に成功するのですが、こう言ったアプリケーションはなんだかんだでうまくいかないものです^^;

大きな問題ではないですが。

 

これからはvagrantよりdockerのほうが主流になると信じてdockerで環境を作ろうと思っています。

 

こぼれ話で今までJavaとPHPの開発環境で使用していたVagrantfileも載せておきます。

 

-----Vagrantfile-----

# development Vagrantfile

Vagrant.configure("2") do |config|

  # OS
  config.vm.box = "bento/centos-7.2"
  config.vm.provider :virtualbox do |vb|
     vb.gui = true
     vb.customize ["modifyvm", :id, "--ostype", "RedHat_64"]
  end

  config.vm.provision :shell, inline: <<-EOT

    # timezone
    cp -fp /usr/share/zoneinfo/Japan /etc/localtime

    # yum update
    sudo yum -y install yum-plugin-priorities
    sudo yum -y update

    # SELinux
    sudo setenforce 0

    # kernel
    sudo yum update -y kernel*
    sudo yum -y install kernel-devel kernel-headers dkms gcc gcc-c++

    # repository
    sudo yum -y install epel-release
    sudo curl -sL https://rpm.nodesource.com/setup_4.x | bash -
    sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    sudo yum -y install wget

    # zip unzip
    sudo yum install -y zip unzip

    # Git
    sudo yum -y install wget gcc
    sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
    sudo yum -y install git
    cd /usr/local/src/
    git clone git://git.kernel.org/pub/scm/git/git.git
    cd git
    sudo make prefix=/usr/local all
    sudo make prefix=/usr/local install

    #uninstall apache
    sudo yum -y remove httpd

    # nginx for centos7
    sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
    sudo yum -y install nginx
    sudo systemctl enable nginx
    sudo systemctl start nginx

    # PHP7
    sudo wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    sudo rpm -ivh ./remi-release-7.rpm
    sudo yum --enablerepo=remi-php70 -y install php php php-mbstring php-pear php-mcrypt php-mysql php-fpm
    sudo systemctl start php-fpm
    sudo systemctl enable php-fpm

    # composer
    cd /var/www/html/
    curl -sS https://getcomposer.org/installer | php
    sudo mv composer.phar /usr/local/bin/composer

    # mariaDB
    sudo yum -y install mariadb-server mariadb-devel galera
    sudo systemctl start mariadb
    sudo systemctl enable mariadb

    #sudo mysql -u root
    #MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO administrator IDENTIFIED BY 'admin' WITH GRANT OPTION;
    #MariaDB [(none)]> FLUSH PRIVILEGES;
    #MariaDB [(none)]> quit;

    # iptables
    sudo yum -y install iptables-services

    sudo iptables -P FORWARD DROP
    sudo systemctl restart iptables
    sudo systemctl enable iptables

    # firewall
    sudo systemctl stop firewalld
    sudo systemctl disable firewalld

 

    #Java

    sudo yum -y install java-1.8.0-openjdk

    # jenkins
    sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
    sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
    sudo yum -y install jenkins
    sudo systemctl start jenkins
    sudo systemctl enable jenkins
    sudo yum -y install cyrus-sasl*

    # postfix
    sudo systemctl start saslauthd
    sudo systemctl enable saslauthd
    sudo yum -y install telnet
    sudo yum -y install mailx
    
    #ネットワーク再起動
    sudo systemctl restart network.service
  EOT

  config.vm.network :forwarded_port, guest: 22,   host: 22, id: "ssh"
  config.vm.network :forwarded_port, guest: 80,   host: 80
  config.vm.network :forwarded_port, guest: 3306, host: 3306
  config.vm.network :forwarded_port, guest: 8080, host: 8080
  config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=777','fmode=755']

  config.vm.synced_folder "local directory', "host directory", owner: "vagrant", group: "vagrant", mount_options: ["dmode=777", "fmode=755"]
end

 

-----/Vagrantfile-----

 

これだけでは動きません。実際にはvagrantにログインしてサーバ設定してます。

 

 

参考になる方はどうぞ使って下さいwww

 

東京は今日は19度まで上がりました。

 

いよいよ春ですね。

GWに北海道に帰省したら何しようかな^^

 

 

カテゴリー
最新記事
アーカイブ
カテゴリー
最新記事
アーカイブ
facebook
Twitter
TOPへ戻る