分类归档:服务器端

Symfony2 学习笔记之插件格式

一个bundle类似于其它框架中的插件,但是比插件表现更好。它跟其它框架最主要的不同是在Symfony2中所有东西都是bundle,包括核心框架功能和你写的所有应用程序代码。Symfony2中,bundle可是一等公民。这给了你使用其它第三方开发的内容包或者分发你自己的bundle更多灵活性。你可以方便的选择哪些内容可以应用到你的程序中那些不用,来根据你的想法优化它们。

一个bundle就是一个目录,它具有很好的结构性,它能存放从类到controller和web资源等任何东西。

一个bundle仅仅是一个结构化的文件目录集合,它实现一个单一的内容。
你可以创建一个BlogBundle,一个ForumBundle或者一个实现用户管理的bundle(好像已经有很多此类开源的bundle了)。每个bundle目录包含跟实现内容有关的所有东西,包括PHP文件,模板,样式表,javascript文件,测试内容以及其它任何相关的东西。要实现的内容的各方面都保存在一个bundle中。

一个应用程序是由在AppKernel类中registerBundles()方法里定义的所有bundle组成。

// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
    );

    if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
read more

Symfony2 学习笔记之内部构件

Symfony2内部是怎样工作的以及我们如何来扩展它呢?
从外部整体上看,symfony2代码是由许多独立的层构成,每一层都是建立在前一层基础之上。其中,自动加载时不受框架直接管理的,它完全是在UniversalClassLoader类和src/autoload.php文件的帮助下独立完成的。

HttpFoundation 组件
最深层次的是HttpFoundation组件,它提供了处理HTTP所需的主要对象。是一个对一些PHP函数和变量的面向对象抽象。
包括:
Request 类,抽象了PHP中主要的全局变量$_GET,$_POST,$_COOKIE,$_FILES 和 $_SERVER。
Response类,抽象类一些PHP函数比如header(), setcookie()和echo();
Session 类和SessionStorageInterface接口则是抽象了Session管理Session_*()函数。

HttpKernel 组件:
read more

Symfony2学习笔记之数据库操作

数据库和Doctrine
让我们来面对这个对于任何应用程序来说最为普遍最具挑战性的任务,从数据库中读取和持久化数据信息。幸运的是,Symfony和Doctrine进行了集成,Doctrine类库全部目标就是给你一个强大的工具,让你的工作更加容易。

Doctrine是完全解耦与Symfony的,所以并不一定要使用它。

一个简单例子:一个产品,我们首先来配置数据库,创建一个Product对象,持久化它到数据库并把它读回来。

首先我们需要创建一个bundle:

$php app/console generate:bundle --namespace=Acme/StoreBundle

配置数据库
在开始之前,首先需要配置数据库连接信息。根据惯例,这些信息通常会配置在app/config/parameters.ini 文件中。

;app/config/parameters.ini
[parameters]
    database_driver   = pdo_mysql
    database_host     = localhost
    database_name     = test_project
    database_user     = root
    database_password = password

将配置信息定义到parameters.ini文件中也是一个常用的做法。定义在该文件中的配置信息将会被主配置文件在安装Doctrine时引用。

doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%

通过把数据库信息分离到一个特定的文件中,你可以很容易的为每个服务器保存不同的版本。现在Doctrine知道你的数据库配置了,你可以用它来创建一个数据库了。

$php app/console doctrine:database:create

创建一个实体类:
假设你创建一个应用程序,其中有些产品需要展示。即时不考虑Doctrine或者数据库,你也应该知道你需要一个Product对象来表现这些产品。在你的AcmeStoreBundle的Entity目录下创建一个类。

// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;

class Product
{
    protected $name;

    protected $price;

    protected $description;
}

这样的类经常被称为“Entity”,意味着一个基础类保存数据。它们简单来满足你应用程序的业务需要。不过现在它还不能被保存到数据库中,因为现在它只不过还是个简单的PHP类。一旦你学习了Doctrine背后的概念,你可以让Doctrine来为你创建实体类。

$php app/console doctrine:generate:entity --entity="AcmeStoreBundle:Product" --fields="name:string(255)
read more

Symfony2 学习笔记之模板使用

我们知道,controller负责处理每一个进入Symfony2应用程序的请求。实际上,controller把大部分的繁重工作都委托给了其它地方,以使代码能够被测试和重用。当一个controller需要生成HTML,CSS或者其他内容时,它把这些工作给了一个模板化引擎。

模板:
一个模板仅仅是一个文本文件,它能生成任意的文本格式(HTML,XML,CSV,LaTex…)。最著名的模板类型就是PHP模板了,可以被PHP解析的文本文件,它混合了文本和PHP代码。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Symfony!</title>
</head>
<body>
<h1><?php echo $page_title ?></h1>

<ul id=”navigation”>
<?php foreach ($navigation read more

Symfony2 学习笔记之控制器

一个controller是你创建的一个PHP函数,它接收HTTP请求(request)并创建和返回一个HTTP回复(Response)。回复对象(Response)可以是一个HTML页面,一个XML文档,一个序列化的JSON数组,一个图片,一个重定向,一个404错误或者任何你想要的内容。controller中可以包含任何渲染你页面内容的所需要的逻辑。

下面是一个controller最简单的例子,仅仅打印一个Hello world!

use Symfony\Component\HttpFoundation\Response;

read more

Symfony2 学习笔记之系统路由

漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/intro-to-symfony 来替代。

拥有灵活性更为重要,如果你要改变一个页面的URL,比如从/blog 到 /new 怎么办?
有多少链接需要你找出来并更新呢? 如果你使用Symfony的router,这种改变将变得很简单。

Symfony2 router让你定义更具创造力的URL,你可以map你的应用程序的不同区域。
创建复杂的路由并map到controllers并可以在模板和controllers内部生成URLs
从bundles(或者其他任何地方)加载路由资源
调试你的路由

路由活动
一个路径是一个从URL 模式到一个controller的绑定。
比如假设你想匹配任何像 read more

Symfony2 学习笔记之服务容器

现在的PHP应用程序都是面向对象开发,所以主要是由对象构成。有的对象可以方便的分发邮件信息而有的可能帮你把信息写入到数据库中。在你的应用程序中,你可能创建一个对象用于管理你的产品库存,或者另外一个对象处理来自第三方API的数据。重要的是现在应用程序要做的这些事情都是被组织到许许多多的对象中来处理它的每一项任务的。

我们将套路一下Symfony2中一个特殊的PHP对象,它帮助我们实例化,组织和获取你应用程序汇总的许多对象。这个对象叫做服务容器,它可以帮助你使用标准统一的方式来创建你程序中的对象。它能简化你的繁杂的初始对象工作,并且拥有超快的执行速度,强调该框架提高了可重用性和降低了代码耦合。
read more

Spring MVC 框架搭建及详解

现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理。

一、Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0)

1. jar包引入

Spring 2.5.6:spring.jar、spring-webmvc.jar、commons-logging.jar、cglib-nodep-2.1_3.jar

Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.GA.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.4.jar、相应数据库的驱动jar包

2. web.xml配置(部分)



spring
	org.springframework.web.servlet.DispatcherServlet
	
	1



	spring
	*.do




org.springframework.web.context.ContextLoaderListener

  



	contextConfigLocation
	classpath:config/applicationContext.xml

3. spring-servlet.xml配置

spring-servlet这个名字是因为上面web.xml中标签配的值为spring(spring),再加上“-servlet”后缀而形成的spring-servlet.xml文件名,如果改为springMVC,对应的文件名则为springMVC-servlet.xml。

read more

Zend Framework 2在Nginx服务器下无法路径重写的解决办法

Here is a very simple Nginx configuration which I use:

server {
listen *:80;
server_name DOMAIN;

# Character Set
charset utf-8;

# Logs
access_log /vhosts/DOMAIN/logs/access_log main;
error_log /vhosts/DOMAIN/logs/error_log;

# Directory Indexes
index index.php;

# Document Root
root /vhosts/DOMAIN/public;

# Location
location / {
  try_files $uri $uri/ /index.php;
}

# Error Pages
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

# PHP-FPM Support
location ~ \.php$ {
fastcgi_pass unix:/usr/local/etc/php-fpm/DOMAIN.sock;
include fastcgi.conf;
}

# Block access to .htaccess
location ~ \.htaccess {
deny all;
}
}

read more

PHP中this,self,parent的区别

{一}PHP中this,self,parent的区别之一this篇

面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能。利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的。

PHP5经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性。这里我主要谈的是this,self,parent 三个关键字之间的区别。从字面上来理解,分别是指这、自己、父亲。先初步解释一下,this是指向当前对象的指针(可以看成C里面的指针),self是指向当前类的指针,parent是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达。关于指针的概念,大家可以去参考百科。

下面我们就根据实际的例子结合来讲讲。

<?php
classname //建立了一个名为name的类
 {
 private$name; //定义属性,私有
//定义构造函数,用于初始化赋值
 function __construct( $name )
 {
 $this->name =$name; //这里已经使用了this指针语句①
 }
//析构函数
 function __destruct(){}
//打印用户名成员函数
 function printname()
 {
 print( $this->name); //再次使用了this指针语句②,也可以使用echo输出
 }
 }
 $obj1 = new name("PBPHome"); //实例化对象 语句③
//执行打印
 $obj1->printname(); //输出:PBPHome
 echo"<br>"; //输出:回车
//第二次实例化对象
 $obj2 = new name( "PHP" );
//执行打印
 $obj2->printname(); //输出:PHP
 ?>

说明:上面的类分别在 语句①和语句②使用了this指针,那么当时this是指向谁呢?其实this是在实例化的时候来确定指向谁,比如第一次实例化对象的时候(语句③),那么当时this就是指向$obj1对象,那么执行语句②的打印时就把print( $this-><name ) 变成了 print($obj1t->name ),那么当然就输出了”PBPHome”。第二个实例的时候,print($this->name )变成了print( $obj2->name),于是就输出了”PHP”。所以说,this就是指向当前对象实例的指针,不指向任何其他对象或类。

{二}。PHP中this,self,parent的区别之二self篇

此篇我们就self的用法进行讲解

首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。假如我们使用类里面静态(一般用关键字static)的成员,我们也必须使用self来调用。还要注意使用self来调用静态变量必须使用:: (域运算符号),见实例。

<?php

classcounter //定义一个counter的类
 {
 //定义属性,包括一个静态变量$firstCount,并赋初值0
read more