2016年12月29日木曜日

PHP / laravel入門

Nothing worth to see here

あくまでも自分用のメモ

引き続きドットインストールのお世話になります。
今回はlaravelフレームワークのメモを残していきます。


メモ

Composer
laravelをインストールする上で、composerを使います。 依存性チェックツール。
JavaでいうMaven, Gradleにあたりますかね。
PHPはコンパイラ言語ではなくインタープリタ言語のため、build不要のはずです。
そのため、純粋に依存性のチェックと解決(必要なライブラリのインスト)だけだと思っています。
なぜ依存性チェックツールがlaravelのインストールの前に必要かというと、
laravelはフレームワークで多数のライブラリを必要とするため、
手動でライブラリの依存問題を解決するのは、やってられないからです。

composerのインストール
ろくに英語を読まずにやっていましたが、公式ドキュメントを参考に、下記のコマンドを実施しました。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === \
'61069fe8c6436a4468d0371454cf38a812e451a14ab1691543f25a9627b97ff96d8753d92a00654c21e2212a5ae1ff36') \
{ echo 'Installer verified'; } else { echo 'Installer corrupt'; \
unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php --install-dir=/usr/bin --filename=composer
php -r "unlink('composer-setup.php');"
結果として、/usr/bin/composerが配置されます。 通常、/usr/binにはパスは通っているかと思いますので、基本的にcomposerと打てばどこからでも実行できるようになります。

php artisan --version
laravelのバージョン確認
結果
Laravel Framework version 5.3.28

laravelプロジェクトの作成
composer create-project --prefer-dist laravel/laravel
これでプロジェクトを作成できます。

.env
設定ファイル
まずは、下記3つの項目を更新する。
  1. DB
  2. USER NAME
  3. PW

config/app.php
envヘルパー
'log' => env('APP_LOG', 'single')
と言うやつ。
env()で.envから'APP_LOG'keyがkeyとして設定されている値を返します。
設定されていない場合は、二つ目の引数('single')が設定されるそうです。

config/app.php : 設定項目
'timezone' => 'Asia/Tokyo'
'locale' => 'ja'

yumコマンドのエラー
[vagrant@localhost myblog]$ yum install tree
Failed to set locale, defaulting to C
??????????:fastestmirror
自分の自己解決能力のなさを呪いながらも、Qiitaの記事でFIXしました。
localeがセットできないというエラー。
/etc/sysconfig/i18nにLC_CTYPE="ja_JP.UTF-8"を足す。

Httpセッションの管理系ソースを置くフォルダ
</Project Base Dir>/app/Http/
[vagrant@localhost myblog]$ tree app/Http/
app/Http/
├── Controllers
│   ├── Auth
│   │   ├── ForgotPasswordController.php
│   │   ├── LoginController.php
│   │   ├── RegisterController.php
│   │   └── ResetPasswordController.php
│   └── Controller.php
├── Kernel.php
└── Middleware
    ├── EncryptCookies.php
    ├── RedirectIfAuthenticated.php
    └── VerifyCsrfToken.php

routingを管理するファイル
laravel 5.3ではroute/web.phpでroutingを管理
[vagrant@localhost myblog]$ tree routes/
routes/
├── api.php
├── console.php
└── web.php

View関連を格納するディレクトリ
</Project Base Dir>/resources/Views
[vagrant@localhost myblog]$ tree resources/
resources/
├── assets
├── lang
└── views
    ├── errors
    │   └── 503.blade.php
    ├── vendor
    └── welcome.blade.php

php artisan make:migration <Migration Name>
まだ理解できていないのですが、マイグレーションファイルがこれでできる。
artisanファイルは、laravelのBase Dir直下にありますので、
Base Dirで上記のコマンドを実行しましょう。
 php artisan make:migration create_posts_table --create=posts
Created Migration: 2016_12_28_145157_create_posts_table
これでpostsというテーブルを作るバッチファイル(2016_12_28_145157_create_posts_table)が、
</Project Base Dir>/database/migrationsディレクトリ配下にできます。

マイグレーションファイル
作成直後のファイルのベタ貼り
increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
up()にテーブル作成の処理、down()にテーブル削除の処理を書いていくとのこと。
テーブル削除も外部キーあると面倒くさかったりしますもんね。

Blueprintクラスのメソッド
  • increments : int unsigned not null auto_increment primary key
  • string : varchar(255) not null
  • text : text not null

マイグレーションファイルの実行
 php artisan migrate
 Migrated: 2016_12_28_145157_create_posts_table

既存テーブルに変更を加えるマイグレーションファイルの作成
php artisan make:migration modification --table=posts
新規作成ではなく、既存テーブルの変更の場合は--tableオプションを使用します。
基本的に--createで作ったファイルと同じですが、
up()/down()それぞれにある、Schema::tableメソッドは未実装です。

php artisan make:status
どのマイグレーションファイルが適用されているかを出力する

マイグレーションファイル実行のロールバック
php artisan migrate:rollback
Rolled back: 2016_12_28_153233_add_summary2
最後に実行したマイグレーションファイルのdown()が実行される模様。便利!

マイグレーションファイル実行のロールバック
php artisan migrate:rollback
Rolled back: 2016_12_28_153233_add_summary2
最後に実行したマイグレーションファイルのdown()が実行される模様。便利!

マイグレーションファイル実行のロールバックで「Class xxx not found」が出た時
composer dump-autoload
Generating autoload files
composerにパスが通っている前提です。

モデル作成用マイグレーションファイルの作成
php artisan make:model Comment
Model created successfully.
appディレクトリ配下にComment.phpができます。

対話的にモデルを通してDBにモデルの構造のレコードを挿入する
tinkerというプログラムを呼ぶ
 php artisan tinker
Psy Shell v0.8.0 (PHP 5.6.29 — cli) by Justin Hileman
>>> $comment = new App\Comment();
=> App\Post {#674}
>>> $comment->title = 'title 1';
=> "title 1"
>>> $comment->body = 'body 1';
=> "body 1"
>>> $comment->save();
=> true
>>> 

tinkerの終了
exit

Mass Assignmentってなんやねん。
答えはスタックオーバーフローにある
冒頭の数行しか読んでないですが、、、、
配列を使った、複数プロパティ(ORMしているからレコードのフィールドと同義)への代入のことですね。
Mass = 大量の, Assignment = 割り当て
ですもんね。
便利ではあるけど、セキュリティホールになるので、laravelはデフォがオフです。
個別に許可を設定する必要があります。

tinkerでstaticメソッドのcreate()を使いDBにモデルの構造のレコードを挿入する
create()メソッドを使って、連想配列を使ってレコードを挿入する。
しかし、前項目で書いた通り、先にMass Assignmentの設定をモデルクラスでする必要があります。
設定しないと下記のエラーが出ます。
>>> App\Comment::create(['title'=>'title 2', 'body'=>'body 2']);
Illuminate\Database\Eloquent\MassAssignmentException with message 'title'

モデルクラスでプロパティにfillableを設定します。
Mass Assignmentを許可するカラム名を配列で設定します。
protected $fillable = [ 'title', 'body'];

Mass Assignmentの設定をしたら、tinkerを再度立ち上げて、createメソッドを実行します。
連想配列の形で、複数カラムに値を設定できます。便利。
>>> App\Comment::create(['title'=>'title 3', 'body'=>'body 3']);

0 件のコメント:

コメントを投稿