程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Symfoy2 是什麼(轉),symfoy2

Symfoy2 是什麼(轉),symfoy2

編輯:關於PHP編程

Symfoy2 是什麼(轉),symfoy2


本文轉自:http://www.cnblogs.com/Seekr/archive/2012/06/15/2550894.html

Symfoy2 是什麼?

PHP世界裡又一廣受關注的web MVC框架? Fabien Potencier 卻不這麼說!

Fabien Potencier這樣定義Symfoy2 是個什麼東西: 

  首先,Symfony2 是一個獨立,松散的,有組織嚴密的PHP組件集合,它可以為你解決一些web開發中遇到的一般性問題。

  其次,基於這些組件,Symfoy2 也可以作為一個獨立的web框架使用。

那麼Symfony2 是一個MVC框架嗎?

Fabien Potencier 說Symfony2從來沒有把自己定義為一個MVC框架!

那它是什麼? Fabien Potencier 我們從來不關心MVC模式,關心的只有各個關注點的分離(separation of concerns)。

但是Symfony2 還是提供了部分的MVC模式的實現:比如Controller部分,View部分卻沒有Mode部分不過你可以通過和它緊密繼承的ORM(Doctrine2和Propel)實現。

 

從這個角度看Symfony的確也沒有逃出web MVC框架的圈子啊!!!

Fabien Potencier 又說Symfony2從來就沒有想靠這些ORM來使自己成為另一個MVC的追隨者,我們的目標更遠大!

 

告訴你吧, Symfony2 是一個HTTP框架或者說是一個Request/Response 框架。我們緊盯的目標不是MVC模式,而是HTTP協議,我們是更低級的更基礎的框架。

我們為什麼要這麼說呢? 有根據的!

近幾年隨著web的發展,有時候你只需要創建一組REST API,所有的邏輯都放到浏覽器端,服務器端只提供數據就是一種web了。不信你看 backbone.js !

再說了,MVC模式只不過是Web 應用程序的其中一種實現方式罷了。

剝去所有框架模式的皮,你看看那個web程序不是處理一個接收到的Request然後返回一個Response啊?

我們Symfony2 抓住的就是web程序的根本! 再說我們眾多的HTTP流媒體有哪個會選擇使用MVC呢?

總之,我們Symfony2比MVC更靠近根本,我們更底層,更通用!!!

 

說起Symfony2,Fabien Potencier說我們有著更加遠大的目標,怎麼解釋呢?

Symfony2 將繼續專注於Pack技術的研究和創新!我們相信她會繼續推動web的向前發展。

先看看Symfony2 中我們已經包含的創新吧!

從Bundles,HTTP 緩存,分布式,依賴注入,模板引擎,聲明式配置,資產管理,穩定的API到web分析器等等一系列技術都對web的發展起到了巨大的推動作用。

 

“ 要知道一個獨立的框架永遠不可能成為PHP世界裡的一個標准,所以Symfony2 在探尋另外一條路!”

“ 共享無處不在。”

“ 我們不能重復制造輪子。”

因此,我們緊密的集成了Monolog,Composer,Doctrine,Propel,Assetic,Twig,Swiftmailer等偉大產品。

更重要的是我們想跟大家分享我們的工作!

所以,我們最終選擇了走組件(components)化這條路!

我們將為一切web項目提供建築模塊,無論是個人項目還是商業項目,更或者是開源項目!

 

據說在Symfony2 的代碼中可能會有標志為@api的類或者方法,它意味著一個方法從名字到參數以及返回值都不會因為Symfony2發展版本而變化,所以,如果

你的項目只使用了這些,那麼你就不用擔心Symfony2的版本升級問題。

 

看看Symfony2 現在擁有的組件吧:

DependencyInjection
EventDispatcher
HttpFoundation
DomCrawler
ClassLoader
CssSelector
HttpKernel
BrowserKit
Templating
Translation
Serializer
Validator
Security
Routing
Console
Process
Config
Finder
Locale
Yaml
Form

Fabien 簡單介紹了幾個bundle:

1. ClassLoader:

  實現了PSR-o 標准(自動加載具有命名空間的類,適用於PHP5.3以上)的自動加載器,同時它也能按照PEAR命名規則加載類。它非常靈活可以基於子命名空間在不同的目錄中查詢要加載的類。你甚至可以為一個命名空間指定多個目錄。

 1 require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
 2  
 3 use Symfony\Component\ClassLoader\UniversalClassLoader;
 4  
 5 $loader = new UniversalClassLoader();
 6 $loader->registerNamespaces(array(
 7     'Symfony'          => array(__DIR__.'/src', __DIR__.'/symfony/src'),
 8     'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
 9     'Doctrine\\DBAL'   => __DIR__.'/vendor/doctrine-dbal/lib',
10     'Doctrine'         => __DIR__.'/vendor/doctrine/lib',
11     'Monolog'          => __DIR__.'/vendor/monolog/src',
12 ));
13 $loader->registerPrefixes(array(
14     'Twig_' => __DIR__.'/vendor/twig/lib',
15 ));
16 $loader->register();

如果你想獲取更加高的執行效率,可以選擇使用APC緩存版Universal類加載器。

 

2.Console 命令行工具

在創建web應用程序時使用命令行工具很方便,你可以想如下代碼一樣創建自己的命令行工具:

 1 use Symfony\Component\Console\Application;
 2 use Symfony\Component\Console\Input\InputInterface;
 3 use Symfony\Component\Console\Input\InputArgument;
 4 use Symfony\Component\Console\Input\InputOption;
 5 use Symfony\Component\Console\Output\OutputInterface;
 6  
 7 $console = new Application();
 8 $console
 9     ->register('ls')
10     ->setDefinition(array(
11         new InputArgument('dir', InputArgument::REQUIRED, 'Directory name'),
12     ))
13     ->setDescription('Displays the files in the given directory')
14     ->setCode(function (InputInterface $input, OutputInterface $output) {
15         $dir = $input->getArgument('dir');
16  
17         $output->writeln(sprintf('Dir listing for <info>%s</info>', $dir));
18     })
19 ;
20 $console->run();

3.YAML  一種現在很流行的配置格式。

use Symfony\Component\Yaml\Yaml;
 
$array = Yaml::parse($file);
 
print Yaml::dump($array);

4. Finder 優秀文件資源的操作接口。

 1 use Symfony\Component\Finder\Finder;
 2  
 3 $finder = new Finder();
 4  
 5 $iterator = $finder
 6   ->files()
 7   ->name('*.php')
 8   ->depth(0)
 9   ->size('>= 1K')
10   ->in(__DIR__);
11  
12 foreach ($iterator as $file) {
13     print $file->getRealpath()."\n";
14 }

你甚至可以用它獲取遠程服務器文件系統中的資源,比如獲取Amazon S3上的文件:

1 $s3 = new \Zend_Service_Amazon_S3($key, $secret);
2 $s3->registerStreamWrapper("s3");
3  
4 $finder = new Finder();
5 $finder->name('photos*')->size('< 100K')->date('since 1 hour ago');
6 foreach ($finder->in('s3://bucket-name') as $file) {
7     print $file->getFilename()."\n";
8 }

5.Process 進程組件,你可以用來在一個外部進程中執行命令!下面例子是執行一個簡單的目錄列表命令並返回結果:

 1 use Symfony\Component\Process\Process;
 2  
 3 $process = new Process('ls -lsa');
 4 $process->setTimeout(3600);
 5 $process->run();
 6 if (!$process->isSuccessful()) {
 7     throw new RuntimeException($process->getErrorOutput());
 8 }
 9  
10 print $process->getOutput();

如果你想監控執行過程,你可以給run方法傳入一個匿名方法:

 1 use Symfony\Component\Process\Process;
 2  
 3 $process = new Process('ls -lsa');
 4 $process->run(function ($type, $buffer) {
 5     if ('err' === $type) {
 6         echo 'ERR > '.$buffer;
 7     } else {
 8         echo 'OUT > '.$buffer;
 9     }
10 });

6.DomCrawler jQuery的php版本!你可以用它導航定位HTML的DOM結構或者XML文檔。

1 use Symfony\Component\DomCrawler\Crawler;
2  
3 $crawler = new Crawler();
4 $crawler->addContent('<html><body><p>Hello World!</p></body></html>');
5  
6 print $crawler->filterXPath('descendant-or-self::body/p')->text();

7.CssSelector 我們經常用XPath來訪問Dom結構,其實用Css 選擇器更加容易,這個組件就是把Css選擇器轉為XPath等效的東西。

1 use Symfony\Component\CssSelector\CssSelector;
2  
3 print CssSelector::toXPath('div.item > h4 > a');

所以你可以使用CssSelector 和DomCrawler來替代XPath:

1 use Symfony\Component\DomCrawler\Crawler;
2  
3 $crawler = new Crawler();
4 $crawler->addContent('<html><body><p>Hello World!</p></body></html>');
5  
6 print $crawler->filter('body > p')->text();

8.HttpFoundation 

該組件只是在PHP的相關web內容上面增加了一個面向對象層,包括Request,Response,Uploaded files,Cookies,Sessions...

1 use Symfony\Component\HttpFoundation\Request;
2 use Symfony\Component\HttpFoundation\Response;
3  
4 $request = Request::createFromGlobals();
5 echo $request->getPathInfo();

你用它可以很容易的創建自己的Request 和 Response:

1 $request = Request::create('/?foo=bar', 'GET');
2 echo $request->getPathInfo();
3 
4 
5 $response = new Response('Not Found', 404, array('Content-Type' => 'text/plain'));
6 $response->send();

9.Routing 

路由組件和Request對象是相互配合著把Request轉換為Response。

 1 use Symfony\Component\HttpFoundation\Request;
 2 use Symfony\Component\Routing\Matcher\UrlMatcher;
 3 use Symfony\Component\Routing\RequestContext;
 4 use Symfony\Component\Routing\RouteCollection;
 5 use Symfony\Component\Routing\Route;
 6  
 7 $routes = new RouteCollection();
 8 $routes->add('hello', new Route('/hello', array('controller' => 'foo')));
 9  
10 $context = new RequestContext();
11  
12 // this is optional and can be done without a Request instance
13 $context->fromRequest(Request::createFromGlobals());
14  
15 $matcher = new UrlMatcher($routes, $context);
16  
17 $parameters = $matcher->match('/hello');

10.EventDispatcher

 1 use Symfony\Component\EventDispatcher\EventDispatcher;
 2 use Symfony\Component\EventDispatcher\Event;
 3  
 4 $dispatcher = new EventDispatcher();
 5  
 6 $dispatcher->addListener('event_name', function (Event $event) {
 7     // ...
 8 });
 9  
10 $dispatcher->dispatch('event_name');

11.DependencyInjection

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
 
$sc = new ContainerBuilder();
$sc
    ->register('foo', '%foo.class%')
    ->addArgument(new Reference('bar'))
;
$sc->setParameter('foo.class', 'Foo');
 
$sc->get('foo');

12.HttpKernel

Http 內核組件提供了HTTP協議中最有活力的部分,以下面接口的形式定義展示,它也是Symfony2框架的核心。

 1 interface HttpKernelInterface
 2 {
 3     /**
 4      * Handles a Request to convert it to a Response.
 5      *
 6      * @param  Request $request A Request instance
 7      *
 8      * @return Response A Response instance
 9      */
10     function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
11 }

它接受一個Request輸入並返回一個Response輸出。 只要遵循這個接口規定,你就能使用Symfony2中所有的精彩內容。

 

下面使用Symfony2 組件來創建一個簡單的框架:

 1 $routes = new RouteCollection();
 2 $routes->add('hello', new Route('/hello', array('_controller' =>
 3     function (Request $request) {
 4         return new Response(sprintf("Hello %s", $request->get('name')));
 5     }
 6 )));
 7  
 8 $request = Request::createFromGlobals();
 9  
10 $context = new RequestContext();
11 $context->fromRequest($request);
12  
13 $matcher = new UrlMatcher($routes, $context);
14  
15 $dispatcher = new EventDispatcher();
16 $dispatcher->addSubscriber(new RouterListener($matcher));
17  
18 $resolver = new ControllerResolver();
19  
20 $kernel = new HttpKernel($dispatcher, $resolver);
21  
22 $kernel->handle($request)->send();

ok, 這就是框架了!

如果想添加一個HTTP反向代理以獲取HTTP caching和ESI(Edge Side Includes)帶來的好處,那麼這樣做!

1 $kernel = new HttpKernel($dispatcher, $resolver); 
2  
3 $kernel = new HttpCache($kernel, new Store(__DIR__.'/cache'));

想對它做一下功能測試:

1 $client = new Client($kernel);
2 $crawler = $client->request('GET', '/hello/Fabien');
3  
4 $this->assertEquals('Fabien', $crawler->filter('p > span')->text());

想要一個好看的錯誤展示頁面?

1 $dispatcher->addSubscriber(new ExceptionListener(function (Request $request) {
2     $msg = 'Something went wrong! ('.$request->get('exception')->getMessage().')';
3  
4     return new Response($msg, 500);
5 }));

 


一轉是什

(1).轉動一次;旋轉一圈。 南朝 梁武帝 《白紵辭》:“短歌流目未肯前,含笑一轉私自憐。” 唐 顧況 《悲歌》之二:“我心皎潔君不知,辘轳一轉一惆怅。” 元 王實甫 《西廂記》第一本第一折:“怎當他臨去秋波那一轉!”《兒女英雄傳》第四回:“且說那女子把那石頭撂倒在平地上,用右手推著一轉,找著那個關眼兒伸進兩個指頭去勾住了。”

(2).提煉一次。 晉 葛洪 《抱樸子·金丹》:“其一轉至九轉,遲速各有日數,多少以此知之耳。”

(3).計算一遍。 南朝 宋 劉義慶 《世說新語·文學》:“嘗算渾天不合,諸弟子莫能解。或言 玄 ( 鄭玄 )能者。 融 ( 馬融 )令算,一轉便決。”

(4).四周。《儒林外史》第十四回:“兩邊一望,一邊是江,一邊是湖,又有那山色一轉圍著。”《儒林外史》第三十回:“諸名士看這湖亭時,軒窗四起,一轉都是湖水圍繞。”

(1).轉換勳階一次。《新唐書·太宗紀》:“從伐 高麗 無功者,皆賜勳一轉。”

(2).表數量。 清 翟灏 《通俗編·數目》引 李翊 《俗呼小錄》:“ 杭州 以柴四圓箍為一轉。”

ZDIC.NET 漢 典 網
【一轉語】 禅宗機鋒往來的關鍵處,稱“玄關”。破“玄關”必須親證實悟。以片言只語,撥轉對方的心機,使之沖破“玄關”,“柳暗花明又一村”,謂之“轉語”。《景德傳燈錄·百丈懷海禅師》指出:“古人只錯對一轉語,五百生墮野狐身。”可見“轉語”的重要。舉幾個例子。問:“不起一念有過無過?”答:“須彌山。”又如問;“磨磚豈成鏡耶?”答:“磨磚既不成鏡,坐禅豈得成佛耶!”後亦用“一轉語”指別出心裁。如宋·張元干《青玉案》詞序:“賀方回所作,世間和韻者多矣。余經行松江,何啻百回,念欲下一轉語。”也指用一二句話讓人恍然大悟。如胡適《嘗試篇》:“嘗試成功自古無,放翁此語未必是;我今為下一轉語,自古成功在嘗試。”
 

(轉)相由心生 境隨心轉是什?

這句應該算是老生常談了,但是對於情緒和心境的控制並不是時時刻刻都能做得那麼好。也會偶有憤怒,妒嫉,怨恨產生。從前一直說自己是個不懂掩藏情緒的人,喜怒哀樂全部寫在臉上。乍一聽好像說的是種直率,但其實不然。直至一日在我因為某事極度悲憤而又試圖掩蓋時,仍然被一位心細的朋友發現並且直言:你板著臉的時候真的很難看。­原來不是要懂得隱藏不好的情緒,如果壞情緒不走,是無法從根本上改變周遭的;我們做的是要懂得如果化解不好的情緒。 現在資源信息發達,有很多途徑可以讀到好的文字和文章,在此願以好文與大家分享。 希望我們都能做一個懂得自己,懂得如何讓自己快樂和幸福的自己。 --------------------------------------共享的分割線------------------------------------ 【轉載】文章來源:天機文獻 在古代,形成了一種預測術面相學,是專門以人的五官所儲存的信息來推斷一個人的禍、福、吉、凶的,面相學,是中國人家喻戶曉的,俗話說:人是一面相。一眼就能看出一個人的五觀及外貌,同時帶給人的第一感觀及印象。當你走到大街上或者是去自由市場,走一走,看一看,哪是正人君子,哪是小偷,你一眼就能認出來,因為小偷跟正常人的眼神不一樣。 在國民革命時期,中國正處在亂世之秋,龍蛇混雜,草莽逞英雄時代,社會秩序很亂在大上海警察局裡,就有一位精通。相法的巡警,凡是他所見到的賊眉鼠眼之人見了就抓每當審問後所抓之人均供認,曾有過偷竊和做壞事的行為,他能抓十個准十個,這就說明:他所掌握的相法是准確的,科學的。 其實,人一生下來,一生中的吉凶禍福,全都包含在人的五官當中人的五官相就是一副人的生命信息圖,人的壽命的長短,父母的早亡,子女的多少,兄弟的禍福,婚姻的克離,無不表現在人的五官之中。為什麼心地善良的人,他所長的相貌就和善心地凶惡的人,所長出的相貎就狡狯呢?這就反出了一條亘古不變的哲理一相心生。 心是人們常說的內心深處的思維活動,並不單純指的是人的心髒。內心裡想的什麼,在五官上就能現表什麼。當一個人內心有興奮的或有使人高興的事情,這個人就笑口常開,讓別人一看便知道在他身上一定有喜悅的事情發生。相反當一個人有悲傷的事情發生,表現在他面上則是哭喪的表情。總之,人的喜、怒、哀、樂、悲、思、恐、驚無不表現在五官相上,五官就是一個很精確的測量儀。 黃帝內經中有表裡如一論,外是由內而發,內則靠外來表現。當一個有胃病的人,去看醫生,醫師則用望、聞、問、切給他診病,當醫生看到病人的鼻准頭有紅而赤的顏色時,就能判斷出此人有胃病,這就是全息理論表現形式。人的思維也是一樣,當一個人對另一個人有深仇大恨,並且想殺掉這個人要報仇的時候,他的兩眼足以能噴出火來,目露凶光,雙目流露殺氣,當他想找一位相師占卜一下,問一下行動是否成功的時候,相師就說:你目露殺氣,請你不要挺而走險。 我認識一位愛好周易的老太太,約有六十來歲,大家都叫她苗坡。第一次與她相識,是在三角花‘園,她讓我給她測一下運氣。我看到她相上左邊眼下臥蠶,有三條紋,最下面的一條紋,不是平直向左方伸展,而是向左下方穿過左顴,我間:苗姨,你的小女兒在家嗎?她回答:哎呀,我就是為這事來預測的,小女兒隨一個小伙子私奔了,現在不知道她去了什麼地方?事過月余,再遇到苗太太時,間及小女兒的事,已經回家來了,再瞧瞧苗太太的那條臥蠶紋也平直伸展了。這就說明,相是隨內心的思維而發生變化的。當她的小女兒走後,她整日裡思念、煩惱,這種思維能量就表現在五官上了。相由心生,境隨心轉這句話出自佛教的揭語,被很多人經常掛在......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved