Page, Resouces, and View
• Page Resource CRUD View set
Resource
Page
URI
class Page_User_Index extends App_Page Uniform Interfac
Link
{
public function onInit(){ DB, XML, Local/Remote
Create
... Read
$resource->read($params)->set(); Update
} Delete
public function onOutput(){
$this->display();
} View
<html>
<body>{$user}</body>
</html>
Active Link Click
Page Class
class Help extends App_Page
• onClick< > onInit()
{
public function onClickUp(){
$this->_order = 'DESC';
}
template
public function onClickHelp($id){
$this->showHelp($id); {a click=”Up”} {/a}
}
{a click=”Help” val=$helpId} {/a}
public function onInit(){ ...
...
}
Redirect Click
• Click
Page B
class Page_Blog_Entry extends
App_Page
{
public function onClickUp($user){
$this->_order = 'DESC';
}
Page A
$options['click'] = 'up';
$options['val'] = $user;
self::redirect('blog/entry', $options);
{a} tag
• <a>
• click
{a click=print} {/a}
• val
{a href="/" val=$values} {/a}
Page - Cache
Page Cache
• Init Cache
• Page Cache
Page - Init Cache
• init set
• View
class Page_Today_Index extends App_Page
{
public function onInit() {
....
$resource->set(‘news’);
...
$resource->set(‘weather’);
}
}
$options = ('type'=>'init', 'life' => 600);
BEAR_Main::run('Page_Today_Index', $options);
Page - Page Cache
• HTTP
class Page_Today_Index extends App_Page
{
public function onInit() {
....
$resource->set(‘news’);
...
$resource->set(‘weather’);
}
}
$options = ('type'=>'page', 'life' => 600);
BEAR_Main::run('Page_Today_Index', $options);
Resource
Resource in REST(1)
http://www.excite.co.jp/weather/japan/area/?prid=4400&arid=4410
http://yohei-y.blogspot.com/2005/04/rest-3.html
Resource in REST(2)
• Uniform Interface
GET( PUT( POST ), DELETE
•
BEAR Resource
BEAR
BEAR Resource
“user/profile/?user_id=10”
“post/number.xml”
• URI
“http://example.com/rss.xml”
• CRUD Interface create read update delete
• Link user blog
Resource Request
Resource CRUD
Resource Request in REST
• HTTP POST/GET/PUT/DELETE
Resource
POST
REST Client
GET
PUT
DELETE
HTTP/1.1 200 OK
GET /user?id=10 HTTP/1.0 Date: Wed, 04 Feb 2009 09:56:24 GMT
Server: Apache/2.2.0 (Unix)
Content-Type: text/html
...
Resource Request in BEAR
• BEAR HTTP
• HTTP
Page Resource Resource Object
Resource
POSTCreate class User_Blog extends
Page { onCreate
GETRead
class User_Index extends App_Page onRead
public function onRead($values)
PUTUpdate SQL
{ Delete { onUpdate
DELETE CREATE
public function onInit(){ ... onDelete
SELECT
... return $row;
UPDATE
$resource->read($params)->set(); }
DELETE
} }
Ro
public function onOutput(){
-Code
$this->display();
-Header
}
-Body
Ro
Resource Object
• Ro
Resource
Create
Page Read class User_Blog extends App_Ro
Update {
class Page_User_Index extends App_Page Delete public function onRead($values)
{ {
public function onInit(){ ...
... return $row;
$resource->read($params)->set(); }
} Ro }
return $array;
public function onOutput(){ -Code or
$this->display(); -Header return $Ro;
} -Body
Ro
• HTTP
• code, header, body
• CRUD
•
Ro - Property
• Code (200 OK, 400 Bad Req, 500 Err)
• Header
• Body
• Link URI
Resource Code
Resource Code
• HTTP
Resource
Page class User_Blog extends
{
class User_Index extends App_Page public function onRead($values)
{ { 500 Error
public function onInit(){ ...
... return $row;
$resource->read($params)->set(); } DB
400 Bad Request
} }
200 OK
public function onOutput(){
$this->display();
URI
}
Ro - CRUD Interface
BEAR HTTP SQL
• onCreate($values) create POST CREATE
• onRead($values) read GET SELECT
• onUpdate($values) update PUT UPDATE
• onDelete($values) delete DELETE DELETE
AOP
Resource - AOP
• Ro (AOP)
• phpdoc
Before Advice
Reource
class Entry extends App_Ro
{
/**
* read
*
* @return array
Around Advice
*
* @aspect before Auth
* @aspect around Timer
*/ onRead
public function onRead($values)
{
Advice Type
•
•
Before Advice After Advice Around Advice
onRead
onRead
onRead
Return Advice
onRead
Annotation
required
Resource - Annotation
• @required
• 400(Bad Request)
Reource
class App_Ro_User extends App_Ro
{
/**
* create
*
* @return array
*
* @required name
* @required age
*/
public function onCreate($values)
{
Resource link
onlink
Ro - onLink
• onLink
Blog Reource
User Reource class App_Ro_ User_Blog extends App_Ro
{
class App_Ro_User extends App_Ro public function onRead($values)
{ {
public function onRead($values) $blogId = $values[‘id’];
{ ...
... }
return $row; }
}
public function onLink($values)
{
$links = array(
‘blog’=>”usr/blog/?id={$values[‘blog_id’]}”);
return $links;
}
}
Resource Link
•
class Page_User_Blog_Latest_Comment extends App_Page
{
public function onInit(){ Fluent Interface
...
$resource->read($params)->link(‘blog’)->link(‘latest_entry’)->link(‘comment’)->set();
}
...link(‘comment’)->set()->p();
onPull()
• onPull
class App_Ro_User_Blog extends App_Ro
{
class App_Ro_User_Blog_Entry_Latest extends App_Ro /**
{ *
* @required user_id
*/
/** public function onRead($values){}
*
* @required blog_id
*/
public function onRead($values){}
public function onPull($values)
{
// ask, map
$pull = self::pullLink('user/blog');
$values['blog_id'] = $pull['id'];
return $values
}
}
Static Resource
Static Resource
• URI
•
CSV, XML, Yaml
•
Resource Server
•
• BEAR
Resource URI
• URI
• URI = Uniform Resource Indentifier ( )
Local Class Resource
“blog/entry”
class User_Blog extends App_Ro
{
Page
class User_Index extends App_Page Remote Class Resource (HTTP)
{ “http://example.com/blog/entry”
Create
public function onInit(){
Read Remote Class Resource (Socket)
...
Update “socket://example.com/blog/entry”
$resource->read($params)->set();
Delete
}
public function onOutput(){ Local File Resource
$this->display(); “blog/entry.xml”
} Remote File Resource
“http://blog/entry.xml”
DI -
class App_Foo extends BEAR_Base
{
public function __construct(array $config) 1.
{
parent::__construct($config);
}
public function onInject() 2.
{
$this->_bar = BEAR::dependency('App_Bar');
}
public function getBar(){ 3.
return $this->_bar->get();
}
}
__construct() onInject()
factory()
DI -
$foo = BEAR::dependency('App_Foo', $config, $options);
echo $foo->getBar();
• new dependency
• array $config1
•
DB
• BEAR_Query SQL
• URI method
dsn
• DB LIMIT
• AOP
BEAR_Query
class App_Ro_User_Entry extends App_Ro
{
public function onInject()
{
parent::onInject();
0=LIMIT 1=DB
$this->_queryConfig['pager'] = 1;
$this->_queryConfig['perPage'] = 5;
$this->_query = BEAR::dependency('BEAR_Query', $this->_queryConfig,
false);
}
public function onCreate($values)
{
$result = $this->_query->insert($values);
}
$values SQL
public function onRead($values)
{ $values
...
return $result = $this->_query->select($sql, $values);
}
DB - Transaction
class App_Ro_User extends App_Ro
{
/**
*
* @aspect around App_Aspect_Transaction
*/
public function onCreate($values)
{
$this->_query->insert($values);
}
onPull
• onPull
class App_Ro_User_Blog extends App_Ro
{
class App_Ro_User_Blog_Entry_Latest extends App_Ro /**
{ *
* @required user_id
*/
/** public function onRead($values){}
*
* @required blog_id
*/
public function onRead($values){}
public function onPull($values)
{
// ask, map
$pull = self::pullLink('user/blog');
$values['blog_id'] = $pull['id'];
return $values
}
}
Error
Panda
Dev Page
•
•
•
•
Dev - Log
Application Log
Smarty Variables
Ajax Log
Registry
$_GLOBALS
Include files
Dev - Code
PEAR / Zend
BEAR Shell
• CLI
• AJAX web shell
•
phpdoc
Security (1)
• XSS
Smaty {$val|escape}
• SQL
Mdb2::quote() Prepared Statement
• CSRF ( )
One Time Token Post Once Exactly
AJAX Cookie Verify
Security (2) - Form
HTML_QuickForm::exportValues()
•
setDefaults() /
setConstants()
public function(array $submit){
• }
...
” ”
Are you sure ?
Maybe
YES NO
0 comments
Post a comment