Help us understand the problem. What is going on with this article?

SprintPHPをCloud9で使ってみた。

More than 3 years have passed since last update.

SprintPHPについて

SprintPHP

Blazing fast Web Application development with SprintPHP. Fully baked and ready to rock.

詳細は略

Cloud9、composerでSprintPHPのインストール

composerを使ってSprintPHPのインストールを実行しますが、Cloud9の端末上で実行しようとするとアップデートを勧められるので実行します。

$ composer create-project sprintphp/sprintphp sprintphp dev-develop
  Warning: This development build of composer is over 60 days old. It is recommended to update it by running "/usr/bin/composer self-update" to get the latest version.

$ sudo composer self-update

アップデートが完了したらSprintPHPをインストール。
今回はsprintphpというディレクトリに配置することにします。

$ pwd
/home/ubuntu/workspace
$ composer create-project sprintphp/sprintphp sprintphp dev-develop

インストールが完了したらsprintphpディレクトリに移動してsprintコマンドが実行できるか確認

$ cd sprintphp
$ php sprint
You must pass a valid command to sprint.

Cloud9の公開ディレクトリの変更

このままだとURLに余分なディレクトリが入ったままになるので公開ディレクトリを変更します。
以下のファイルを編集すればよいみたいです。

$ sudo vi /etc/apache2/sites-enabled/001-cloud9.conf

DocumentRootを変更します。

/etc/apache2/sites-enabled/001-cloud9.conf
    DocumentRoot /home/ubuntu/workspace
↓
    DocumentRoot /home/ubuntu/workspace/sprintphp

SprintPHPのconfig変更とデータベース接続

SprintPHPはほとんどCodeigniter3のままなのでいつもの場所にあるconfigを変更すればデータベースに接続できるようになります。

~/workspace/sprintphp/application/config/config.php
$config['base_url'] = '';

$config['base_url'] = 'https://sprintphp-test-youhei-nakagawa.c9users.io';

同じくconfigファイルだけどencryption_keyは一応変更

~/workspace/sprintphp/application/config/config.php
$config['encryption_key'] = hex2bin( '23e1f843dc67509597fe17b8372de916' );

$config['encryption_key'] = hex2bin( 'eafbb3fb57df1828c68b51f99cd793be' );
~/workspace/sprintphp/application/config/database.php
        'hostname' => 'localhost',
        'username' => 'root',
        'password' => 'root',

        'hostname' => getenv('IP'),
        'username' => getenv('C9_USER'),
        'password' => '',

via: Cloud9でMySQLを使う

Cloud9、MySQLの起動とデータベースの作成

Cloud9は手動でMySQLを起動する必要があるみたいです。
オリジナルの起動コマンド?

$ mysql-ctl start
$ mysql-ctl cli

MySQLにこれから使うデータベースを作成し中身を確認

mysql> create database sprint;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| c9                 |
| mysql              |
| performance_schema |
| sprint             |
+--------------------+
5 rows in set (0.00 sec)

mysql> use sprint;
Database changed
mysql> show tables;
Empty set (0.00 sec)

SprintPHPのマイグレーションの実行

via: Installing SprintPHP

SprintPHPには標準的なログイン機能が提供されていて必要なテーブルの作成を行ってくれます。

$ php sprint database migrate
Migration group to refresh? [ Default: "app" ]: 
Migrate to the latest available version? [ y, n ]: y

        Successfully migrated database from version 0 to 20160111121139.

上記sprintコマンド実行後MySQLにテーブルが入ったことが確認できます。

mysql> show tables;
+-------------------------+
| Tables_in_sprint        |
+-------------------------+
| auth_groups             |
| auth_groups_permissions |
| auth_groups_users       |
| auth_login_attempts     |
| auth_logins             |
| auth_permissions        |
| auth_tokens             |
| ci_sessions             |
| mail_queue              |
| migrations              |
| settings                |
| user_meta               |
| users                   |
+-------------------------+
13 rows in set (0.00 sec)

この状態でCloud9の公開URLにアクセスしてみます。

https://{プロジェクト名など}.c9users.io/login
sprintphp_login.png

ユーザー登録などが実行できるようになっています。

SprintPHPのforge機能、modelの作成

via: SprintPHP - Using the Forge Generators

以下のコマンドでmodelファイルの作成ができます。

$ php sprint forge model
Invoked ModelGenerator
Model name: rabbit_model
Table name [ Default: "rabbits" ]: 
Primary Key [ Default: "id" ]: 
Set Created date? [ y, n ]: y
Set Modified date? [ y, n ]: y
Date Format? [ datetime, date, int ]: datetime
Log User actions? [ y, n ]: n
Use Soft Deletes? [ y, n ]: y
        created models/Rabbit_model.php

Rabbit_model.phpがありますね。

$ ls application/models/
Rabbit_model.php  User_model.php  index.html

しかしMySQLの中にはrabbitsテーブルは存在していないことを確認。

mysql> show tables;
+-------------------------+
| Tables_in_sprint        |
+-------------------------+
| auth_groups             |
| auth_groups_permissions |
| auth_groups_users       |
| auth_login_attempts     |
| auth_logins             |
| auth_permissions        |
| auth_tokens             |
| ci_sessions             |
| mail_queue              |
| migrations              |
| settings                |
| user_meta               |
| users                   |
+-------------------------+
13 rows in set (0.00 sec)

SprintPHPのforge機能、既存テーブルからmodelの作成

forge機能を使ってみます。まずは既存のテーブルからmodelを作成します。
既存のmail_queurテーブルを使ってみます。
まずは存在確認。

mysql> desc mail_queue;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| mailer  | varchar(255)     | NO   |     | NULL    |                |
| params  | text             | YES  |     | NULL    |                |
| options | text             | YES  |     | NULL    |                |
| sent    | tinyint(1)       | NO   | MUL | 0       |                |
| sent_on | datetime         | YES  |     | NULL    |                |
+---------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

modelを生成。
テーブル名を指定します。

$ php sprint forge model
Invoked ModelGenerator
Model name: mail_queue_model
Table name [ Default: "mail_queues" ]: mail_queue
Set Created date? [ y, n ]: n
Set Modified date? [ y, n ]: n
Date Format? [ datetime, date, int ]: datetime
Log User actions? [ y, n ]: n
Use Soft Deletes? [ y, n ]: n
        created models/Mail_queue_model.php

ファイルがテーブルの内容と同期して生成されたことを確認します。

$ cat application/models/Mail_queue_model.php

一部抜粋。

application/models/Mail_queue_model.php
    /**
     * An array of validation rules. This needs to be the same format
     * as validation rules passed to the Form_validation library.
     */
    protected $validation_rules = [
                [
                        'field' => 'id',
                        'label' => 'Id',
                        'rules' => 'integer|max_length[11]',
                ],              [
                        'field' => 'mailer',
                        'label' => 'Mailer',
                        'rules' => 'alpha_numeric_spaces|max_length[255]',
                ],              [
                        'field' => 'params',
                        'label' => 'Params',
                        'rules' => 'alpha_numeric_spaces',
                ],              [
                        'field' => 'options',
                        'label' => 'Options',
                        'rules' => 'alpha_numeric_spaces',
                ],              [
                        'field' => 'sent',
                        'label' => 'Sent',
                        'rules' => 'integer|max_length[1]',
                ],              [
                        'field' => 'sent_on',
                        'label' => 'Sent On',
                        'rules' => '',
                ],

SprintPHPのforge機能、存在しないテーブルからcontrollerの作成

まずは単純なcontrollerの作成

$ php sprint forge controller
Invoked ControllerGenerator
Controller name: Rabbit
Model Name? (empty is fine): 
Is a Themed Controller? [ y, n ]: n
        created controllers/Rabbit.php

Rabbitコントローラが生成されているのを確認

$ ls application/controllers
Home.php  Rabbit.php  index.html

Rabbitコントローラに紐づくモデルがないことを確認

$ cat application/controllers/Rabbit.php
application/controllers/Rabbit.php
    // If set, this model file will automatically be loaded.
    protected $model_file      = null;

rabbitモデルと紐づくようにします。
先ほどのコントローラ作成のコマンドの後ろに既存コントローラを指定すると再設定が可能に。しかし上書きができない。

$ php sprint forge controller rabbit
Invoked ControllerGenerator
Model Name? (empty is fine): rabbit_model
        exists: controllers/Rabbit.php

-overwriteオプションを追加して再度実行

$ php sprint forge controller rabbit -overwrite
Invoked ControllerGenerator
Model Name? (empty is fine): rabbit_model
        overwrote controllers/Rabbit.php

モデルが指定されていることを確認

$ cat application/controllers/Rabbit.php
application/controllers/Rabbit.php
    // If set, this model file will automatically be loaded.
    protected $model_file      = 'rabbit_model';

SprintPHPのforge機能、存在しないテーブルと既存モデル及びコントローラからviewの作成

先ほどのモデルと紐づけるコマンドに -create_view オプションをつけることで作成可能。
しかしデータベースエラーが発生。そもそもテーブルが存在していない。

$ php sprint forge controller rabbit -overwrite -create_views
Invoked ControllerGenerator
Model Name? (empty is fine): rabbit_model
        overwrote controllers/Rabbit.php
        created views/rabbit/index.php

        A PHP Error was encountered
        Severity: Warning
        Message: Invalid argument supplied for foreach()
        Filename: /home/ubuntu/workspace/sprintphp/myth/_generators/Controller/view_create.tpl.php
        Line Number: 14

テーブルを作りますがマイグレーションファイルを生成してそこからテーブルを生成したいと思います。

$ php sprint forge migration create_rabbit_table -fields "name:string id:id created_on:datetime modified_on:datetime age:int:2"
Invoked MigrationGenerator
        created database/migrations/20160128042421_Create_rabbit_table.php

先ほど作成したマイグレーションファイルを実行します。

$ php sprint database migrate
Migration group to refresh? [ Default: "app" ]: 
Migrate to the latest available version? [ y, n ]: y

        Successfully migrated database from version 20160111121139 to 20160128042421.

テーブルが生成されているのを確認します。

mysql> show tables;
+-------------------------+
| Tables_in_sprint        |
+-------------------------+
| auth_groups             |
| auth_groups_permissions |
| auth_groups_users       |
| auth_login_attempts     |
| auth_logins             |
| auth_permissions        |
| auth_tokens             |
| ci_sessions             |
| mail_queue              |
| migrations              |
| rabbits                 |
| settings                |
| user_meta               |
| users                   |
+-------------------------+
14 rows in set (0.00 sec)

mysql> desc rabbits;
+-------------+-----------------+------+-----+---------+----------------+
| Field       | Type            | Null | Key | Default | Extra          |
+-------------+-----------------+------+-----+---------+----------------+
| name        | varchar(255)    | YES  |     |         |                |
| id          | int(9) unsigned | NO   | PRI | NULL    | auto_increment |
| created_on  | datetime        | NO   |     | NULL    |                |
| modified_on | datetime        | NO   |     | NULL    |                |
| age         | int(2)          | NO   |     | 0       |                |
+-------------+-----------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

テーブルができたところで再度viewファイルを生成、エラーが発生しないことを確認

$ php sprint forge controller rabbit -overwrite -create_views
Invoked ControllerGenerator
Model Name? (empty is fine): rabbit_model
        overwrote controllers/Rabbit.php
        overwrote views/rabbit/index.php
        overwrote views/rabbit/create.php
        overwrote views/rabbit/show.php
        overwrote views/rabbit/update.php

SprintPHPのforge機能、存在するテーブルからマイグレーションファイルを生成

migration-fromdbをつけるだけ
この例では最初からつく荒れていたusersテーブルのマイグレーションファイルを生成します。

$ php sprint forge migration create_users_table -fromdb
Invoked MigrationGenerator
        created database/migrations/20160128043525_Create_users_table.php

ファイルの中身を確認

$ cat application/database/migrations/20160128043525_Create_users_table.php
        $fields = [
                'id' => [
                        'type' => 'int',
                        'constraint' => 11,
                        'auto_increment' => true,
                        'unsigned' => true,
                ],              'email' => [
                        'type' => 'varchar',
                        'constraint' => 255,
                ],              'username' => [
                        'type' => 'varchar',
                        'constraint' => 30,
                ],              'password_hash' => [
                        'type' => 'varchar',
                        'constraint' => 255,
                ],              'reset_hash' => [
                        'type' => 'varchar',
                        'constraint' => 40,
                ],              'activate_hash' => [
                        'type' => 'varchar',
                        'constraint' => 40,
                ],              'created_on' => [
                        'type' => 'datetime',
                        'default' => '0000-00-00 00:00:00',
                ],              'status' => [
                        'type' => 'varchar',
                        'constraint' => 255,
                ],              'status_message' => [
                        'type' => 'varchar',
                        'constraint' => 255,
                ],              'active' => [
                        'type' => 'tinyint',
                        'constraint' => 1,
                ],              'deleted' => [
                        'type' => 'tinyint',
                        'constraint' => 1,
                ],              'force_pass_reset' => [
                        'type' => 'tinyint',
                        'constraint' => 1,
                ],      ];

SprintPHPのforge機能、存在するテーブルからmigration,model,controller,view,seedファイルを生成する

全部一括して作られるのを確認するために、rabbitテーブルを残してこれまで作成したmodel、migration、controller、view、seedファイルを削除します。
seedは作られてないかな?

そしてscaffoldを実行。何でもかんでもテーブルを参照して作ってくれます。

$ php sprint forge scaffold rabbit -fromdb -overwrite
Invoked ScaffoldGenerator
Invoked MigrationGenerator
        created database/migrations/20160128044044_Create_rabbit_table.php
Invoked SeedGenerator
        created database/seeds/RabbitSeeder.php
Invoked ModelGenerator
        created models/Rabbit_model.php
Invoked ControllerGenerator
        created controllers/Rabbit.php
        created views/rabbit/index.php
        created views/rabbit/create.php
        created views/rabbit/show.php
        created views/rabbit/update.php


Before your new module can be successfully used, you must run the migration to
get the database current.
You can do this with the following line:

    php sprint database migrate

If you have scaffolded this as part of a module, then pass the module name after
that, like:

    php sprint database migrate {module_name}

実際にできた画面をのぞいてみると・・・

sprintphp_scaffold.png

なぜか新規追加画面と編集画面がテーブルの内容とあっていない。

しかたないので、controllerとviewだけ再度生成するためにforge controller -create_viewsをするとよくなる。

$ php sprint forge controller rabbit -overwrite -create_views
Invoked ControllerGenerator
Model Name? (empty is fine): rabbit_model
        overwrote controllers/Rabbit.php
        overwrote views/rabbit/index.php
        overwrote views/rabbit/create.php
        overwrote views/rabbit/show.php
        overwrote views/rabbit/update.php

sprintphp_scaffold_fix.png

できた!

SprintPHPを簡単に使うには?

  1. データベース上に対象となるテーブルをさくっと作成。
    migrationで作成してもいいかも。好みの問題かも。

  2. scaffoldでテーブルに紐づく必要なファイルを一挙に生成
    テーブル名とクラス名の対応には注意!クラス名は単数形、テーブル名は複数形

  3. viewがテーブルの内容とあっていないのでcontrollerとviewだけ再生成
    モデル名の指定だけ気を付ける

単純なコマンドにすると・・・

$ php sprint forge migration create_rabbit_table -fields "name:string id:id created_on:datetime modified_on:datetime age:int:2"
Invoked MigrationGenerator
        created database/migrations/20160128051003_Create_rabbit_table.php

$ php sprint database migrate
Migration group to refresh? [ Default: "app" ]: 
Migrate to the latest available version? [ y, n ]: y

$ php sprint forge scaffold rabbit -fromdb -overwrite
Invoked ScaffoldGenerator
Invoked MigrationGenerator
        created database/migrations/20160128051045_Create_rabbit_table.php
Invoked SeedGenerator
        overwrote database/seeds/RabbitSeeder.php
Invoked ModelGenerator
        created models/Rabbit_model.php
Invoked ControllerGenerator
        created controllers/Rabbit.php
        created views/rabbit/index.php
        created views/rabbit/create.php
        created views/rabbit/show.php
        created views/rabbit/update.php


Before your new module can be successfully used, you must run the migration to
get the database current.
You can do this with the following line:

    php sprint database migrate

If you have scaffolded this as part of a module, then pass the module name after
that, like:

    php sprint database migrate {module_name}

$ php sprint forge controller rabbit -overwrite -create_views
Invoked ControllerGenerator
Model Name? (empty is fine): rabbit_model
        overwrote controllers/Rabbit.php
        overwrote views/rabbit/index.php
        overwrote views/rabbit/create.php
        overwrote views/rabbit/show.php
        overwrote views/rabbit/update.php

使ってみて気になったところとまだわからないところ。

  • 日本語が入らない
  • 編集画面で前のデータが反映されていない
  • 項目の表示/非表示はどうするんだろう?
  • joinテーブル対応はどうするか?
  • 検索画面とかできるのか?

日本語が入らない

validationの問題でした。

$ vi application/models/Rabbit_model.php

とりあえず下記のようにrulesから半角英数字空白縛りを外すと動きます。

application/models/Rabbit_model.php
    protected $validation_rules = [
        [
            'field' => 'name',
            'label' => 'Name',
            //'rules' => 'alpha_numeric_spaces|max_length[255]',
            'rules' => 'max_length[255]',

編集画面で前のデータが反映されていない

修正されました!

SprintPHPのGithubの修正差分

全然わからない英語でIssueを書きましたが対応してもらえて嬉しかったです。

No data is displayed in the edit screen. #162

でもこれってarrayのほうがよく使われているからそうしたみたいに読み取れるけどどうなんだろう?生成されるviewファイルを変更したほうがいいのかな?

以下は解決済みの内容です

テンプレートはオブジェクトを参照、しかしデータベースから取り出したときは配列になるようになっていたのが原因でした。
forgeされると以下のようなコードに。

vi application/models/Rabbit_model.php
application/models/Rabbit_model.php
    protected $return_type = 'array';

このコードを'object'にすれば済むんだけどmodelのテンプレートから変更してforgeするたびに変更する手間を省きます。

vi myth/_generators/Model/model.tpl.php
myth/_generators/Model/model.tpl.php
    protected \$return_type = 'array';
    
    protected \$return_type = 'object';

再度viewファイルを生成

$ php sprint forge controller rabbit -overwrite -create_views
Invoked ControllerGenerator
Model Name? (empty is fine): rabbit_model
        overwrote controllers/Rabbit.php
        overwrote views/rabbit/index.php
        overwrote views/rabbit/create.php
        overwrote views/rabbit/show.php
        overwrote views/rabbit/update.php

しっかりと反映されるようになりました!

sprintphp_edit_fix.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした