ラベル laravel の投稿を表示しています。 すべての投稿を表示
ラベル laravel の投稿を表示しています。 すべての投稿を表示

2015年3月1日日曜日

Laravel4.2で独自ヘルパーを作成してautoloadする

たまにだけしかできていないですが、laravelの勉強をしていて独自ヘルパーを読み込めるようにしたいと思い、調べてみました。

どんなときにヘルパーを呼び出したかったかというと、セレクトメニューなどで表示する項目は文字だけど、DBに登録するのが一意の数字のときに、ビューで表示したい項目の番号をヘルパーに渡して、表示したい文字列に変換したいときなどです。

まず、ヘルパー用のhelpersディレクトリをappディレクトリ配下に作り、その配下にファイルを作成します。

$ mkdir app/helpers
$ vim app/helpers/HelperDemo.php
<?php
function demo()
{
    return "OK";
}

今回は呼び出せるかを確認したいので、OKを返すようにしておきます。ファイルを作成できたら、オートロードするようにcomposer.jsonを変更します。

$ vim composer.json
"autoload": {
      "classmap": [
           "app/commands",
           "app/controllers",
           "app/models",
           "app/database/migrations",
           "app/database/seeds",
           "app/tests/TestCase.php"
      ],
        "files": [
            "app/helpers/HelperDemo.php"
        ]
}

記述を追加するのは、autoloadの中にfilesという名前で要素を作成し、読み込みたいファイルまでのパスを記述します。

composer.jsonの変更が完了したら、dump-autoloadして読み込めばdemo()メソッドは呼び出すことができるようになります。

ヘルパーを複数作る可能性があるので、クラスのようにディレクトリを指定して、ディレクトリ内のファイルを全部読み込むことができれば良いなと思いました。

知らないだけでできるのかもしれませんが…

2014年11月24日月曜日

Laravelでマイグレーション後にモデル作成してもデータが登録ができない

いままで、SQLiteを使ったことがなかったため、ちょっと試してみようということで、勉強を始めたlaravelで触ってみることにしました。

ですが、開始早々に躓いてしまいました。。

どんなことに躓いたかといいますと、マイグレーションからテーブルを作成し、テストデータを登録しようとしたら、追加できなかったのです。

ヘタレ具合を露呈させてしまいますが、まとめてみました。

まず、artisanコマンドでマイグレーションファイルを生成します。

$ php artisan migrate:make profile
Created Migration: 2014_11_23_230533_profile
Generating optimized class loader

上記のコマンドを実行すると「2014_11_23_230533_profile.php」というファイルがapp/databases/migrations配下に生成されます!

この生成したファイルにテーブルのカラム情報を記述していきます。記述するのは、マイグレーションファイルのupメソッドです。

$ vim app/database/migrations/2014_11_23_230533_profile.php
public function up()
{
// profileテーブル作成
       Schema::create('profile', function($table){
           $table->increments('id');
           $table->string('name');
           $table->timestamps();
       });
}

Schemeのcreateでテーブル名とカラム情報を設定します。最後のtimestamp()ではcreated_at、updated_atというカラムを作成できます!

記述が終わったら、artisanでmigrateします。

$ php artisan migrate

これでテーブルが作成できたので、モデルを作っていきます。

モデルでは、下記のようにテーブルや変更しないカラム、変更する可能性のあるカラムを指定しておきます。

 $ vim /app/models/Profile.php
 class Profile extends Eloquent {
     protected $table    = 'profile';
     protected $gurded   = array('id');
     protected $fillable = array('name');
 }

モデルを作成したら、今度はコントローラーでデータを追加してみます。

$ vim /app/controllers/ProfileController.php
public function index()
{
    $profile = new Profile;

    $profile->name = 'jack';
    $profile->save();
}

new Profileでインスタンスを生成して、save()で保存するように記述して、完了です。

これで、今回のテストデータ登録ができるはずだったのですが、エラーが出てしまいました。

Symfony\Component\Debug\Exception\FatalErrorException thrown with message "Call to undefined method Profile::save()"

Stacktrace:
#1 Symfony\Component\Debug\Exception\FatalErrorException in /app/controllers/ProfileController.php:15
#0 Illuminate\Exception\Handler:handleShutdown in <#unknown>:0

エラーを確認すると、saveメソッドが定義されていないというものでした。

save()が定義されていないということは、モデルを作ったけど、読み込まれていないのか!?と思い、dump-autoloadしてみることにしました。

$ composer dump-autoload
Generating autoload files

無事にコマンドが成功したので、再度登録を試みるも変わらずに同じエラーが出てしまいました。。

まだ、読み込めていないのかなんなのかよくわらないので、$profileをvar_dumpしてみました。var_dumpしていろいろ表示されてもよく分からないけど、とりあえずvar_dump‼︎

$profile = new ProfileTable;
var_dump($profile);

こんな感じでProfileの内容をvar_dumpしたところ•••
 
object(Profile)#131 (1) { ["connection":protected]=> NULL }

あ•••
NULLという文字が見える。。
これは、モデルがちゃんと生成できていないということなのか!?

なかなか混乱してきましたが、モデルがちゃんと読み込まれていない可能性があるということは、dump-autoloadでモデルがちゃんと入らなかったのか?ということで、dump-autoloadで更新されるautoload_classmap.phpを確認してみました。

ファイル内でprofileを検索したところ、モデルは読み込まれておらず、代わりにマイグレーションがProfileとして読み込まれていました。。

$ vim vendor/composer/autoload_classmap.php
'Profile' => $baseDir . '/app/database/migrations/2014_11_23_230533_Profile.php',

これは、マイグレーションとモデルが同じ名前で、すでにマイグレーションがあるからモデルが追加されていない?ということなのか?

もしそういうことなら、モデルの名前を変えればエラーじゃなくなるのか?

うーん、よく分からない。
考えても分からないので、とりあえずモデル名を変えてみます。。

$ vim /app/models/Profiles.php
<?php
class Profiles extends Eloquent {
    protected $table    = 'profile';
    protected $gurded   = array('id');
    protected $fillable = array('name');
}

モデルのもともとProfileだったものをProfilesに変更してみました。コントローラーで呼び出しているところも変更します。

$ vim /app/controllers/ProfileController.php
$profile s = new Profiles;

$profiles->name = 'jack';
$profiles->save();

ファイルの変更が終わったら、dump-autoloadで更新!

更新後にautoload_classmap.phpを確認したところ、Profilesが追加されているのが確認できました。

$ vim vendor/composer/autoload_classmap.php
'Profile' => $baseDir . '/app/database/migrations/2014_11_23_230533_Profile.php',
'Profiles' => $baseDir . '/app/models/Profiles.php',

モデルが読み込まれたので、実行してみるとエラーは解消され、無事に登録することができました。

+--+-------+----------------------------+----------------------------+
|id  |name  |created_at                     |updated_at                   |
+--+-------+----------------------------+----------------------------+
| 1  |jack    |2014-11-24 00:42:36|2014-11-24 00:42:36|
+--+-------+----------------------------+----------------------------+

今回の原因は、先に作成したマイグレーションがProfileとして読み込まれていたため、同じ名前で指定したProfileモデルが追加されなかったということみたいです。


macOSでminikubeをインストールしようとしたら書き込みエラーになった

ローカル環境でKubernetesを使えるようにしようと環境構築中にエラーが 下記が今回のエラーで書き込みできない感じのメッセージが出ています。  $ brew install minikube Updating Homebrew... Error: The following ...