这个容器中设置的脊派每个cookie都是一个Phalcon\Http\Cookie类实例,容器的send()方法实际是添加响应头Set-Cookie指令。
在Phalcon中,最终会调用:
Phalcon\Http\Response->sendHeaders()
Phalcon\Http\Response->sendCookies()
这里的Phalcon\Http\Response->sendCookies()内部实际调用Phalcon\Http\Response\Cookies的send()方法。
如下例子:
//在控制器方法中添加如下代码:
$this->cookies->useEncryption(false)
$this->cookies->set("test-cookie","ffffffffffffffff")
$this->cookies->send()
return
//响应头
Connection Keep-Alive
Content-Length 10
Content-Typetext/html
DateMon, 08 Sep 2014 04:20:17 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.2.27 (Unix) PHP/5.5.15
Set-Cookie test-cookie=ffffffffffffffffpath=/httponly test-cookie=ffffffffffffffffpath=/httponly
代码中设置了一个cookie,然后调用容器的send()方法,在客户端查看响应头,发现Set-Cookie指令中test-cookie设置了两次,这个说明Phalcon在响应时也调用了一次send()方法,这个就可以证明Phalcon在响应时调用的sendCookies()方法内部就是调用cookie容器的send()方法。
Phalcon\Http\Response有三个和cookie有关的方法:
Phalcon\Http\Response::getCookies()
Phalcon\Http\Response::setCookies($cookies)
Phalcon\Http\Response::sendCookies()
分别获取和设置Response的Cookies容器(\Phalcon\Http\Response\CookiesInterface 实例喊穗),sendCookies()是调用容器的send()方法发送cookie。
还有一个问题是,如何获取来自请求的cookie?你可以发现,在Phalcon\Http\Request中并不存在类似getCookies()方法,郑野卜难道要使用$_COOKIE全局数组?Phalcon文档对于这个并没有提及。使用如下例子:
//使用的请求头信息
Accept text/html,application/xhtml+xml,application/xmlq=0.9,*/*q=0.8
Accept-Encoding gzip, deflate
Accept-Language zh-cn,zhq=0.8,en-usq=0.5,enq=0.3
Cache-Control max-age=0
Connection keep-alive
Cookie test-cookie=only+for+test+cookie.
Host192.168.1.168
User-Agent Mozilla/5.0 (Windows NT 6.1WOW64rv:32.0) Gecko/20100101 Firefox/32.0
//控制器代码
$this->cookies->set("hello-cookie","hello cccccc kie.")
if($this->cookies->has("test-cookie")){
echo $this->cookies->get("test-cookie")->getValue()
}
print_r($this->cookies)
$this->view->disable()
//输出
only for test cookie.
Phalcon\Http\Response\Cookies Object
(
[_dependencyInjector:protected] =>Phalcon\DI\FactoryDefault Object
[_registered:protected] =>
[_useEncryption:protected] =>
[_cookies:protected] =>Array
(
[hello-cookie] =>Phalcon\Http\Cookie Object
(
[_readed:protected] =>1
[_restored:protected] =>
[_useEncryption:protected] =>
[_dependencyInjector:protected] =>Phalcon\DI\FactoryDefault Object
[_filter:protected] =>
[_name:protected] =>hello-cookie
[_value:protected] =>hello cccccc kie.
[_expire:protected] =>0
[_path:protected] =>/
[_domain:protected] =>
[_secure:protected] =>
[_httpOnly:protected] =>1
)
)
)
请求中发送了cookie(test-cookie=only+for+test+cookie.)
$this->cookies->get("test-cookie")获取到了这个来自请求的cookie,但是从Phalcon\Http\Response\Cookies输出来看,这个cookie并不在它的_cookies数组中,观察到代码中设置了一个叫hello-cookie的cookie,而它在_cookies数组中,所以应该是只有设置了才进入_cookies数组,$this->cookies->get("test-cookie")先判断在不在_cookies数组中,否则再判断是不是来自请求的cookie。
注意,$this->cookies->get("test-cookie")返回的是一个来自请求的Phalcon\Http\Cookie的类实例,所以可以调用相关方法。
Phalcon对管理来自请求的cookie比较隐晦,它只能通过Phalcon\Http\Response\Cookies容器相关方法调用,从名字来看,不应该是它的一部分。
HTTP 请求环境(Request Environment)
每个HTTP请求(通常来源于浏览器)会包含请求的附加信息,比如头部数据,文件,变量等。一个基于Web的应用需要解析这些信息以提供正确的响应返回到请求者。Phalcon\Http\Request封装了这些请求的信息,允许你以一个面向对象的方式访问它。
<?php
// Getting a request instance
$request = new \Phalcon\Http\Request()
// Check whether the request was made with method POST
if ($request->isPost() == true) {
// Check whether the request was made with Ajax
if ($request->isAjax() == true) {
echo "Request was made using POST and AJAX"
}
}
获取值(Getting Values)
PHP更加请求的类型自动地填充$_GET和$_POST超全局数组。这些数组保存了来自提交表单的值或者通过URL传递的参数值。在这些数组中的变量没有被清理兵器包含非法字符,甚至是可能导致SQL注入或跨站脚本(XSS)攻击的恶意代码。
Phalcon\Http\Request allows you to access the values stored in the $_REQUEST, $_GET and $_POST arrays and sanitize or filter them with the ‘filter’ service, (by default Phalcon\Filter). The following examples offer the same behavior:
Phalcon\Http\Request允许你访问这些存储在$_REQUEST, $_GET 和 $_POST数组中的值并且通过使用'filter'服务清理或过滤它们,(默认是Phalcon\Filter)。
以下例子提供了相同的行为:
<?php
// Manually applying the filter
$filter = new Phalcon\Filter()
$email = $filter->sanitize($_POST["user_email"], "email")
// Manually applying the filter to the value
$filter = new Phalcon\Filter()
$email = $filter->sanitize($request->getPost("user_email"), "email")
// Automatically applying the filter
$email = $request->getPost("user_email", "email")
// Setting a default value if the param is null
$email = $request->getPost("user_email", "email", "some@example.com")
// Setting a default value if the param is null without filtering
$email = $request->getPost("user_email", null, "some@example.com")
(这写个用法基本要牢记了,要么直接使用filter清理,要么间接使用)
控制器中访问请求(Accessing the Request from Controllers)
最通用的方法请求环境的地方是在控制器的动作中。为了从访问控制器访问Phalcon\Http\Request对象你将需要使用$this->request控制器的公共属性:(注意,DI资源通过魔术方法映射到公共属性,并非真的是它的公共属性)
<?php
use Phalcon\Mvc\Controller
class PostsController extends Controller {
public function indexAction() {
}
public function saveAction() {
// Check if request has made with POST
if ($this->request->isPost() == true) {
// Access POST data
$customerName = $this->request->getPost("name")
$customerBorn = $this->request->getPost("born")
}
}
}
文件上传(Uploading Files)
另一个常见的任务是文件上传。
Phalcon\Http\Request提供了一个面向对象的方法去完成这个任务:
<?php
use Phalcon\Mvc\Controller
class PostsController extends Controller {
public function uploadAction() {
// Check if the user has uploaded files
if ($this->request->hasFiles() == true) {
// Print the real file names and sizes
foreach ($this->request->getUploadedFiles() as $file) {
//Print file details
echo $file->getName(), " ", $file->getSize(), "\n"
//Move the file into the application
$file->moveTo('files/' . $file->getName())
}
}
}
}
通过Phalcon\Http\Request::getUploadedFiles()返回的每个对象是一个Phalcon\Http\Request\File类的实例。
使用$_FILES超全局数组提供类似行为。Phalcon\Http\Request\File仅封装了请求的跟每个上传文件相关的信息。
使用头信息(Working with Headers)
跟上面提到的一样,请求头包含了允许我们去发送合适的响应到用户的有用的信息。以下例子展示这些信息的用法:
<?php
// get the Http-X-Requested-With header
$requestedWith = $response->getHeader("HTTP_X_REQUESTED_WITH")
if ($requestedWith == "XMLHttpRequest") {
echo "The request was made with Ajax"
}
// Same as above
if ($request->isAjax()) {
echo "The request was made with Ajax"
}
// Check the request layer
if ($request->isSecureRequest() == true) {
echo "The request was made using a secure layer"
}
// Get the servers's ip address. ie. 192.168.0.100
$ipAddress = $request->getServerAddress()
// Get the client's ip address ie. 201.245.53.51
$ipAddress = $request->getClientAddress()
// Get the User Agent (HTTP_USER_AGENT)
$userAgent = $request->getUserAgent()
// Get the best acceptable content by the browser. ie text/xml
$contentType = $request->getAcceptableContent()
// Get the best charset accepted by the browser. ie. utf-8
$charset = $request->getBestCharset()
// Get the best language accepted configured in the browser. ie. en-us
$language = $request->getBestLanguage()
Phalcon是一个使用c扩展写的PHP框架, 使用c扩展意味着在运行速度上枝贺要优于直接使用php写的框架
因为 Phalcon 是用 c扩展 写的, 所以并不像其他的PHP框架, 比如 laravel , 从git上clone到本地就可以直接运行。而是先要安装phalcon的扩展。
在Mac下安装非常方便, 直接使用homebrew就可以安装了
这里我使用了 php7 , 在 php7 性能较5.x有成倍的提升之后, 使用 php7 再合适不过.
如果你没有安装 php7 , 你也可以使用更低的版本
按照下面的命令显示, 就说明已经安装好 phalcon 了
虽说有了州备扩展, 我们还是需要一些php的文件才能真正运行 Phalcon
这里我推荐大家安装 Phalcon Tools
可以使用 composer 在全局下安装(我已猛迹派经在全局环境下安装好composer了)
显示如下内容, 安装成功, 并且可以看到他可以使用的命令
使用Phalcon Tools, 新建一个Phalcon项目就非常简单了
生成的目录如下:
在浏览器中键入 localhost:8008 就可以看到欢迎页面了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)