2012年12月25日火曜日

Rを用いたTwitterテキストマイニング

R Advent Calendar 2012 ついに25日目です。栄えあるクリスマスですが、R Advent Calendar に限ってはこれはトリではなく単なる通過点のはず!さらに、後続に素晴らしい方が控えているのでお手柔らかにお願いします。

とはいえ、、はい。今日はクリスマスです。 光栄です。ということでやってみました。Twitterを用いたRによるクリスマス分析です。

まずはTwitterからテキストを集めます。こちらはpython-twitterを利用してPythonで取得しました。

#!/usr/bin/python
# -*- coding: utf8 -*-

import twitter, urllib2, sys

consumer_key = "**********"
consumer_secret = "**********"
access_token_key = "**********"
access_token_secret = "**********"

api = twitter.Api(consumer_key, consumer_secret, access_token_key, access_token_secret)
query = u'クリスマス'
query = urllib2.quote(query.encode("utf-8"))
results = api.GetSearch(query, page=1, show_user="false", result_type='recent', per_page=100)
for res in results:
    mod = res.text.encode('utf-8')
    print mod


これをcronで回してツイートを 1000件取得しました。ちなみに上記の例はシェルから実行してファイルに書き出しているので、そのまま、ファイルに書き出したい場合は変更してください。上記のコードはSearchAPIを利用していますが、身のまわりのクリスマス実態を把握する場合はタイムライン等から引っ張るとおもしろいかも知れません。

次に取得したテキストから不要な文字を抜き取ります。一度このまま行こうかと思いましたが、顔文字だらけになりました。笑

vimを利用して顔文字を消去し(:%s/(.\{-})//g)、適当に以下のコードを実行しました。


#!/bin/bash

sed -ie 's/http:\/\/[^ ]* //g' merge.txt
sed -ie 's/http:\/\/[^ ]*$//' merge.txt
sed -ie 's/([^)]*)//' merge.txt
sed -ie 's/!//g' merge.txt
sed -ie 's/-//g' merge.txt
sed -ie 's/\.//g' merge.txt


この辺りはかなり適当なので、近々しっかりとまとめようかと思ったり。。。クリスマスってことで多めに見てください笑 あっ、ちなみに顔文字だけvimで消去したのもsedで動かずググるのがめんどかっただけなので、ご教授頂ければと思います。

ここからRMeCabを利用してテキストマイニングを行います。取得したファイルをsource.txtとし、カレントディレクトリに保存してあるとします。

まず、重要語を選出します。

data <- RMeCabFreq('source.txt')
head(data)
    Term    Info1 Info2 Freq
1     あ フィラー     *   14
2   あの フィラー     *    1
3   あー フィラー     *    8
4     え フィラー     *   11
5   えー フィラー     *    1
6 えーと フィラー     *    1

dataは単なるリストなので、頻度の高いものだけを選ぶことが出来ます。

> data1 = data[data$Freq > 20,]
> head(data1, n=10)
      Term  Info1                    Info2 Freq
151     う 助動詞                        *   52
153 ござる 助動詞                        *   23
156     た 助動詞                        *  407
157   たい 助動詞                        *   43
159     だ 助動詞                        *  425
162   です 助動詞                        *  152
163   ない 助動詞                        *  142
169   ます 助動詞                        *  172
170     や 助動詞                        *   29
178     と   助詞                 並立助詞   44


助詞を眺めても仕方がないので名詞・動詞に限定します。

data2 = data[data$Freq > 40 & (data$Info1 == "動詞" | data$Info1 == "名詞"),]

とりあえず出力

data2[order(data2$Freq),]
           Term Info1    Info2 Freq
710        いる  動詞   非自立   41
717        くる  動詞   非自立   41
747           #  名詞 サ変接続   45
302        いる  動詞     自立   46
3340         笑  名詞 固有名詞   49
3554         日  名詞     接尾   51
3806         の  名詞   非自立   62
381        なる  動詞     自立   64
3484       さん  名詞     接尾   66
3816         ん  名詞   非自立   74
2292         ー  名詞     一般  104
2961       今日  名詞 副詞可能  108
934  プレゼント  名詞 サ変接続  111
837           _  名詞 サ変接続  117
725        てる  動詞   非自立  126
3052         RT  名詞 固有名詞  146
802           :  名詞 サ変接続  182
352        する  動詞     自立  214
821           @  名詞 サ変接続  307
1993 クリスマス  名詞     一般  785


少しはマシになってきました!

N-gram解析を行ってみます。
RMeCabパッケージではNgram関数を呼び出すことで簡単にNgram解析が可能です。
bi-gramで頻度が10を越えるものの取得は下記のように行います。

data1 <- data-blogger-escaped-data1="" data-blogger-escaped-ngram="" data-blogger-escaped-req="" data-blogger-escaped-source.txt="" data-blogger-escaped-type="1)">10,]
以下の結果は氷山の一角です。

4024               [リア-充]   21 
4616               [値段-女]    6
4875             [商品-ブス]    6
5091             [安め-商品]    6
6602             [関係-ない]    6
ちなみにこの抽出に悪意はありません。 共起語を抽出するとこんな感じです。

data <- collocate("source.txt", node = "クリスマス", span = 3) 
data[order(data$Total),]
略 
1159                    過ごす      1    11   12    25
1188                    食べる      2     4    6    25
269                         あ      5     1    6    26
1124                      言う      2     2    4    26
512                         へ      8     0    8    27
763                         何      1     8    9    27
495                       ので      3     8   11    28
666                     バイト      0     5    5    28
750                       今年     10     1   11    28
992                       来る      0     4    4    28
1085                    終わる      0    10   10    28
553                       やる      0     6    6    29
1142                      買う      1     5    6    29
1228                        ~      7     6   13    29
626                     サンタ      5     0    5    30
926                       思う      1     0    1    30
1224                        w      2     0    2    30
270                       ああ      3     2    5    31
357                       こと      3     5    8    32
399                       そう      4     0    4    32
538                     みんな     11     1   12    32
569                       れる      1     1    2    32
616                     ケーキ      2    14   16    33
725                         一      2     6    8    33
248                          ♪      9     6   15    36
1077                        笑     16     3   19    36
1117                      行く      1     4    5    36
略

1248              [[MORPHEMS]]    662   585 1247  3881
1249                [[TOKENS]]   3140  2355 5495 19313


最後にネットワーク分析行います。メモリが足らなかったので、ツイートの数は500程度に減らしてしまいました。 コードはこんな感じです。頻度は3以上のものに限定しました。

file <- NgramDF("source.txt", type=1, pos="名詞", N=3)
net <- graph.data.frame(file)
plot=(net, vertex.label=V(net)$name)
以上です。


なんとなく幸せそうな感じが伝わりとてもよかったです。笑  今後はこれを発展させ、イベントやブランド・商品に対してどの単語がどれほど影響しているのかなどを測定していきたいと思います。


また、この場を借りて。。。といっても自分のブログですが、今年お世話になった方皆さん、本当にありがとうございました!多くのことを学び、とても幸せでした。 来年も頑張るのでよろしくお願いします。


Happy Christmas!!

2012年12月20日木曜日

ZF2でのログイン後リダイレクト

zfc-userを利用している場合、ログイン後のリダイレクトはとても簡単です。

zfc-userのconfigファイルにある

'login_after_registration' => true,

のコメントアウトをすることで、ログインURLのパラメーターが有効になります。

GETの場合はredirectパラメータを指定します。

以下のような形です。

http://example.com/login?redirect=after/test
このURLからログインを行うとログイン後にhttp://example.com/after/testにリダイレクト出来ます。

2012年12月18日火曜日

リダイレクト

Zend Framework2でのリダイレクト
 
ZF2では404ページの表示方法が、とてもシンプルになったようです。単純に以下のようにするだけです。
 
    $this->getResponse()->setStatusCode(404);
    return;

これまで、Zend Frameworkでは以下のように実装するのが普通でした。
 
 throw new Zend_Controller_Action_Exception('404 Page not found',404);

詳細はこちらです。

2012年10月11日木曜日

Zend Framework 2 でのログイン機能

前回に引き続き、ログイン機能を実装します。

まずはログインフォームを作成します。前回同様に、まずはフォームを作成します。

<?php

//module/Auth/src/Auth/Form/Login.php

namespace Auth\Form;

use Zend\Form\Form;
use Zend\Form\Element;

class LoginForm extends Form
{
    public function __construct()
    { 
        parent::__construct();
        $this->add(array(
            'name' => 'email',
            'attributes' => array(
                'type' => 'text',
            ),
            'options' => array(
                'label' => 'email',
            ),
        ));
        $this->add(array(
            'name' => 'password',
            'attributes' => array(
                'type' => 'password',
            ),
            'options' => array(
                'label' => 'password',
            ),
        ));
        $this->add(array(
            'name' => 'submit',
            'attributes' => array(
                'type' => 'submit',
                'value' => 'login',
            ),
        ));
        $this->add(new Element\Csrf('csrf'));
    }

}

続いてこちらも前回を踏襲し、コントローラーを以下のようにします。

<?php
//module/Auth/src/Auth/Controller/AuthController.php

//追加
use Auth\Form\LoginForm;

    //追加
    public function loginAction()
    { 
        $form = new LoginForm();
        $request = $this->getRequest();

        if($request->isPost()){
            $user = new User();
            $form->setInputFilter($user->getInputFilter());
            $form->setData($request->getPost());

            if($form->isValid()) {
                exit('ログインが試みられました');
            }
        }

        return array('form' => $form);
    }




最後にビューを変更します。



 <?php

$title = 'signup form';
$this->headTitle($title);

$form = $this->form;
echo $this->form()->openTag($form);
echo $this->formRow($form->get('email'));
echo $this->formRow($form->get('password'));
echo $this->formHidden($form->get('csrf'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag($form);
?>

これでログインフォームが出現すると思います。

それではログインフォームを実装しましょう。Zend Framework 2 の認証機能は前作からほぼ変わらず、インターフェイスを継承したアダプタークラスが
実行します。LDAPを用いる場合と同様に、データベースでの認証もAdapterInterfaceを実装したDbTableクラスのAuthenticationメソッドで実行されます。これは認証機能なので、実際にデータベースに接続するにはデータベースと接続するアダプターを利用することになります。

ということで、まずはデータベースと接続するアダプターを取得出来るようにしましょう。コントローラーの中にgetDbAdapterメソッドを実装します。

<?php
 //module/Auth/src/Auth/Controller/AuthController.php

//追加
protected $dbAdapter;

//追加
    public function getDbAdapter()
    {
        if(!$this->dbAdapter){
            $sm = $this->getServiceLocator();
            $this->dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
        }
        return $this->dbAdapter;
    }



このメソッドを用いてデータベースとの接続を行い、認証メソッドを実行します。
以下、利用法です。

<?php
//module/Auth/src/Auth/Controller/AuthController.php

 //追加
use Zend\Authentication\Adapter\DbTable as AuthAdapter;
use Zend\Authentication\AuthenticationService;

//追加
     public function loginAction()
    {
        $form = new LoginForm();
        $request = $this->getRequest();

        if($request->isPost()){
            $user = new User();
            $form->setInputFilter($user->getInputFilter());
            $form->setData($request->getPost());

            if($form->isValid()) {
                $dbAdapter = $this->getDbAdapter();
                $authAdapter = new AuthAdapter($dbAdapter);

                $userData = $form->getData();
                $authAdapter->setTableName('user') //対応するテーブル名                            ->setIdentityColumn('email') //ユニークなカラム名
                           ->setCredentialColumn('password'); //パスワードカラム名
                $authAdapter->setIdentity($userData['email']) //受け取ったデータ
                            ->setCredential($userData['password']);
                $auth = new AuthenticationService(); //必須ではないがAuthenticationServiceを利用
                $result = $auth->authenticate($authAdapter);
                exit(var_dump($result->isValid()));
            }
        }

こんな感じで実装出来ます。

2012年10月9日火曜日

Zend Framework 2 でのユーザー登録機能の実装

前回の投稿に引き続き、今回はユーザー登録機能の実装を行います。前回の投稿で以下のようなフォルダ階層となっていると思います。

 Auth/
|-- Module.php
|-- config
|   `-- module.config.php
|-- src
|   `-- Auth
|       `-- Controller
|           `-- AuthController.php
`-- view
    `-- auth
        `-- auth
            |-- login.phtml
            `-- signup.phtml

ここから登録機能の実装=>ログイン機能の実装という流れで行っていきます。

まずは登録機能です。ここではメールアドレス・パスワードでの登録を行っていきます。

それでは登録フォームの作成です。登録フォームはFormディレクトリを作成し、src/Authフォルダの中に登録フォルダを作成してその中で実装していきます。以下のファイルをFormディレクトリの中にRegisterForm.phpとして保存します。

<?php
//module/Auth/src/Auth/Form/RegisterForm.php

namespace Auth\Form;

use Zend\Form\Form;
use Zend\Form\Element;  //csrf用のタグの出力に利用

class RegisterForm extends Form
{
        public function __construct()
        {
                parent::__construct();
                $this->add(array(
                        'name' => 'email',
                        'attributes' => array(
                                'type' => 'text',
                        ),
                        'options' => array(
                                'label' => 'email',
                        ),
                ));
                $this->add(array(
                        'name' => 'password',
                        'attributes' => array(
                                'type' => 'password',
                        ),
                        'options' => array(
                                'label' => 'password',
                        ),
                ));
                $this->add(array(
                        'name' => 'submit',
                        'attributes' => array(
                                'type' => 'submit',
                                'value' => 'signup'
                        ),
                ));
                $this->add(new Element\Csrf('csrf'));
        }

}

これをコントローラーで呼び出し、ビューに渡します。

まずはコントローラーです。

<?php
//module/Auth/src/Auth/Controller/AuthController.php

namespace Auth\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Auth\Form\RegisterForm;

class AuthController extends AbstractActionController
{

    public function signupAction()
    {
        $form = new RegisterForm();

        return array('form' => $form);
    }

    public function loginAction()
    {

    }
}

次にビューです。

<?php
//module/Auth/view/auth/auth/signup.phtml

$title = 'signup form';
$this->headTitle($title);

$form = $this->form;
echo $this->form()->openTag($form);
echo $this->formRow($form->get('email'));
echo $this->formRow($form->get('password'));
echo $this->formHidden($form->get('csrf'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag($form);
?>

これでdomain.com/signup.phtmlにアクセスすると登録フォームが表示されると思います。これをモデルで受け取り、保存していきます。

まずはコントローラーの処理を加え、リクエストメソッドがポストされている場合にはDBに保存しましょう。

 Zend Framework 2でも、以前のバージョンのように実体を表すクラスとそれをオブジェクト表現するマッパーを組み合わせてモデルを実装することが出来ます。いずれDoctrine等のORMを用いるとして、今回はこれで実装します。

DBですが、今回は簡易に以下のカラムを利用します。DBはこのように作成してください。
  id: mediumint(9) NOT NULL AUTO_INCREMENT
  email: varchar(255) DEFAULT NULL
  password: varchar(20) DEFAULT NULL

コントローラーのsignupアクションを以下のように変更します。

<?php
//module/Auth/src/Auth/Controller/AuthController.php

//メンバ変数を加えます
protected $userTable;

//signupAction, getUserTableメソッドを実装します
    public function signupAction()
    {
        $form = new RegisterForm();
        $request = $this->getRequest();

        if($reqiest->isPost()){
            $user = new User();
            $user->exchangeArray($form->getData());
            $this->getUserTable()->registerUser($user);
        }

        return array('form' => $form);
    }
    private function getUserTable()
    {
        if(!$this->userTable) {
            $sm = $this->getServiceLocator();
            $this->userTable = $sm->get('Auth\Model\UserTable');
        }
        return $this->userTable;
    }


ここで、新しいクラスを2つ利用しています。UserクラスとUserTableクラスです。Userクラスは具体的なデータに対応するクラス、UserTableクラスは実際にDBとオブジェクトをつなぐクラスです。

上記のexhangeArrayメソッドでユーザークラスのメンバ変数に受け取ったデータを格納し、ユーザークラスを引数として、UserTableクラスのregisterUserメソッドでデータをDBに格納します。

それではUserクラスを作成します。以下のコードをUser.phpとしてsrc以下にmodelフォルダを作成して保存してください。

<?php
 // module/Auth/src/Auth/Model/User.php

namespace Auth\Model;

class User implements InputFilterAwareInterface
{
    public $email;
    public $password;

    public function exchangeArray(array $data)
    {
        $this->email = (isset($data['email'])) ? $data['email'] : null;
        $this->password = (isset($data['password'])) ? $data['password'] : null;
    }
}

ここで、exhangeArrayメソッドは配列型のデータを受け取り、メンバ変数に格納しています。
このクラスのインスタンスをUserTableに渡し、UserTableのregisterUserメソッドが実際にDBに保存します。

それではUserTableクラスの作成に移りましょう。ここで、上記のコントローラーではUserTableクラスを$this->getUserTable()として呼び出しています。getUserTableメソッドはサービスマネージャーに登録されたAuth\Model\UserTableというサービスを呼び出しています。

このままだとサービスマネージャーはこのサービスを呼び出せません。Module.phpにサービスあらかじめ登録します。

 <?php
//module/Auth/Module.php

//以下を追加します
use Auth\Model\UserTable;

//以下を追加します
    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Auth\Model\UserTable' => function($serviceManager) {
                    $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter');
                    $table = new UserTable($dbAdapter);
                    return $table;
                }
            )
        );
    }

UserTableクラスを実装します。
<?php
//module/Auth/src/Auth/Model/UserTable.php

namespace Auth\Model;

use Zend\Db\Adapter\Adapter;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\AbstractTableGateway;

class UserTable extends AbstractTableGateway
{
    protected $table = 'user';

    public function __construct(Adapter $adapter)
    {
        $this->adapter = $adapter;

        $this->resultSetPrototype = new ResultSet();
        $this->resultSetPrototype->setArrayObjectPrototype(new User());

        $this->initialize();
    }

    public function registerUser(User $user)
    {
        $data = array(
            'email'     => $user->email,
            'password'  => $user->password,
        );

        $this->insert($data);
    }
}

詳細は割愛しますが、AbstractTableGatewayクラスを継承することでinsertメソッドからDBにデータを挿入できます。

最後にデータベースとの接続情報をファイルに書き込みます。この設定はモジュールディレクトリの外でグローバルに設定します。

configディレクトリ以下のautoloadディレクトリ内にあるglobal.phpファイルを以下のように書き換えます。

//config/autoload/global.php
    'db' => array(
        'driver'            => 'Pdo',
        'dsn'               => 'mysql:dbname=sukina_databasename;host=localhost',
        'driver_options'    => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ),
    ),

また、local.phpファイルも加えます。

<?php

//config/autoload/local.php
return array(
    'db' => array(
        'username' => 'root',
        'password' => 'YesYourMajesty',
    ),
);

これで、一通り作成が完了しますが、この時点ではコントローラー内でのgetDataメソッドの使用方法が正しくありません。終わりにバリデーションを付けて完成させましょう。

コントローラーの修正です。
//module/Auth/src/Auth/Controller/AuthController.php
    public function signupAction()
    {
        $form = new RegisterForm();
        $request = $this->getRequest();

        if($request->isPost()){
            $user = new User();
            $form->setInputFilter($user->getInputFilter());
            $form->setData($request->getPost());

            if($form->isValid()) {
                $user->exchangeArray($form->getData());
                $this->getUserTable()->registerUser($user);
                exit('登録完了!以下の処理保留');
            }
        }

        return array('form' => $form);
    }

実体を表しているモデルのUserクラスのなかにバリデーションルールを書き込みます。

//module/Auth/src/Auth/Model/User.php

//クラスの利用
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;

    //メンバ変数の追加
    private $inputFilter;
    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new \Excepion("Not used");
    }
    public function getInputFilter()
    {
        if(!$this->inputFilter) {
            $inputFilter = new InputFilter();
            $factory = new InputFactory();

            $inputFilter->add($factory->createInput(array(
                'name'      => 'email',
                'required'  => true,
                'filters'   => array(
                    array('name'    => 'StripTags'),
                    array('name'    => 'StringTrim'),
                ),
                'validators'    => array(
                    array(
                        'name'  => 'StringLength',
                        'options'   => array(
                            'encoding'  => 'UTF-8',
                            'min'   => '7',
                            'max'   => '255',
                        ),
                    ),
                ),
            )));

            $inputFilter->add($factory->createInput(array(
                'name'      => 'password',
                'required'  => true,
                'filters'   => array(
                    array('name'    => 'StripTags'),
                    array('name'    => 'StringTrim'),
                ),
                'validators'    => array(
                    array(
                        'name'  => 'StringLength',
                        'options'   => array(
                            'encoding'  => 'UTF-8',
                            'min'   => '6',
                            'max'   => '20',
                        ),
                    ),
                ),
            )));

            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;
    }

これでポストするとDBへの登録が出来ます。パスワードのハッシュ化等は好きなタイミングで行ってください。

Zend Framework 2 でのモジュールの追加

Zend Framework 2 が正式にリリースされましたが、日本語ドキュメントが全くないため、とりあえずモジュールの追加・ルーティング・認証機能(Authentication)の実装までまとめます。

ベースはSkelton Applicationを使用しているので、 https://github.com/zendframework/ZendSkeletonApplication からダウンロードしてください。

まずはモジュールの追加(ここに追加されたモジュール名と一致するモジュールがmoduleディレクトリから読み込みまれます)

<?php
//config/application.config.php
return array(
    'modules' => array(
        'Application',
        'Auth', //モジュール名を追加
    ),
    'module_listener_options' => array(
        'config_glob_paths' => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),
);


moduleディレクトリのなかに先ほど追加したモジュール名のディレクトリを作成し、その中にModule.phpを作成します。
また、モジュールディレクトリの中はModule.phpというファイルを除き、ある程度自由に配置出来ますが、今回は公式ドキュメントと同様に以下のようにディレクトリを配置します。また、この構造はフレームワークによって決められているものではないため、このように配置するための設定も書き込んでいくことになります。

Auth/
|-- Module.php
|-- config <= 設定ファイルのフォルダ
|-- src <= controller, model等を格納するフォルダ
`-- view <= viewファイルを格納するフォルダ


まずは Module.phpです
<?php
//module/Auth/Module.php

namespace Auth; //モジュール名を名前空間とする

class Module
{
        public function getAutoloaderConfig()
        {
                return  array(
                        //srcフォルダ(公式ドキュメントと同様にsrcフォルダ内にモジュール名のフォルダを作成し、その中をオートロードするように設定)
                        'Zend\Loader\StandardAutoloader' => array(
                                'namespaces' => array(
                                        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                                ),
                        ),
                );
        }


        public function getConfig()
        {
                //configファイルの配置
                return include __DIR__ . '/config/module.config.php';
        }
}

Module.phpで設定したconfigファイルに具体的な設定を書き込んでいきます。

<?php
//module/Auth/config/module.config.php
return array(
    //Controllerを利用可能にする
    'controllers' => array(
        'invokables' => array(
            'Auth\Controller\Auth' => 'Auth\Controller\AuthController'
        ),
    ),
    //viewフォルダを登録する
    'view_manager' => array(
        'template_path_stack' => array(
            'auth' => __DIR__ . '/../view',
        ),
    ),
);

ここまででフレームワークに上述したフォルダ構造を伝えきり、コントローラも1つ利用できるようになったと思います。

ここから、signupとloginページの作成に入ります。

まずはdomain.com/signupとdomain.com/loginというURLでアクセス出来るようルーティングの設定をします。
module.config.phpに追記します。

<?php
//module/Auth/config/module.config.php
return array(
    'controllers' => array(
        'invokables' => array(
            'Auth\Controller\Auth' => 'Auth\Controller\AuthController'
        ),
    ),
    //以下を追記
    'router' => array( 
        'routes' => array(
            'signup' => array( //自由にルーティング名を記述
                'type'  => 'literal', //ルーティングタイプ(完全一致で指定する場合はliteralと記述)
                'options' => array(
                    'route' => '/signup', //一致するURL
                    'defaults' => array(
                        'controller' => 'Auth\Controller\Auth', //Controller名
                        'action'     => 'signup', //アクション名
                    ),
                ),
            ),
            'login' => array( //同様
                'type'  => 'literal',
                'options' => array(
                    'route' => '/login',
                    'defaults' => array(
                        'controller' => 'Auth\Controller\Auth',
                        'action'     => 'login',
                    ),
                ),
            ),
        ),
    ),
    //ここまで
    'view_manager' => array(
        'template_path_stack' => array(
            'auth' => __DIR__ . '/../view',
        ),
    ),
);

この状態でルーティングが機能するため、以下の指定されたコントローラーのメソッド(アクション)が呼び出されます。上記で利用を宣言したコントローラーを作成し、以下のように記述


<?php
//module/Auth/src/Auth/Controller/AuthController.php

namespace Auth\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class AuthController extends AbstractActionController
{

    public function signupAction()
    {

    }

    public function loginAction()
    {

    }
}

メソッドを実装すれば、あとはviewファイルを作成することでとりあえずアクセスできるようになります。

<?php
//module/Auth/view/auth/auth/login.phtml, module/Auth/view/auth/auth/signup.php
ehcho 'hello zf2!';

これでdomain.com/signup, domain.com/loginにアクセスし、ビューファイルの内容を表示できると思います。

続いてログイン機能の実装です。少し長くなったのでページを改めます。