注意
これは私の環境下における私の備忘録です。お使いの環境によっては内容が異なる場合があります。私は何も責任を負いませんのでご了承のうえご覧ください。
前置き
設定編1/2は無駄すぎました。XAMPPやLaravel自体の設定はググったり本を見ればいくらでも解るので、本編行きます。
ちなみにLaravelの本はこちらを読みました。本を開けば宝の山です。青本は本版とkindle版の両方持っています。
下記の本は最初に勉強しました。これも役立ちました。なんせ繰り返しやることですね。繰り返し繰り返しやらないと覚えません。
フレームワークで開発するなら勉強しないと無理です。私が説明するのはAS400の接続と、使用上の注意くらいです。
続いてLaravelでAS400(DB2)にアクセスする設定を行っていきます。
参考文献はこちら
GitHub – JacksonWebServices/laravel-iseries: laravel-iseries
この人が作ったみたいです。感謝しております。ただ私の環境では一部手直しをしないと動かなかったので、その修正箇所も含めてなるべく詳しく書きます。
composer.jsonファイルに追記します
早速ファイルを触っていきますが、カンマ1つ抜けていれば動きません。というか、同じ環境ではないので動く保証なんてありませんけど、とにかく打ち間違いやカンマの洩れとか注意して下さい。見やすいように違いを載せているので、よく位置を確認してコピペして下さい。
cmsフォルダ直下にあるcomposer.jsonファイルをテキストエディタで開きます。メモ帳よりTeraPadのようなちゃんとしたエディタの方がいいです。開いたら上の方にあるrequire項目に追記します。
変更前
"require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.7.*", "laravel/tinker": "^1.0" },
変更後
"require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.7.*", "laravel/tinker": "^1.0", "jacksonwebservices/laravel-iseries": "3.0.*" },
一番下に追記しました。requireの中はカンマ区切りなので、1つ上のtinkerの最後にカンマを付けるのを忘れずに。
composer updateを行います
コマンドプロンプトを開き、cms(仮称)ディレクトリに移動します。
c:\Users\ユーザ名> cd c:\xampp\htdocs\cms
次に、composer updateを行います。
c:\xampp\htdocs\cms> composer update
以上。コマンドを実行してからの時間は約1分ほど。
これを行うことでAS400(iseries)のデータアクセスを実現するためのプログラム群が導入されます。
ちなみに導入される場所は、cms\vendorの中です。
app.phpファイルに追記します
cmsフォルダの中に、configフォルダがあります。その中のapp.phpファイルを開きます。結構下の方にprovidersという項目があります。その最後の方。
変更前
/* * Application Service Providers... */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, ],
変更後
/* * Application Service Providers... */ App\Providers\AppServiceProvider::class, App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, JWS\Iseries\IseriesServiceProvider::class, ],
一番下に1行追加します。
database.phpファイルに追記・変更します
cmsフォルダの中にある、configフォルダの中にある、database.phpを開く。
まず一番最初の項目、
変更前
'default' => env('DB_CONNECTION', 'mysql'),
変更後
'default' => env('DB_CONNECTION', 'odbc'),
にする。
次に、少しスクロールすると出てくるconnectionsの項目の一番下。
変更前
'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', ], ],
変更後
'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', ], 'odbc' => [ 'driver' => 'odbc', 'driverName' => '{iSeries Access ODBC Driver}', // General settings 'host' => env('DB2_HOST'), 'username' => env('DB2_USER'), 'password' => env('DB2_PASSWORD'), //Server settings 'database' => env('DB2_NAME'), 'prefix' => '', 'schema' => env('DB2_DEFAULT_SCHEMA'), 'signon' => 3, 'ssl' => 0, 'commitMode' => 2, 'connectionType' => 0, 'defaultLibraries' => '', 'naming' => 0, 'unicodeSql' => 0, // Format settings 'dateFormat' => 5, 'dateSeperator' => 0, 'decimal' => 0, 'timeFormat' => 0, 'timeSeparator' => 0, // Performances settings 'blockFetch' => 1, 'blockSizeKB' => 32, 'allowDataCompression' => 1, 'concurrency' => 0, 'lazyClose' => 0, 'maxFieldLength' => 15360, 'prefetch' => 0, 'queryTimeout' => 1, // Modules settings 'defaultPkgLibrary' => 'QGPL', 'defaultPackage' => 'A/DEFAULT(IBM),2,0,1,0', 'extendedDynamic' => 1, // Diagnostic settings 'QAQQINILibrary' => '', 'sqDiagCode' => '', // Sort settings 'languageId' => 'ENU', 'sortTable' => '', 'sortSequence' => 0, 'sortWeight' => 0, 'jobSort' => 0, // Conversion settings 'allowUnsupportedChar' => 0, 'ccsid' => 1208, 'graphic' => 0, 'forceTranslation' => 0, // Other settings 'allowProcCalls' => 0, 'DB2SqlStates' => 0, 'debug' => 0, 'trueAutoCommit' => 0, 'catalogOptions' => 3, 'libraryView' => 0, 'ODBCRemarks' => 0, 'searchPattern' => 1, 'translationDLL' => '', 'translationOption' => 0, 'maxTraceSize' => 0, 'multipleTraceFiles' => 1, 'trace' => 0, 'traceFilename' => '', 'extendedColInfo' => 0, 'options' => [ //PDO::ATTR_CASE => PDO::CASE_LOWER, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_PERSISTENT => false ] ], ],
sqlsrvの下に、長ったらしいODBC項目を追記するだけです。sqlsrvの項目は場所を解りやすくするため載せているだけなので、変更ありません。
ちなみに参考文献と違う箇所は、一番下にあるoptions項目の一番上
PDO::ATTR_CASE => PDO::CASE_LOWER,
をコメントアウトしたところです。これを外しておかないとなぜかView側で表示しようと思ってもできませんでした。
さらに余談ですが、フラットなPHP編で導入した際にODBCドライバーを3つ入れたと思います。
今回の、ドライバーの指定は
‘driverName’ => ‘{iSeries Access ODBC Driver}’,
になっていますが、参考文献の人が指定したそのままです。これを、
‘driverName’ => ‘{IBM i Access ODBC Driver}’,
にしても動きます。でも、
‘driverName’ => ‘{Client Access ODBC Driver}’,
ではエラーになって動きませんでした。私は今でもiSeries Access ODBC Driverを指定していますが、問題は起きていません。
.envファイルに自分の環境を元に追記します
cmsフォルダの中に.envファイルがあります。それを開きます。
変更元
LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret BROADCAST_DRIVER=log
変更後
LOG_CHANNEL=stack DB_CONNECTION=odbc DB2_HOST=マシンノアイピーアドレス DB2_USER=ユーザーアイディー DB2_PASSWORD=パスワード DB2_ODBC_name=connectionname DB2_default_table=defaulttable DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret BROADCAST_DRIVER=log
カタカナのところ(3ヶ所)は自分の環境を入力する。
サクッとデータベース設定が合ってるか確認する
とりあえずAS400のデータが引っ張れるか確認したいのですが、サクッといっても難しいのです。とりあえずデータベースの情報を取得するコードをコントローラー内に作って、そこにルーティングが向くように設定をします。
コントローラーを作ります
コマンドプロンプトを開き、cmsフォルダに移動し(何度もやってるので説明は割愛します)、そこで下記コマンドを実行します。
c:\xampp\htdocs\cms> php artisan make:controller testController
testControllerのCはデカいCです。cではダメです。次の開発編でお話しますが、Laravelはルールに沿った命名規則がありますゆえ、いろいろ面倒なのです。
実行すると、Controller created successfullyと表示されます。
すると、cms\app\Http\Controllersのなかに、testController.phpというのができます。
中身は、
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class testController extends Controller { // }
こんな感じです。それを、
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use DB; class testController extends Controller { public function index(){ $DB = DB::select(" SELECT * FROM ライブラリ名.テーブル名 "); //テーブルの中身を全部吐き出す print_r($DB); } }
こんな感じにします。4行目に追加したuse DB;も忘れずに。ライブラリ名とテーブル名はご自身の環境でテスト的に引っ張りたいものを指定してください。
ルーティングをtestControllerに向けます
cms\routesのなかに、web.phpというのがあるので、それを開きます。
変更前
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); });
変更後
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/','testController@index');
最後をこんな感じに変更します。
アクセスしてみる
自身のIPアドレスにアクセスして、こんな感じに表示されたら成功。2バイト文字は文字化けしているはずですが、データベースの中身が表示されているはずです。それで正常です。
ほぼ手順化しましたが、手順通りとはいえここまでくれば大したもんだと思います。
データさえ引っ張れるようになればこっちのもんなので、後はLaravelを勉強してガンガン開発して慣れるべしです。
次はAS400でLaravel開発をするうえで困った点などをまとめた開発編です。
MySQLとAS400(DB2)は勝手が違うので、Laravelで開発するにせよ使い勝手はかなり違います。
AS400を 無料でWeb化 GUI化 オープン化 PHP/Laravel開発編
まあまだ追記したいことはあるので、開発編は更新するつもりです。
Laravel自体の習得は本などを元に習得してください。私の備忘録はあくまでAS400絡みのLaravelですので。
そうやってある程度開発できるようになれば、いよいよサーバを構築していきます。
バージョンなどを恐れずに言うと完璧に手順化したつもりです(自分のために)
コメント