Symfony2學(xué)習(xí)筆記之控制器用法詳解
本文實(shí)例講述了Symfony2控制器用法。分享給大家供大家參考,具體如下:
一個(gè)controller是你創(chuàng)建的一個(gè)PHP函數(shù),它接收HTTP請(qǐng)求(request)并創(chuàng)建和返回一個(gè)HTTP回復(fù)(Response)?;貜?fù)對(duì)象(Response)可以是一個(gè)HTML頁(yè)面,一個(gè)XML文檔,一個(gè)序列化的JSON數(shù)組,一個(gè)圖片,一個(gè)重定向,一個(gè)404錯(cuò)誤或者任何你想要的內(nèi)容。controller中可以包含任何渲染你頁(yè)面內(nèi)容的所需要的邏輯。
下面是一個(gè)controller最簡(jiǎn)單的例子,僅僅打印一個(gè)Hello world!
use Symfony\Component\HttpFoundation\Response; public function helloAction() { return new Response('Hello world!'); }
Controller的終極目標(biāo)都是相同的那就是創(chuàng)建并返回一個(gè)Response對(duì)象。按照這個(gè)思路,你可以從request對(duì)象讀取信息,加載數(shù)據(jù)庫(kù)資源,發(fā)送email,或者在用戶(hù)的Session中寫(xiě)入信息。但是所有情況下,Controller將最終都會(huì)返回一個(gè)Response對(duì)象并被分發(fā)會(huì)客戶(hù)端。
比如如下情況:
Controller A 準(zhǔn)備一個(gè)Response對(duì)象來(lái)表現(xiàn)網(wǎng)站homepage內(nèi)容。
Controller B 從Request中讀取slug參數(shù)從數(shù)據(jù)庫(kù)中加載一個(gè)blog內(nèi)容并創(chuàng)建一個(gè)Response對(duì)象來(lái)顯示這個(gè)blog。如果slug在數(shù)據(jù)庫(kù)中不存在,它將創(chuàng)建并返回一個(gè)帶有404狀態(tài)碼的Response對(duì)象.
Controller C 處理一個(gè)從聯(lián)系表單,它從Request對(duì)象中讀取表單信息,保存聯(lián)系信息到數(shù)據(jù)庫(kù)并發(fā)郵件給管理員。最后,它創(chuàng)建一個(gè)Response對(duì)象重定向客戶(hù)端瀏覽器到聯(lián)系表單感謝頁(yè)面。
Requests,Controller, Response的生命周期
Symfony2項(xiàng)目中處理的每一個(gè)Request都是經(jīng)過(guò)了相同的簡(jiǎn)單生命周期??蚣茇?fù)責(zé)重復(fù)的任務(wù),最終執(zhí)行一個(gè)controller,該controller會(huì)包含你的應(yīng)用程序代碼:
1.每個(gè)Request都會(huì)被一個(gè)統(tǒng)一的前端控制器文件(比如,app.php,或者app_dev.php)處理,它會(huì)啟動(dòng)應(yīng)用程序。
2.Router從Request中讀取URI信息,并找到匹配它的Route,從該Route中讀取_controller參數(shù)。
3.匹配成功的route的controller被執(zhí)行,controller中的代碼創(chuàng)建并返回一個(gè)Response對(duì)象。
4.HTTP頭和生成的Response對(duì)象內(nèi)容將會(huì)被發(fā)回客戶(hù)端。
創(chuàng)建一個(gè)頁(yè)面跟創(chuàng)建一個(gè)controller一樣容易,創(chuàng)建一個(gè)路由來(lái)映射一個(gè)URL到該controller。
注意:盡管從名字上來(lái)看,前端控制器和controller差不多,其實(shí)它們是不同的。
一個(gè)前端控制器是一個(gè)存放于web目錄下的PHP文件,多有的Request都會(huì)通過(guò)它被重定向。每一個(gè)應(yīng)用程序都會(huì)有一個(gè)產(chǎn)品前端控制器app.php和一個(gè)開(kāi)發(fā)用的前端控制器app_dev.php。你不需要編輯,查看或者擔(dān)心它們。
看一個(gè)簡(jiǎn)單的Controller: 任何的PHP可調(diào)用內(nèi)容(比如函數(shù),對(duì)象方法或者一個(gè)Closure)都可以成為一個(gè)controller。Symfongy2中,一個(gè)controller通常為controller對(duì)象中一個(gè)單一的方法。Controllers通常也被稱(chēng)為actions。
// src/Acme/HelloBundle/Controller/HelloController.php namespace Acme\HelloBundle\Controller; use Symfony\Component\HttpFoundation\Response; class HelloController { public function indexAction($name) { return new Response('<html><body>Hello '.$name.'!</body></html>'); } }
注意在這個(gè)例子中controller是indexAction方法,它存在于controller類(lèi)(HelloController)中。不要混淆,之所以定義一個(gè)controller類(lèi)(HelloController)只是為了方便組織多個(gè)controllers/actions在一起。一般情況下,一個(gè)controller類(lèi)會(huì)有多個(gè)controllers/actions。
上面例子中的controller相當(dāng)簡(jiǎn)單:
Namespace行是symfony2使用了PHP5.3的命名空間功能來(lái)為整個(gè)controller類(lèi)指定命名空間。
use關(guān)鍵字導(dǎo)入了Response類(lèi),這是我們的controller必須返回的內(nèi)容。
Controller類(lèi)名字都是由其名字后面加Controller來(lái)定義,但是只有前面的部分才是其真正名字,為了統(tǒng)一起見(jiàn),在后面統(tǒng)一添加Controller。 在路由配置時(shí)只會(huì)取前面部分。
Controller類(lèi)中每個(gè)被用于真正controller的方法都會(huì)被添加一個(gè)統(tǒng)一的后綴Action,同樣我們?cè)谂渲闷渎酚蓵r(shí)也只會(huì)取前面部分而忽略掉Action。把它映射到某個(gè)URL。
每個(gè)controller方法的最后必然會(huì)創(chuàng)建一個(gè)Response對(duì)象并返回它。
映射一個(gè)URL到一個(gè)Controller方法:
上面例子中的controller方法返回一個(gè)簡(jiǎn)單的HTML頁(yè)面。如果要在瀏覽器中訪問(wèn)到該頁(yè)面,那么你需要為它創(chuàng)建一個(gè)route,把它映射到一個(gè)特定模式的URL上。
# app/config/routing.yml hello: pattern: /hello/{name} defaults: { _controller: AcmeHelloBundle:Hello:index }
XML格式:
<!-- app/config/routing.xml --> <route id="hello" pattern="/hello/{name}"> <default key="_controller">AcmeHelloBundle:Hello:index</default> </route>
PHP代碼格式:
// app/config/routing.php $collection->add('hello', new Route('/hello/{name}', array( '_controller' => 'AcmeHelloBundle:Hello:index', )));
現(xiàn)在想U(xiǎn)RL /hello/ryan 將被映射到HelloController::indexAction() controller并將ryan傳遞給$name變量。
創(chuàng)建一個(gè)所謂的頁(yè)面,其實(shí)就是創(chuàng)建一個(gè)controller方法和一個(gè)相關(guān)的route。
注意我們使用的指向controller方法的表示語(yǔ)法:AcmeHelloBundle:Hello:index
Symfony2使用了一個(gè)非常靈活的字符串聲明來(lái)指向不同的controller。它告訴Symfony2在一個(gè)名叫AcmeHelloBundle的bundle中去查找一個(gè)叫HelloController的類(lèi),并執(zhí)行它的indexAction()方法。在這個(gè)例子中,我們的路由配置直接寫(xiě)在了app/config/ 目錄下,一個(gè)更好的組織方式是把你的路由放到各自的bundle中。
路由參數(shù)作為Controller方法參變量
你已經(jīng)了_controller參數(shù) AcmeHelloBundle:Hello:index指向一個(gè)位于AcmeHelloBundle中名叫HelloController::indexAction()的方法。有趣的是路由中參數(shù)都會(huì)被傳遞給該方法。
<?php // src/Acme/HelloBundle/Controller/HelloController.php namespace Acme\HelloBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class HelloController extends Controller { public function indexAction($name) { // ... } }
上例中controller方法有一個(gè)唯一參數(shù),$name, 它對(duì)應(yīng)著route中定義的{name}占位符名稱(chēng)。事實(shí)上,等你執(zhí)行你的controller時(shí),Symfony2會(huì)匹配controller和route中每一個(gè)參數(shù)。
如果我修改一下Hello的路由定義:
YAML格式:
# app/config/routing.yml hello: pattern: /hello/{first_name}/{last_name} defaults: { _controller: AcmeHelloBundle:Hello:index, color: green }
XML格式:
<!-- app/config/routing.xml --> <route id="hello" pattern="/hello/{first_name}/{last_name}"> <default key="_controller">AcmeHelloBundle:Hello:index</default> <default key="color">green</default> </route>
PHP代碼格式:
// app/config/routing.php $collection->add('hello', new Route('/hello/{first_name}/{last_name}', array( '_controller' => 'AcmeHelloBundle:Hello:index', 'color' => 'green', )));
這時(shí)候controller中可以獲取這些參變量了:
public function indexAction($first_name, $last_name, $color) { // ... }
注意route定義中無(wú)論是占位符變量還是默認(rèn)值變量都會(huì)被轉(zhuǎn)化為controller方法的輸入變量。當(dāng)一個(gè)route匹配成功時(shí),它會(huì)合并占位符和defaults到一個(gè)數(shù)組傳遞給controller。映射route參數(shù)到controller參數(shù)非常簡(jiǎn)單和靈活。它們從route到controller不匹配順序。Symfony能夠把route中參變量的名字映射到controller方法簽名中的變量名字。比如{last_name} => $last_name,跟排列順序無(wú)關(guān)。
Controller方法中的參數(shù)必須匹配route中定義的參數(shù)下面為hello route定義的controller方法將會(huì)拋出異常:
public function indexAction($last_name, $color, $first_name) { // .. }
如果我們把$foo變量變?yōu)榭蛇x變量,那么就不會(huì)拋異常了。
public function indexAction($first_name, $last_name, $color, $foo) { // .. }
并不是每一個(gè)在route中定義的參數(shù)都需要在controller中有與之對(duì)應(yīng)的簽名參變量的,比如hello route中定義的{$last_name} 如果對(duì)你沒(méi)什么意義的話(huà)可以在controller中省略掉它。
public function indexAction($first_name, $color) { // .. }
反之,如果你在Controller簽名中定義了變量,并且不是可選變量,那么必須在route中有與之對(duì)應(yīng)的參數(shù)被定義。
在route定義中有一個(gè)特殊參數(shù) _route, 它匹配route的名稱(chēng)(如上例中的hello)。雖然不常用,但是它也可以作為controller方法的一個(gè)參變量使用。
Request作為一個(gè)Controller方法簽名變量
為了方便,你可能會(huì)讓symfony傳遞你的Request對(duì)象作為參數(shù)到你的controller方法。這在你處理表單時(shí)尤為方便。
use Symfony\Component\HttpFoundation\Request; public function updateAction(Request $request) { $form = $this->createForm(...); $form->bindRequest($request); // ... }
Controller基類(lèi)
為了方便,Symfony2定義了一個(gè)Controller基類(lèi),包含了一些常用的controller任務(wù)并給了你的controller類(lèi)訪問(wèn)任何你需要的資源的途徑。通過(guò)繼承該類(lèi),你可以獲得許多幫助方法。
// src/Acme/HelloBundle/Controller/HelloController.php namespace Acme\HelloBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; class HelloController extends Controller { public function indexAction($name) { return new Response('<html><body>Hello '.$name.'!</body></html>'); } }
在Symfony中controller并不一定非得繼承Controller基類(lèi),因?yàn)樗鼉?nèi)部的幫助方法等都不是必須的。你也可以繼承 Symfony\Component\DependencyInjection\ContainerAware 服務(wù)容器對(duì)象可以通過(guò)container屬性來(lái)訪問(wèn)。同時(shí)你也可以把controller定義成service。
通用的Controller任務(wù):
盡管Controller可以干任何事情,但是大部分的controller還是要重復(fù)的干一些基礎(chǔ)的任務(wù)。比如 重定向,跳轉(zhuǎn),渲染模板和訪問(wèn)核心服務(wù)等。
重定向(redirecting)
如果你想重定向你的用戶(hù)到另一個(gè)頁(yè)面,可以使用redirect()方法。
public function indexAction() { return $this->redirect($this->generateUrl('homepage')); }
這里generateUrl()方法是一個(gè)幫助函數(shù),用于根據(jù)給定的route生成相應(yīng)的URL。默認(rèn)情況下,redirect()方法執(zhí)行一個(gè)302重定向。如果要執(zhí)行301重定向,那么需要修改第二個(gè)參數(shù)如下:
public function indexAction() { return $this->redirect($this->generateUrl('homepage'), 301); }
redirect()方法其實(shí)是一個(gè)簡(jiǎn)化寫(xiě)法,真正的代碼如下:
use Symfony\Component\HttpFoundation\RedirectResponse; return new RedirectResponse($this->generateUrl('homepage'));
跳轉(zhuǎn)(Forwarding)
你可以使用forward()方法很容易從一個(gè)controller到另一個(gè)controller內(nèi)部。它執(zhí)行的是一個(gè)內(nèi)部子請(qǐng)求,來(lái)調(diào)用指定的controller,所以不會(huì)產(chǎn)生用戶(hù)客戶(hù)端瀏覽器的重定向。forward()方法返回的Response對(duì)象還將從原controller返回。
public function indexAction($name) { $response = $this->forward('AcmeHelloBundle:Hello:fancy', array( 'name' => $name, 'color' => 'green' )); // further modify the response or return it directly return $response; }
這里forward()方法使用了跟route配置中相同的字符串參數(shù)。這里傳入數(shù)組參數(shù)會(huì)作為目標(biāo)調(diào)用controller的參數(shù)。當(dāng)將controller嵌入到模板時(shí),也會(huì)使用同樣的接口。目標(biāo)調(diào)用的controller方法應(yīng)該是如下定義:
public function fancyAction($name, $color) { // ... create and return a Response object }
就像為一個(gè)route創(chuàng)建一個(gè)controller一樣,跟參數(shù)的順序沒(méi)關(guān)系。symfony2 會(huì)匹配索引鍵名稱(chēng)name到方法參數(shù)名稱(chēng)$name,即使順序打亂也沒(méi)關(guān)系。跟其它Controller基類(lèi)方法一樣,forward方法也僅僅是一個(gè)symfony2核心函數(shù)的快捷寫(xiě)法。一個(gè)跳轉(zhuǎn)可以直接通過(guò)http_kernel服務(wù)來(lái)完成,返回一個(gè)Response對(duì)象。
$httpKernel = $this->container->get('http_kernel'); $response = $httpKernel->forward('AcmeHelloBundle:Hello:fancy', array( 'name' => $name, 'color' => 'green', ));
渲染模板:
雖然不是必須的,但是大部分controller將最終渲染一個(gè)負(fù)責(zé)生成為controller負(fù)責(zé)生成HTML的模板。renderView()方法會(huì)渲染一個(gè)模板并返回它的內(nèi)容。這個(gè)返回內(nèi)容可以用作創(chuàng)建Response對(duì)象,以供controller返回使用。
$content = $this->renderView('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name)); return new Response($content);
上面的代碼完全可以更進(jìn)一步的使用下面的代碼形式來(lái)寫(xiě):
這兩種情況下,AcmeHelloBundle中的模板Resources/views/Hello/index.html.twig都會(huì)被渲染。
renderview()方法是如下代碼的快捷寫(xiě)法:
$templating = $this->get('templating'); $content = $templating->render('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name));
當(dāng)然也可以在子目錄中渲染模板
$templating->render('AcmeHelloBundle:Hello/Greetings:index.html.twig', array('name' => $name)); // index.html.twig 存放于 Resources/views/Hello/Greetings 目錄.
訪問(wèn)其它服務(wù)
只要是繼承了Controller基類(lèi),你就可以通過(guò)get()方法訪問(wèn)symfony2的服務(wù)了。比如:
$request = $this->getRequest(); $templating = $this->get('templating'); $router = $this->get('router'); $mailer = $this->get('mailer');
Symfony2中還有無(wú)數(shù)的可用服務(wù),同時(shí)也鼓勵(lì)你定義自己的服務(wù)。要查看所有的服務(wù),可以使用container:debug 命令行工具
$ php app/console container:debug
管理錯(cuò)誤和404頁(yè)面
當(dāng)一些東西沒(méi)有找到,你應(yīng)該重置HTTP協(xié)議返回一個(gè)404 回復(fù)。要做到這個(gè),你將拋出一個(gè)特殊類(lèi)型的異常。如果你是繼承了Controller基類(lèi),則:
public function indexAction() { $product = // retrieve the object from database if (!$product) { throw $this->createNotFoundException('The product does not exist'); } return $this->render(...); }
createNotFoundException()方法創(chuàng)建一個(gè)特定的NotFoundHttpException對(duì)象,它最終觸發(fā)404 HTTP回復(fù)。當(dāng)然你從你的controller方法中可以?huà)伋鋈魏晤?lèi)型的Exception 類(lèi),Symfony2會(huì)自動(dòng)返回一個(gè)500 HTTP回復(fù)代碼。
throw new \Exception('Something went wrong!');
管理Session
Symfony2 提供了一個(gè)非常好的Session對(duì)象,你可以用它來(lái)在請(qǐng)求之間存貯有關(guān)用戶(hù)的信息。默認(rèn)情況下,Symfony2 通過(guò)PHP本身的Session保存屬性到cookie。在任何controller中存儲(chǔ)和獲取Session信息將非常容易:
$session = $this->getRequest()->getSession(); // 為用戶(hù)的后一個(gè)請(qǐng)求使用存儲(chǔ)一個(gè)屬性 $session->set('foo', 'bar'); // 在另一個(gè)controller中為另一個(gè)請(qǐng)求獲取該屬性 $foo = $session->get('foo'); // 設(shè)置用戶(hù)的本地化語(yǔ)言 $session->setLocale('fr');
Flash 消息
你可以為特定的請(qǐng)求存儲(chǔ)少量的消息到用戶(hù)的Session。這在處理一個(gè)表單時(shí)非常有用,你想重定向和一個(gè)特定的信息顯示在下一個(gè)請(qǐng)求中。這種類(lèi)型的消息被稱(chēng)為Flash消息。比如,假設(shè)你處理一個(gè)表單提交:
public function updateAction() { $form = $this->createForm(...); $form->bindRequest($this->getRequest()); if ($form->isValid()) { // 做些排序處理 $this->get('session')->setFlash('notice', 'Your changes were saved!'); return $this->redirect($this->generateUrl(...)); } return $this->render(...); }
此例中,在處理完請(qǐng)求后,controller設(shè)置了一個(gè)notice flash消息并作了重定向。名字notice沒(méi)什么意義,只是用于標(biāo)識(shí)該消息。在下一個(gè)活動(dòng)的模板中,下面的代碼能夠渲染這個(gè)notic消息:
Twig
{% if app.session.hasFlash('notice') %} <div class="flash-notice"> {{ app.session.flash('notice') }} </div> {% endif %}
PHP代碼:
<?php if ($view['session']->hasFlash('notice')): ?> <div class="flash-notice"> <?php echo $view['session']->getFlash('notice') ?> </div> <?php endif; ?>
這樣設(shè)計(jì),flash消息就能夠?yàn)闇?zhǔn)確的某個(gè)請(qǐng)求存在了。他們一般被設(shè)計(jì)出來(lái)就是用于重定向的。
Response對(duì)象
作為一個(gè)Controller來(lái)說(shuō),唯一必須做到的是返回一個(gè)Response對(duì)象。
Response對(duì)象是一個(gè)PHP代碼對(duì)HTTP Response的抽象。
HTTP Response是一個(gè)基于文本的消息有HTTP headers和 返回給客戶(hù)端的內(nèi)容組成。
//創(chuàng)建一個(gè)簡(jiǎn)單的Response對(duì)象,默認(rèn)狀態(tài)碼為200 $response = new Response('Hello ' .$name, 200); //創(chuàng)建一個(gè)基于JSON的Response對(duì)象,狀態(tài)碼也為200 $response = new Response(json_encode(array('name'=>$name))); $response->headers->set('content-type','application/json');
其中headers屬性是一個(gè)HeaderBag對(duì)象,內(nèi)部包含許多有用的方法來(lái)讀取和改變Response的頭信息。頭名字被標(biāo)準(zhǔn)化使用Content-Type 與content-type或者content_type效果等同。
請(qǐng)求對(duì)象Request
除了路由占位符的值以外,如果繼承了Controller基類(lèi)那么該controller還可以訪問(wèn)Request對(duì)象。
$request = $this->getRequest(); $request->isXmlHttpRequest(); // 判斷是不是Ajax請(qǐng)求 $request->getPreferredLanguage(array('en','fr')); $request->query->get('page'); // 獲取$_GET 參數(shù) $request->request->get('page'); //獲取$_POST參數(shù)
跟Response對(duì)象一樣,Request對(duì)象的頭也保存在HeaderBag對(duì)象中,可以很方便的被訪問(wèn)。
總結(jié)思考:
無(wú)論何時(shí),你創(chuàng)建一個(gè)頁(yè)面,你最終需要為它寫(xiě)一些包含邏輯的代碼。在Symfony中,這叫一個(gè)controller, 它是一個(gè)PHP的函數(shù),它可以為了最后返回一個(gè)Response對(duì)象給用戶(hù)可以做需要的任何事情。簡(jiǎn)單的說(shuō),你可以選擇繼承一個(gè)Controller基類(lèi),它包含了許多執(zhí)行controller通用任務(wù)的快捷方法。比如,你不想把HTML代碼寫(xiě)入你的controller, 你可以使用render()方法來(lái)渲染并返回一個(gè)模板內(nèi)容。
希望本文所述對(duì)大家基于Symfony框架的PHP程序設(shè)計(jì)有所幫助。
- Symfony查詢(xún)方法實(shí)例小結(jié)
- Symfony2聯(lián)合查詢(xún)實(shí)現(xiàn)方法
- Symfony2使用Doctrine進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)方法實(shí)例總結(jié)
- 高性能PHP框架Symfony2經(jīng)典入門(mén)教程
- Symfony2實(shí)現(xiàn)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的方法小結(jié)
- Symfony2學(xué)習(xí)筆記之模板用法詳解
- Symfony2框架學(xué)習(xí)筆記之表單用法詳解
- Symfony2框架創(chuàng)建項(xiàng)目與模板設(shè)置實(shí)例詳解
- symfony2.4的twig中date用法分析
- Symfony2安裝第三方Bundles實(shí)例詳解
- Symfony2實(shí)現(xiàn)在controller中獲取url的方法
- Symfony2針對(duì)輸入時(shí)間進(jìn)行查詢(xún)的方法分析
相關(guān)文章
分享PHP-pcntl 實(shí)現(xiàn)多進(jìn)程代碼
PHP可通過(guò)PCNTL擴(kuò)展實(shí)現(xiàn)進(jìn)程控制,如進(jìn)程創(chuàng)建,信號(hào)處理,進(jìn)程中斷判斷等。但只能在CLI模式下操作。PCNTL的信號(hào)機(jī)制是基于 ticks 機(jī)制實(shí)現(xiàn)的。2016-09-09Linux下將excel數(shù)據(jù)導(dǎo)入到mssql數(shù)據(jù)庫(kù)中的方法
在Linux下把excel數(shù)據(jù)導(dǎo)入到mssql數(shù)據(jù)庫(kù)中,這實(shí)在是很搞笑的一個(gè)活動(dòng)!幾乎很少有程序員研究過(guò)這個(gè)問(wèn)題吧?如此變態(tài)的問(wèn)題,估計(jì)我是第一個(gè)研究的!呵呵,完全是自找苦吃~~,但是今天完了這項(xiàng)太有挑戰(zhàn)性的工作!2010-02-02Laravel 自動(dòng)轉(zhuǎn)換長(zhǎng)整型雪花 ID 為字符串的實(shí)現(xiàn)
這篇文章主要介紹了Laravel 自動(dòng)轉(zhuǎn)換長(zhǎng)整型雪花 ID 為字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10使用YUI+Ant 實(shí)現(xiàn)JS CSS壓縮
YUI庫(kù)是一組工具和控件,它們用JavaScript寫(xiě)成, 為的是用DOM 腳本,DHTML和AJAX等技術(shù)創(chuàng)建豐富的網(wǎng)頁(yè)交互式應(yīng)用程序。YUI 基于BSD協(xié)議,對(duì)所有的使用方式都是免費(fèi)的。YUI 項(xiàng)目包括YUI 庫(kù)和兩個(gè)創(chuàng)建時(shí)工具:YUI Compressor (壓縮)和YUI Doc(JavaScripts代碼的文檔引擎)2014-09-09YII框架實(shí)現(xiàn)自定義第三方擴(kuò)展操作示例
這篇文章主要介紹了YII框架實(shí)現(xiàn)自定義第三方擴(kuò)展操作,結(jié)合實(shí)例形式分析了Yii框架自定義第三方擴(kuò)展操作的步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-04-04thinkphp3.2實(shí)現(xiàn)上傳圖片的控制器方法
這篇文章主要介紹了thinkphp3.2實(shí)現(xiàn)上傳圖片的控制器方法,結(jié)合實(shí)例形式分析了thinkPHP圖片文件上傳相關(guān)的文件類(lèi)型判斷,文件路徑及相關(guān)屬性操作技巧,需要的朋友可以參考下2016-04-04