Dream of Electric Sheep

WEBやプログラムの忘備録

Laravel 5.1 の Hello World 【View編 の準備】

さて、前回 Controller を使った Hello World をやりましたが、今回は View を使って Hello World をやりましょう。これでMVCのVとCが登場する訳です。ViewにはLaravel標準のbladeというテンプレートを使用してやってみます。

【準備】
blade上でformを使用するときformヘルパーというものを使うのですが、Laravel5からはモジュールを追加しないとformヘルパーが使えません。Laravel4では特になんの設定もなく使えていたみたいなので、5に移行するときのちょっとしたハマりポイントになっているみたいです。

まずはLaravelインストールフォルダ直下にある composer.php の require に "illuminate/html": "~5.0" を追記します。

    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
        "illuminate/html": "~5.0"
    },

配列形式なのでカンマを忘れずに。次にコマンドプロンプトで composer update をしてモジュールの追加をします。カレントディレクトリはLaravelインストールディレクトリです。

> cd C:\pleiades\workspace\app_laravel
> composer update

モジュールの追加が終わったら config/app.php を編集します。
Laravel 5.1 の場合、

'providers'に

Illuminate\Html\HtmlServiceProvider::class,

'aliases' に

'Form'      => Illuminate\Html\FormFacade::class,
'Html'      => Illuminate\Html\HtmlFacade::class,

を追記します。
Laravel 5.0 の場合は、

'providers'に

'Illuminate\Html\HtmlServiceProvider',

'aliases' に

'Form'      => 'Illuminate\Html\FormFacade',
'Html'      => 'Illuminate\Html\HtmlFacade',

を追記します。
5.1 と 5.0 で微妙に書式が違います。5.1 ではファサードでclassを指定するようになりました。

ちなみに composer update を行う前に config/app.php 編集してしまうとエラーになります。

[Symfony\Component\Debug\Exception\FatalErrorException]
Class 'Illuminate\Html\HtmlServiceProvider' not found

というエラーがでたら config/app.php の 'providers' の記述を削除(コメントアウトでよい)して、composer update をしてください。

大したことまだ書いていないけど、今日はここまでにします。

Laravel 5.1 の Hello World

Laravel 5.1 とタイトルにうたってますが、別にバージョン5.1固有の話題ってわけでもないかも…

前回Laravelのインストールについて記事を書いたので、今回は Hello World です。まあ、前回にも動作確認で簡単な Hello World はやっているんですがね。routes.php

Route::get('aaa', function () {
    return 'Hello!';
});

ってやつですね。URLに aaa と指定すると、function(){} 内に記述した処理が動きます。ここでは 'Hello!' という文字列をレスポンスに渡しているので、ブラウザに Hello! と表示されます。

この例だけ見るとすべてのページの処理と出力をこの routes.php に書いていくのがLaravelのやり方なんかい?と勘違いしてしまいますが、あくまでこういう書き方もできるというだけで、もちろんコントローラーやビューを使用する方法も用意されております。

という訳で、今回はコントローラークラスを作成してHello World をやってみたいと思います。app_laravel/app/Http/Controllers 以下(app_laravelはLaravelのインストールディレクトリなので環境により異なります)に HelloController.php を作成し、以下のように記述します。

<?php namespace App\Http\Controllers;
class HelloController extends Controller
{
    public function index()
    {
        return "hello!!!!";
    }
}

routes.php に、以下を追記します。

Route::get('hello', 'HelloController@index');

これで、URLに hello を指定すると HelloController クラスの index() メソッドを呼ぶという動きになります。ブラウザで

http://localhost/app_laravel/hello

にアクセスすると、画面に hello!!!! と表示されます。

Laravel 5.1 のプロジェクト作成(インストール) その2

Laravelのイベントに参加するために茅場町のCOEDOに来ています。ただいまCOEDOから記事を投稿しております。

今回はhtdocs以外にLaravelをインストールしてみたいと思います。

【下準備】
Composerがインストール済とします。 Composerは下記URLからダウンロードできます。

https://getcomposer.org/download/

【Laravelのプロジェクト作成】
前回と同じですがインストール先はhtdocs以外の任意のフォルダです。
今回はEclipse(Aptana)のプロジェクトにしたいのでワークスペースフォルダ
(ここでは C:\pleiades\workspace)に作成します。

>cd C:\pleiades\workspace
>composer create-project laravel/laravel app_laravel --prefer-dist

インストールできたらバージョンの確認(一応)

>cd app_laravel
>php artisan --version

エイリアスの設定】
ここから前回とちょっと違うところです。htdocs以下ではないので、このままでは当然ブラウザからアクセスできません。なのでApacheの設定ファイルhttpd.confを編集します。ちなみにデフォルト設定でxamppをインストールした場合、C:\xampp\apache\confにあります。
余談ですが、こういう設定ファイルの編集は間違えると環境が壊れてしまうので、編集前のファイルを別名(httpd.conf_bkとかhttpd.conf_20150718とか)でコピーしバックアップしておくことをお勧めします。

Alias /app_laravel/ "C:/pleiades/workspace/app_laravel/public/"
<Directory "C:/pleiades/workspace/app_laravel/public/">
      Options All
      AllowOverride all
      Require all granted
</Directory>

記述する場所は <IfModule alias_module> ~ </IfModule> の間がいいでしょう。
この設定内容では /app_laravel/ にブラウザでアクセスしたら C:/pleiades/workspace/app_laravel/public/ を表示するよ!という意味になります。
設定が終わったらApacheを再起動し、ブラウザで

http://localhost/app_laravel/

にアクセスします。うまくいっていれば画面に Laravel5 と表示されます。

Hello World がうまくいかない?】
前回と同じくapp_laravel/app/Http にある routes.phpテキストエディタで開き、

Route::get('aaa', function () {
return 'Hello!';
});

と記述。ブラウザで以下URLへアクセスします。

http://localhost/app_laravel/aaa

しかし Hello! とは表示されずに404エラーになってしまいます。

.htaccessの編集】

上記問題を解決するためには、.htaccess の 編集を行う必要があります。.htaccess は Laravel インストールフォルダの public フォルダ直下にあるのでテキストエディタで開き、編集します。

 

編集前

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

 

編集後

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteRule ^(.*)/$ /app_laravel/$1 [L,R=301]
 
    RewriteBase /app_laravel

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

RewriteCond %{REQUEST_FILENAME} !-d を削除、
RewriteRule ^(.*)/$ /$1 [L,R=301] を
RewriteRule ^(.*)/$ /app_laravel/$1 [L,R=301] に編集、
RewriteBase /app_laravel を追記しています。

改めてブラウザで

http://localhost/app_laravel/aaa

を表示してみると、無事画面に Hello! と表示されました!

とりあえず、これで完成です。

 【Eclipse(Aptana)のプロジェクト作成】
Eclipse(Aptana)のプロジェクト新規作成をし、プロジェクト名に先ほど作成 した Laravelプロジェクトの名前(今回の例ならば app_laravel)を指定します。すでにフォルダがあるので警告が出ますが、かまわず[完了] ボタンを押せばプロジェクトが作れます。

Laravel 5.1 のプロジェクト作成(インストール)

超久しぶりの投稿です。

PHPフレームワークのLaravelを仕事で使うことになったので、基本的なことをメモしていきたいと思います。

Laravelは日本ではまだマイナーですが、海外では人気No1のPHPフレームワークだそうです。日本では書籍もまだほとんど出ておらず、情報に乏しいのが難点です。最新版のバージョンは5.1ですが、出回っている情報もまだバージョン4までのものが多いみたいです。

さて、とりあえずは開発に必要な環境を用意するところからやってみたいと思います。Window8.1上のxamppに開発環境を作っていきます。

 

【下準備 Composer のインストール】
LaravelではComposerというツールを使ってパッケージ等の管理を行っているようです。なのでまずはComposerをインストールします。下記URLからインストーラーをダウンロードしてインストールしてください。

https://getcomposer.org/download/

 

【Laravelのプロジェクト作成】
まずは、xampp(apache)のhtdocs以下にLaravelプロジェクトを作ってみます。

コマンドプロンプトを開き、カレントディレクトリをhtdocsまで移動する。

>cd C:\xampp\htdocs

②以下コマンドを打ち、Laravelをインストールする。

>composer create-project laravel/laravel app_laravel --prefer-dist

上記コマンドを打つ場合は最新バージョンのLaravelがインストールされる。
バージョンを指定してインストールしたい場合は、以下のようにする(例は4.2の場合)。

>composer create-project "laravel/laravel=~4.2" app_laravel --prefer-dist

③インストールしたLaravelのバージョン確認
インストールしたディレクトリで確認コマンドを打つ。

>cd app_laravel
>php artisan --version

④動作確認
ブラウザでLaravelをインストールしたフォルダの下のpublicを表示する。

http://localhost/app_laravel/public/

Laravel5と画面に表示されればとりあえずOK。

 

【とりあえずのHello World
①app_laravel/app/Http にある routes.phpテキストエディタで開き、以下を記述。

Route::get('aaa', function () {
    return 'Hello!';
});

②ブラウザで確認する。下記URLをブラウザで開いてみる。

http://localhost/app_laravel/public/aaa

画面にHello!と表示されればひとまず成功。

 

しかしURLにpublicとか入ってちょっと気持ち悪いですね。次回はちょっと違ったやり方でプロジェクトを作ってみましょう。

とりあえず今回はここまで!

 

 

 

gmail を使用して CakeEmail でメール送信する

CakeEmailについて調べていて、やっと送信できたのでメモしておきます。

CakePHP のバージョンは 2.5.8.、メール送信に gmail を使用します。

●準備 gmailアカウントの用意
こちらの[アカウントを作成]よりアカウントを作成します。
gmailSMTPを使用してメール送信をするのですが、セキュリティの問題でCakeEmailからのアクセスを拒否してしまうようなので、gamil側の設定を変える必要があります。

安全性の低いアプリがアカウントにアクセスするのを許可する - Google アカウント ヘルプ
の[安全性の低いアプリを許可] というリンクより設定ページへ移動し、安全性の低いアプリのアクセス の「オン」にチェックを入れます。この操作をする際、googleのアカウントにログインしておく必要があります。

 

●email.php の設定
[CakePHP_ROOT]\app\Config にある email.php.default をコピペし、email.php にリネームします。email.php 中の $default を以下のように編集します。

    public $default = array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => 465,
        'username' => 'address@gmail.com',
        'password' => 'password',
        'transport' => 'Smtp',
    );

username と password には使用するgmailアカウントのユーザーとパスワードを記述してください。

 

●コントローラーの記述
コントローラーのアクションメソッド中に以下のように記述します。

$email = new CakeEmail('default');
$massages = $email->
            ->from(array('[from用アドレス]' => '[アドレスの別名]'))
            ->to('[送付先のアドレス]')
            ->subject('[メールのタイトル]')
            ->send(`[メールの本文]`);

以上で、メール送信できます。
CakeEmail を new するときに渡す引数は email.php 中に記述した設定のどれを使うかの指定で、$default を使う場合は 'default' を渡します。email.php 中の設定は任意に名前を付けることができ、例えば $gmail で設定を記述した場合には 'gmail' を渡すことでその設定を使うことができます。

 

はまったところ

解決してしまえばしょうもないことなんですが、CakeEmailでググった時に出てきた情報で、email.php に関する記述部分に

        'username' => 'address@gmail.com', // ユーザ名
        'password' => 'password',                   // パスワード

のようにコメントが入っているのをそのままコピペしてたら動きませんでした。

CakePHP で HelloWorld

CakePHPで動く物を簡単に作ってみます。

XAMMP(Apache)の htdocs 直下に cake1 というディレクトリを作り、そこにCakePHP2.5.8を導入します。以後、この cake1 フォルダのパスを [CakePHP ROOT] と呼ぶことにします。導入の仕方はこちらに書きました。

http://turkey246.hatenablog.com/entry/2015/03/04/123911

とりあえずは画面に HelloWorld と表示するだけをやってみます。

 

●コントローラーの作成

[CakePHP ROOT]\app\Controller に、 HelloWorldController.php というファイルを作成し、以下を記述します。

HelloWorldController.php

<?php
class HelloWorldController extends AppController {
    
    /* コントローラー名 */
    public $name = "HelloWorld";

    /* レイアウトの使用 */
    public $autoLayout = false;
    
    /*
     * デフォルトアクションメソッド
     */
    function index(){
        $msg_str1 = 'Hello World!';
        $msg_str2 = 'CakePHP のサンプル画面です。';
        
        //viewに渡す値をセット
        $this -> set('msg1', $msg_str1);
        $this -> set('msg2', $msg_str2);
    }
}
?>

 クラス名は [コントローラー名]+Controller となり、AppController を継承します。public $autoLayout はレイアウトを使用するかしないかの設定で、レイアウトについてはいずれまたの機会に説明します(たぶんね…)。URLを指定されたとき画面表示に必要な処理を記述するのがアクションメソッドで、メソッド名とURLがひも付いてます。詳しいことは後述します。 $this -> set(文字列, オブジェクト); はビューテンプレートにデータを渡すための処理で、ビューテンプレート側ではset関数第一引数の文字列の頭に $ を付けた変数で、第二引数のオブジェクトを参照することができます。

 

●VIEWテンプレートの作成

[CakePHP ROOT]\app\View の下に HelloWorld というフォルダを作り、その下に index.ctp というファイルを作成し、以下を記述します。

index.ctp

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
    </head>
    <body>
        <p>
            <?php
                echo $msg1;
            ?>
        </p>
        <p>
            <?php
                echo $msg2;
            ?>
        </p>
    </body>
</html>

 

以上を作成後、http://localhost/cake1/HelloWorld にアクセスする(Apacheの起動を忘れずに!)と、画面が表示されます。

アクセスするURLは、[ホストサーバーのルート]/[CakePHP ルートのフォルダ名]/[コントローラー名]/[アクションメソッド名]

になります。

コントローラーとビューテンプレートの関連付けは、以下のような命名規約に従うことで決まります。

・[CakePHP ROOT]\app\View 以下に、コントローラー名と同じ名前のフォルダを作る。
・上記フォルダの中にコントローラー中のアクションメソッドの名前をアンダースコアつながりに直したファイル名(拡張子は.ctp)でテンプレートを作ることにより、アクションメソッドと関連付けられる。

上のサンプルコードの場合、コントローラー中のアクションメソッドが function index() で、関連付くビューテンプレートが index.ctp なわけです。function fooPage() ならば foo_page.ctpになります。

アクセスするURLは先に書いたルールに従うと、アクションメソッド function index() のページにアクセスするためには http://localhost/cake1/HelloWorld/index となるはずですが、最後のindex を省略した状態でアクセスできています。省略した場合、デフォルトで index へ行くという動きをするようになっており、省略せず index を付けた状態でも同じページが表示されます。

ちなみに アクションメソッド function fooPage() のページを表示するためのURLは http://localhost/cake1/HelloWorld/fooPage となります。

CakePHPのMVC構成

更新滞っているので、CakePHPで勉強したことを少しずつメモ代わりに。

 

CakePHPMVCモデルでWebアプリケーションを構築するためのフレームワークで、

M:Model
  ⇒DBのテーブルに対応
V:View
  ⇒ブラウザに表示される画面に対応
C:Contoroller

  ⇒ページごとのロジック処理に対応

となってます(厳密なMVCモデルでの意味ではありません、あくまでCakePHPでの位置付け)。

 

それぞれに対応するファイルは以下となってます。

 

●コントローラー
設置フォルダ:[CakePHP ROOT]\app\Controller
クラス名はコントローラー名(通常はモデル名の複数形)+Controller(キャメル記法)、AppController を継承する。。ファイル名はクラス名と同じ(拡張子phpがつく ○○○Controller.php)。ページのURLと同じ名前のアクションメソッドを記述する(デフォルトで呼ばれるアクションメソッドはindex())。
命名規約にそわないテーブル(モデル)を使用する場合、

public $uses = array('モデル名1','モデル名2','モデル3');

の記述で指定できる(複数テーブルの使用も可能)。

 

●ビューテンプレート
設置フォルダ:[CakePHP ROOT]\app\View\○○○ ←○○○はコントローラー名と合わせたフォルダ名
テンプレートの拡張子は.ctp。ファイル名はコントローラー中のアクションメソッド名をアンダースコア記法にしたもので命名。テンプレート中には基本的にhtmlを記述し、動的に書き出したい部分にphpでの記述を行う。

 

●モデル
設置フォルダ: [CakePHP ROOT]\app\Model
モデル名はテーブル名の単数形をつける。クラス名は単数形・キャメル記法で命名。ファイル名はクラス名と同じにする。
命名規約に沿わないテーブルを使用する場合は、

public $useTable='テーブル名';

を記述する。