phalcon あれこれ phalcon
phalcon めも
Phalcon の DI は 生成されたり Singleton になったり
その説明の前に一旦 Phalcon の DI の特性について書いておきます.
Phalcon の DI は shared にしてるかどうかで返ってくるインスタンスが新規か使い回しか変わります.
つまり
$di->get( hoge ) としてる場合は 毎回異なるインスタンスが返ってきて,
$di->getShared( hoge ) とすると毎回同じインスタンスが返ってきます. ($di->set() 時に shared としてるかどうかにもよるけど)
そのインスタンスが生成されたか既存のインスタンスを返しているかどうかについては
$di->getShared() を呼び出した直後に $di->wasFreshInstance() を呼び出すことでわかります.
・Singleton
Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。 ロケールやLook&Feelなど、絶対にアプリケーション全体で統一しなければならない仕組みの実装に使用される。
・phalcon ログ出力方法
$logger = new ¥Phalcon¥Logger¥Adapter¥File( D:¥xampp¥phalcon-devtools-master¥log¥p.log );
$logger->log( zzzzzz1 );
$logger = new ¥Phalcon¥Logger¥Adapter¥File( D:¥xampp¥phalcon-devtools-master¥log¥p.log );
$logger->log( [ . __FILE__ . ][ . __LINE__ . ] );
・use で以下を指定すると Logger::ERRORなどつかえる
use Phalcon¥Logger;
use Phalcon¥Logger¥Adapter¥File as FileAdapter;
$logger = new ¥Phalcon¥Logger¥Adapter¥File( ¥log¥p.log );
$logger->log( zzz1 Logger::ERROR);
$logger->log( zzz2 Logger::DEBUG);
$logger->log( zzz3 Logger::INFO);
$logger->log( zzz4 Logger::NOTICE);
$logger->log( zzz5 Logger::ALERT);
$logger->log( zzz6 Logger::CRITICAL);
// These are the different log levels available:
$logger->critical( This is a critical message );
$logger->emergency( This is an emergency message );
$logger->debug( This is a debug message );
$logger->error( This is an error message );
$logger->info( This is an info message );
$logger->notice( This is a notice message );
$logger->warning( This is a warning message );
$logger->alert( This is an alert message );
// You can also use the log() method with a Logger constant:
$logger->log( This is another error message Logger::ERROR);
// If no constant is given DEBUG is assumed.
$logger->log( This is a message );
The log generated is below:
・controller内でview指定
// D:¥xampp¥htdocs¥tutorial¥app¥views¥signup¥index.phtml
$this->view->setMainView( signup/index.phtml ); // viewを指定する。これがないと ¥views¥index.phtml が存在するとこれを呼ぶ(¥views¥signup¥index.phtmlではなく)
・mysql
database作成
create database test_db
use test_db
mysql -u root -p test_db
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT
`name` varchar(70) NOT NULL
`email` varchar(70) NOT NULL
PRIMARY KEY (`id`)
);
validate コントローラーでやるんだね いや modelだわ
d:¥xampp¥htdocs¥invo¥app¥models¥users.php
https://docs.phalconphp.com/ja/latest/reference/tutorial-invo-2.html
viewで以下(tag)を指定すると
<?php echo $this->tag->form( signup/register ); ?>
htmlでは以下となる
<form action= /tutorial/signup/register method= post >
エラーメッセージなどをビューで表示する際には Phalcon では flash を使うときがある
今日は、Phalconのフラッシュメッセージについて調べてみます。
フラッシュメッセージは、単にユーザに情報を表示するアクションの状態をユーザに通知するために使用されます。メッセージのこれらの種類は、このコンポーネントを使用して生成することができます
Dispatcher
アプリケーションがこの動きをどのように実現しているか見ていきましょう。
最初に知るべきは、Dispatcher コンポーネントです。
これは、 Routing コンポーネントによって発見されたルートの情報を受け取ります。
次に、適切なコントローラーを読み込んで、対応するアクションのメソッドを実行します。
通常、フレームワークはディスパッチャを自動的に作成します。
今回は、要求されたアクションを実行する前に、認証を行い、ユーザーがアクセスできるか否かチェックする必要があります。
これを実現するため、ブートストラップの中に関数を用意して、ディスパッチャを置き換えています:
フレーワークの多くのコンポーネントはイベントを発火するので、
内部の処理の流れを変更することができます。DIコンポーネントが接着剤として機能し、
EventsManager がコンポーネントが生み出すイベントをインターセプトし、イベントをリスナーに通知します。
アクセス制御リスト (ACL)
PHPフレームワークのPhalconで、RedirectとForwardの違い
--------------------------------------------------
// 内部的な処理で、コントローラーだけがフォワードされる。URLは変わらない。
$this->dispatcher->forward(array( controller => news action => index ));
// HTTPリダイレクトが行われて、URLも変わる
$this->response->redirect( news/index );
--------------------------------------------------
画面のパラを受ける
$year = $this->dispatcher->getParam ( year );
$postTitle = $this->dispatcher->getParam ( postTitle );
だったり
$email = $this->request->getPost( email );
$password = $this->request->getPost( password );
dispatch はこうやってつかわれたりもする
public function showAction($year $postTitle)
{
$this->flash->error( You don t have permission to access this area );
// 別のアクションへ転送する
$this->dispatcher->forward(array(
controller => users
action => signin
));
}
コントローラの初期化
何らかのアクションがコントローラ上で実行される前に、Phalcon¥Mvc¥Viewコンポーネントは、最初に実行されるinitialize()メソッドを提供しています。__construct “メソッドの使用は推奨されません。
<?php
class PostsController extends ¥Phalcon¥Mvc¥Controller
{
public $settings;
public function initialize()
{
$this->settings = array(
mySetting => value
);
}
public function saveAction()
{
if ($this->settings[ mySetting ] == value ) {
//...
}
}
}
・サービスの注入
<?php
$di = new Phalcon¥DI();
$di->set( storage function() {
return new Storage( /some/directory );
} true);
それから、下記のようにいくつかの方法でそのサービスにアクセスすることができます。
ソースを表示印刷?
<?php
class FilesController extends ¥Phalcon¥Mvc¥Controller
{
public function saveAction()
{
//Injecting the service by just accessing the property with the same name
$this->storage->save( /some/file );
//Accessing the service from the DI
$this->di->get( storage )->save( /some/file );
//Another way to access the service using the magic getter
$this->di->getStorage()->save( /some/file );
//Another way to access the service using the magic getter
$this->getDi()->getStorage()->save( /some/file );
//Using the array-syntax
$this->di[ storage ]->save( /some/file );eproduct->create();
カラムをスキップする