त्याग
यह सबक आपको Yii2 को जानने में मदद करेगा। फिलहाल, Yii2 उत्पादन के लिए बिल्कुल तैयार नहीं है। मैं कार्य परियोजनाओं में इसका उपयोग करने की अनुशंसा नहीं करता हूं।
चलिए शुरू करते हैं
आज, Yii फ्रेमवर्क के लेखकों ने Yii2 के सार्वजनिक पूर्वावलोकन की घोषणा की। Yii1 और Yii2 के बीच काफी बदलाव हैं।
यह ट्यूटोरियल बताता है कि Yii2 पर एक सरल ब्लॉग कैसे बनाया जाए। इस प्रक्रिया में, हम Yii2 को डाउनलोड और इंस्टॉल करेंगे, एक मूल एप्लिकेशन बनाएँ, डेटाबेस से कनेक्ट करें और पोस्ट बनाने, अपडेट करने, पढ़ने और हटाने के लिए तर्क का वर्णन करें।
जारी रखने के लिए आपको आवश्यकता होगी:
- एक वेब सर्वर, जैसे कि Apache या Nginx। मैं Nginx का उपयोग करेंगे। अपाचे का उपयोग करना थोड़ा भिन्न होगा, इसलिए चिंता न करें यदि आपके पास पास में नग्नेक्स के साथ सर्वर नहीं है।
- हमारे आवेदन के लिए उत्तर डेटाबेस। मैंने MySQL 5.5 को चुना
- PHP का मूल ज्ञान। मैं जितना संभव हो उतना सरल सब कुछ समझाने की कोशिश करूंगा, लेकिन जितना बेहतर आप पीएचपी जानते हैं, उतना ही आसान होगा।
- Yii या MVC का मूल ज्ञान। यदि आपके पास एमवीसी के साथ कोई अनुभव नहीं है, तो मैं आपको एमवीसी की मूल बातें पढ़ने की सलाह देता हूं। आप एमवीसी के ज्ञान के बिना इस पाठ को पढ़ सकते हैं, लेकिन आपके लिए यह समझना बहुत आसान होगा कि क्या हो रहा है, मैं एमवीसी के विषय को समझता हूं।
आगे बढ़ो!
मैं मान लूंगा कि आपके पास पहले से ही एक कॉन्फ़िगर वेब सर्वर है। पाठ में, मैं निम्नलिखित रास्तों और पतों का उपयोग करूंगा:
- / var / www / yii2 DocumentRoot के रूप में
- होस्टिंग पते के रूप में yii2.erianna.com
इसके अलावा, पाठ के अंत में, आप उस एप्लिकेशन का एक उदाहरण देख सकते हैं जिसे हम
yii2.erianna.com पर
बनाएंगे ।
Yii2 डाउनलोड करें
आप गितुब से Yii2 की एक प्रति प्राप्त कर सकते हैं या तो भंडार को क्लोन करके या संग्रह को डाउनलोड करके।
git क्लोन git@github.com: yiisoft / yii2.git / dir / to / yii2
या
wget https://github.com/yiisoft/yii2/archive/master.zip
unzip master.zip / dir / to / yii2
Yii2 को अनपैक करने के बाद
/ dir / to / yii2 / Framework फ़ोल्डर में जाएं
cd / dir / to / yii2 / फ्रेमवर्क
और पहले प्रश्न के लिए हां का जवाब देकर मूल वेब एप्लिकेशन बनाने के लिए निम्न कमांड चलाएं।
php yiic.php ऐप / बनाएं / var / www / yii2
हां
यह Yii 1.x में वेब एप्लिकेशन निर्माण टीम के समतुल्य है। अब / var / www / yii2 पर जाएं। आपको एक फ़ोल्डर और एक फ़ाइल दिखाई देगी।
$ एलएस-एल
कुल 8
-rwxrwxrwx 1 उपयोगकर्ता www-data 265 मई 4 09:30 index.php
drwxrwsr-x 5 उपयोगकर्ता www-data 4096 मई 4 09:07 संरक्षित
हमारी साइट शुरू करने से पहले, हमें index.php फ़ाइल में कुछ संशोधन करने की आवश्यकता है। मेरी राय में, कई विवादास्पद फैसले हैं। उम्मीद है कि वे इसे और अधिक अनुकूल बनाने के लिए Yii2 की अंतिम रिलीज से पहले तय हो जाएंगे।
Index.php को निम्नानुसार बदलें:
<?php define('YII_DEBUG', true);
आइए देखें कि हमने क्या बदला:
सबसे पहले, हमें पथ को फ्रेमवर्क / yii.php फ़ाइल में बदलना होगा। डिफ़ॉल्ट रूप से, यह माना जाता है कि यह उसी निर्देशिका में निहित है। ऐसा हो सकता है, लेकिन हमें Yii2 के लिए सटीक मार्ग निर्दिष्ट करने की आवश्यकता है।
$config = require dirname(__FILE__).'/protected/config/main.php'; $config['basePath'] = dirname(__FILE__).'/protected';
दूसरे, हम कॉन्फ़िगरेशन फ़ाइल के लिए पथ को अपडेट करते हैं ताकि वह
__DIR__ के बजाय
__FILE__ का उपयोग
करे । यह आवश्यक है ताकि आपका आवेदन शुरू हो सके।
जारी रखने से पहले, Yii -
Namespaces में कुछ नया नोट करना महत्वपूर्ण है
$app = new \yii\web\Application($config);
नेमस्पेस का अर्थ विभिन्न कोड आधारों के बीच टकराव से बचने के लिए कोड को तार्किक इकाइयों में बदलना है। मान लीजिए कि आपके पास दो कक्षाएं हैं, दोनों को
फू कहा जाता है और दोनों में एक
बार विधि है। यदि वे विभिन्न नामस्थानों में स्थित हैं, तो आप उन्हें बिना किसी टकराव के एक-दूसरे से स्वतंत्र रूप से कॉल कर सकते हैं।
$foo = new \namespace\Foo; $foo2 = new \namespace2\Foo;
कोड टकराव से बचने के लिए नेमस्पेस एक आसान तरीका है। मैं आपको
उनके बारे में पढ़ने की सलाह देता
हूं , क्योंकि Yii2 पूरी तरह से इस सिद्धांत पर बनाया जाएगा।
अब आपने पहला एप्लीकेशन बना लिया है! उस पते पर जाएं जहां yii2 स्थित है और आप निम्न पृष्ठ देखेंगे।

आपका पहला Yii2 ऐप!
Yii 1.x के विपरीत, मूल Yii2 एप्लिकेशन इतना रोमांचक नहीं है। आइए उसे थोड़ा और करना सिखाएं।
सबसे पहले, फ़ाइल
/protected/views/layout/main.php खोलें और इसकी सामग्री बदलें:
<?php use yii\helpers\Html as Html; ?> <!doctype html> <html lang="<?php \Yii::$app->language?>"> <head> <meta charset="utf-8" /> <title><?php echo Html::encode(\Yii::$app->name); ?></title> <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet"> <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="navbar navbar-inverse"> <div class="container"> <div class="navbar-inner"> <a class="brand" href="/"><?php echo Html::encode(\Yii::$app->name); ?></a> </div> </div> </div> <div class="content"> <?php echo $content?> </div> </div> </body> </html>
अब पेज को रिफ्रेश करें। आप देखते हैं? क्या यह ट्विटर बूटस्ट्रैप के साथ बेहतर नहीं हो रहा है? फिर, Yii1 और Yii2 के बीच बहुत कुछ नहीं बदला है। देखने में सामग्री प्रदर्शित करने के लिए आपके पास अभी भी $ सामग्री चर है। हालाँकि,
Yii :: app () को Yii :: $ ऐप से बदल दिया
गया था । और मैं आपको फिर से याद दिला दूं - Yii2 में सब कुछ नेमस्पेस द्वारा विभाजित किया गया है, इसलिए यह महत्वपूर्ण है कि अपने नेमस्पेस द्वारा हर चीज का उल्लेख करना याद रखें, न कि केवल "कच्चे" वर्गों को कॉल करें।
अब चलो असली कोडिंग के लिए नीचे उतरो!
डेटाबेस से कनेक्ट करें
इस एप्लिकेशन के लिए, हमारे पास केवल एक सरल
पोस्ट टेबल होगी जिसमें हम अपने ब्लॉग के पोस्ट स्टोर करेंगे।
डेटाबेस में एक तालिका बनाएँ
MySQL में लॉग इन करें और एक उपयोगकर्ता और डेटाबेस बनाएँ जिसका नाम yii2 है। फिर संरचना को अद्यतन करने के लिए निम्नलिखित प्रश्न को चलाएं:
DROP TABLE IF EXISTS `posts`; CREATE TABLE IF NOT EXISTS `posts` ( `id` int(11) NOT NULL, `title` varchar(255) NOT NULL, `content` text NOT NULL, `created` datetime NOT NULL, `updated` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; ALTER TABLE `posts` ADD PRIMARY KEY(`id`); INSERT INTO `yii2`.`posts` (`id`, `title`, `content`, `created`, `updated`) VALUES ('1', 'Example Title', 'New Post', NOW(), NOW());
कॉन्फिगर अपडेट करें
/ Var / www / yii2 / संरक्षित / फ़ोल्डर पर जाएं और अपने पसंदीदा संपादक में
config.php फ़ाइल खोलें। इसकी सभी सामग्रियों को इसके साथ बदलें:
<?php return array( 'id' => 'webapp', 'name' => 'My Web Application', 'components' => array(
यदि आप Yii से परिचित हैं, तो आप उन राक्षसी विन्यासों के सापेक्ष एक
मजबूत सुधार देखेंगे जो Yii1 उत्पन्न करते हैं। इस तथ्य के बावजूद कि संरचना समान है, हमें डेटाबेस से कनेक्ट करने की आवश्यकता है।
एक पोस्ट मॉडल बनाएँ
संरक्षित फ़ोल्डर में एक नया
मॉडल फ़ोल्डर बनाएँ, और फिर
उसमें निम्न कोड के साथ एक
पोस्ट.फैप फ़ाइल बनाएं।
<?php namespace app\models; class Post extends \yii\db\ActiveRecord { public static function model($className=__CLASS__) { return parent::model($className); } public static function tableName() { return 'posts'; } public static function primaryKey() { return array('id'); } public function attributeLabels() { return array( 'id' => 'ID', 'title' => 'Title', 'content' => 'Content', 'created' => 'Created', 'updated' => 'Updated', ); } }
यदि आप Yii1 से परिचित हैं, तो ActiveRecord (कम से कम इस उदाहरण में) में परिवर्तित होने वाली एकमात्र बात यह है कि
प्रायमरीके और
टेबलनेम फ़ंक्शन अब स्थिर तरीके हैं। बाकी सब कुछ मूल रूप से एक ही है। अधिकांश भाग के लिए, ActiveRecord अछूता रहा है।
वर्ग का सबसे महत्वपूर्ण हिस्सा
app \ मॉडल नामस्थान का समावेश है। यह Yii को बताता है कि हम इस फ़ाइल को कैसे संदर्भित कर सकते हैं।
Yii1 के विपरीत, जहां आप बस क्लास नाम से कॉल कर सकते हैं, Yii2 एक अलग प्रकार के फ़ाइल स्टार्टअप का उपयोग करता है, जिसके लिए आपको यह निर्दिष्ट करने की आवश्यकता है कि आप क्या उपयोग करने जा रहे हैं। यह कुछ हद तक विकास को धीमा कर सकता है (हमेशा याद रखने के प्रयास में शामिल है कि सिर्फ कॉलिंग सीएचटीएमएल को कॉल करने के बजाय \ yii फ्रेमवर्क \ web \ Html शामिल हो सकता है), लेकिन साथ ही यह Yii2 को इस कारण से बहुत तेज कर देगा कि ऑटोलैडर को अब लोड करने के लिए पूरे ढांचे की खोज नहीं करनी होगी। कुछ एक वर्ग। कम से कम सिद्धांत में।
CRUD!
नाम मॉडल में पोस्ट मॉडल डालने के बाद, हम CRUD एप्लिकेशन बनाना शुरू कर सकते हैं।
सभी देखें
आरंभ करने के लिए, हम इंडेक्स क्रिया को अपडेट करते हैं ताकि हम सब कुछ देख सकें। मुझे मुख्य पृष्ठ पर सभी संदेशों को देखना पसंद है, तो चलिए इसी के साथ शुरू करते हैं।
नियंत्रकों / SiteController.php फ़ाइल खोलें और नीचे दिखाए अनुसार सूचकांक कार्रवाई को अपडेट करें:
public function actionIndex() { $post = new Post; $data = $post->find()->all(); echo $this->render('index', array( 'data' => $data )); }
मैं कुछ बातें नोट करूंगा। सबसे पहले,
:: मॉडल () -> गायब हो गया। ActiveRecord डेटा और मॉडल अब प्रत्यक्ष विधि कॉल द्वारा उपलब्ध हैं। उदाहरण के लिए, $ पोस्ट-> खोजें () -> सभी ()। इस तथ्य के बावजूद कि मुझे व्यक्तिगत रूप से पोस्ट :: मॉडल () -> findAll (), डेटा तक पहुंचने का नया तरीका अधिक मानक और पढ़ने में आसान लगता है।
दूसरे, findAll को खोज () -> सभी () से बदल दिया गया है। सभी खोज विधियाँ अब खोज () या findBySql () से आती हैं।
तीसरा, यह $-> रेंडर () अब लाइन की शुरुआत में गूंज की आवश्यकता है। निजी तौर पर, मुझे इससे नफरत है। यह CakePHP के समान है और मेरी राय में, बेमानी है। इस परिवर्तन के पीछे विचार यह है कि उपयोगकर्ता को दिखाने के लिए आपको जो कुछ भी दिखाना है, उसे गूंज के माध्यम से भेजा जाना चाहिए, अन्यथा इसे आगे की कार्रवाई के लिए एक चर में रखा जाना चाहिए। मैं एक चर (प्रतिपादन विधि के लिए एक पैरामीटर पारित) के पुराने तरीके को पसंद करता हूं, लेकिन शायद मैं इसके साथ सहज हो जाऊंगा।
अब पृष्ठ को ताज़ा करें ...
यदि आप नामस्थान से परिचित हैं, तो आप शायद मुझसे पूछेंगे कि मैंने पोस्ट मॉडल को क्यों शामिल नहीं किया। यदि आप परिचित नहीं हैं, तो आप आश्चर्यचकित हो सकते हैं कि आपको एक त्रुटि मिली। इसका कारण सरल है। _ आपको Yii2_ में नामस्थान याद रखना चाहिए। सभी जो आप उपयोग करना चाहते हैं, उन्हें स्पष्ट रूप से इंगित किया जाना चाहिए, अगर यह पहले नहीं किया गया है।
SiteController फ़ाइल की शुरुआत में निम्न पंक्ति जोड़ें। फिर पेज को रिफ्रेश करें।
use app\models\Post;
अब पोस्ट प्रदर्शित करने के लिए मार्कअप जोड़ें।
संरक्षित / दृश्य / साइट / index.php फ़ाइल खोलें और इसकी सामग्री को निम्नलिखित के साथ बदलें:
<?php use yii\helpers\Html; ?> <?php echo Html::a('Create New Post', array('site/create'), array('class' => 'btn btn-primary pull-right')); ?> <div class="clearfix"></div> <hr /> <table class="table table-striped table-hover"> <tr> <td>#</td> <td>Title</td> <td>Created</td> <td>Updated</td> <td>Options</td> </tr> <?php foreach ($data as $post): ?> <tr> <td> <?php echo Html::a($post->id, array('site/read', 'id'=>$post->id)); ?> </td> <td><?php echo Html::a($post->title, array('site/read', 'id'=>$post->id)); ?></td> <td><?php echo $post->created; ?></td> <td><?php echo $post->updated; ?></td> <td> <?php echo Html::a(NULL, array('site/update', 'id'=>$post->id), array('class'=>'icon icon-edit')); ?> <?php echo Html::a(NULL, array('site/delete', 'id'=>$post->id), array('class'=>'icon icon-trash')); ?> </td> </tr> <?php endforeach; ?> </table>
हम्म, यह अलग दिखता है, है ना? CHtml :: लिंक () चला गया है, इसके बजाय Html सहायक दिखाई देता है। सौभाग्य से, CHtml की संरचना :: लिंक और Html :: a अलग नहीं है। तो बस मापदंडों में भरें।
पढ़ना
पढ़ना आसान है, इसलिए इसे समझें। निम्नलिखित परिभाषा के साथ साइटकंट्रोलर में एक नई विधि बनाएँ:
public function actionRead($id=NULL) { echo 'HelloWorld'; }
अब जाना है? आर = साइट / पढ़ा और आईडी = 1। आपको स्क्रीन पर
HelloWorld दिखाई देगा। आप देखते हैं? Horogo। इसका मतलब है कि हमारी पद्धति को बुलाया गया है। अब डेटाबेस से डेटा दिखाने के लिए इसे अपडेट करें।
सबसे पहले, साइटकंट्रोलर में एक HttpException जोड़ें, ताकि पोस्ट न मिलने पर हम HttpException को फेंक सकें।
use \yii\base\HttpException;
अब पढ़ने की क्रिया के पूरक हैं
public function actionRead($id=NULL) { if ($id === NULL) throw new HttpException(404, 'Not Found'); $post = Post::find($id); if ($post === NULL) throw new HttpException(404, 'Document Does Not Exist'); echo $this->render('read', array( 'post' => $post )); }
स्पष्टता के लिए, एक HttpException अनिवार्य रूप से एक CHttpException है। हम केवल डेटाबेस में निर्दिष्ट आईडी के साथ एक पोस्ट का अनुरोध करते हैं और इसे प्रदर्शित करते हैं। यदि पोस्ट नहीं मिला या आईडी निर्दिष्ट नहीं किया गया था, तो हम एक HttpException को फेंक देते हैं।
अगला, हमें एक नई फ़ाइल
संरक्षित / विचार / साइट / read.php बनाने और पोस्ट को प्रदर्शित करने के लिए निम्न कोड जोड़ना होगा।
<?php use yii\helpers\Html; ?> <div class="pull-right btn-group"> <?php echo Html::a('Update', array('site/update', 'id' => $post->id), array('class' => 'btn btn-primary')); ?> <?php echo Html::a('Delete', array('site/delete', 'id' => $post->id), array('class' => 'btn btn-danger')); ?> </div> <h1><?php echo $post->title; ?></h1> <p><?php echo $post->content; ?></p> <hr /> <time>Created On: <?php echo $post->created; ?></time><br /> <time>Updated On: <?php echo $post->updated; ?></time>
अब, मुख्य पृष्ठ पर, "उदाहरण पोस्ट" पर क्लिक करें। देखा! अब आप ब्लॉग पोस्ट देख सकते हैं!
निष्कासन
पदों को हटाना उतना ही आसान है, इसलिए हम उनकी देखभाल करेंगे। निम्नलिखित कोड के साथ एक नई विधि बनाएँ:
public function actionDelete($id=NULL) { }
इस विधि के लिए, हमें कुछ अधिक जटिल वाक्यविन्यास की आवश्यकता है। पोस्ट को हटाने के बाद हमें उपयोगकर्ता को मुख्य पृष्ठ पर वापस भेजना चाहिए। चलिए शुरू करते हैं।
सबसे पहले, विधि का वर्णन करें
public function actionDelete($id=NULL) { if ($id === NULL) { Yii::$app->session->setFlash('PostDeletedError'); Yii::$app->getResponse()->redirect(array('site/index')); } $post = Post::find($id); if ($post === NULL) { Yii::$app->session->setFlash('PostDeletedError'); Yii::$app->getResponse()->redirect(array('site/index')); } $post->delete(); Yii::$app->session->setFlash('PostDeleted'); Yii::$app->getResponse()->redirect(array('site/index')); }
Yii2 के संबंध में कुछ टिप्पणियां। पहले, पुनर्निर्देशन अब
Yii :: $ app-> getResponse-> redirect () के बजाय
$ this-> redirect () का उपयोग करके किया जाता है। यह समाधान कोड को व्यवस्थित करने के संदर्भ में समझ में आता है, लेकिन प्रिंट करने में इतना समय लगता है! इसके अलावा, यह $ ऐप में भीड़ की भावना पैदा करता है। इसी समय, विधि की परिभाषा समान रहती है।
दूसरा, सेटफ्लैश अब ऐप () के बजाय $ ऐप के माध्यम से उपलब्ध है। आपको अब इसकी आदत डाल लेनी चाहिए। =)
अब हमें हटाने के साथ किया जाता है। आइए
संरक्षित / विचारों / साइट / index.php पर वापस जाएं और भेजे गए सूचनाओं को पकड़ें।
पहले घंटे के टैग के बाद इसे जोड़ें
<?php if(Yii::$app->session->hasFlash('PostDeletedError')): ?> <div class="alert alert-error"> There was an error deleting your post! </div> <?php endif; ?> <?php if(Yii::$app->session->hasFlash('PostDeleted')): ?> <div class="alert alert-success"> Your post has successfully been deleted! </div> <?php endif; ?>
अब "उदाहरण पोस्ट" को हटाने का प्रयास करें। बहुत सरल, हुह? अब आप Yii :: $ ऐप का विचार समझ रहे हैं, है ना?
बनाने
अब चलिए अपने ब्लॉग पर नई प्रविष्टियाँ बनाते हुए, मजेदार प्रसारण की ओर बढ़ें। हमें बनाने के लिए कुछ चीजें करनी होंगी। सबसे पहले, हम प्रपत्र के साथ काम करने के लिए ActiveForm का उपयोग करने जा रहे हैं। दूसरे, हमें $ _POST में डेटा को पकड़ना और मान्य करना होगा। और अंत में, इसके बाद हमें डेटा को डेटाबेस में सहेजना होगा। चलिए शुरू करते हैं।
पहले, आइए फॉर्म के लिए एक दृश्य बनाएं। फ़ाइल को
संरक्षित / विचार / साइट / create.php बनाएँ । चूंकि हम विजेट का उपयोग करने जा रहे हैं, इसलिए हमें एप्लिकेशन के रूट में "एसेट्स" फ़ोल्डर बनाने और वेब सर्वर द्वारा इसे लिखने योग्य बनाने की आवश्यकता है। चामोद 755 आमतौर पर इस मुद्दे को हल करता है। फिर साइटकंट्रोलर में विधि की परिभाषा जोड़ें।
public function actionCreate() { $model = new Post; if (isset($_POST['Post'])) { $model->title = $_POST['Post']['title']; $model->content = $_POST['Post']['content']; if ($model->save()) Yii::$app->response->redirect(array('site/read', 'id' => $model->id)); } echo $this->render('create', array( 'model' => $model )); }
यह कमोबेश Yii1 में ही दिखता है। लेकिन फिर भी कुछ अंतर हैं। सबसे पहले, नियंत्रक के पास अब एक "पॉप्युलेट" विधि है ($ यह-> आबाद ($ ds, $ मॉडल)), जो सिद्धांत रूप में हमें इस सभी स्क्वैलर को isset ($ _ POST) के साथ सहेजना चाहिए। एक नया पोस्ट बनाने के लिए कोड इस तरह दिखेगा:
if ($this->populate($_POST, $model)) {
दुर्भाग्य से, मुझे यह नवीनतम संस्करण में काम करने के लिए नहीं मिला। मेरे मॉडल में डेटा अपरिवर्तित रहा। दूसरे, मैं $ मॉडल भी नहीं पा सका-> विशेषताएँ = $ _POST ['पोस्ट'] काम करना। ActiveRecord थोड़ा नम दिखता है, इसलिए अब आपको हाथ से डेटा दर्ज करना होगा।
अंत में, मैं एक और बाधा के साथ आया - एक अद्वितीय आईडी के साथ डेटाबेस में बचत। इसलिए हमें इसे मैन्युअल रूप से भी करना चाहिए। अगर किसी को यह पता लगाना है कि इसे कैसे हल किया जाए - टिप्पणी छोड़ने के लिए स्वतंत्र महसूस करें।
आइए अद्वितीय प्राथमिक कुंजी कार्य करने के लिए पोस्ट मॉडल को अपडेट करें। फ़ाइल के अंत में बस यह कोड जोड़ें:
public function beforeSave($insert) { if ($this->isNewRecord) { $command = static::getDb()->createCommand("select max(id) as id from posts")->queryAll(); $this->id = $command[0]['id'] + 1; } return parent::beforeSave($insert); }
वह जो भी करता है वह जांचता है कि क्या नया रिकॉर्ड बनाया जा रहा है और यदि ऐसा है, तो वह डेटाबेस से अधिकतम आईडी प्राप्त करता है, इसे बढ़ाता है और इसे आईडी के रूप में उपयोग करता है।
मैंने कई अलग-अलग संयोजनों की कोशिश की (NULL, 0, _ के लिए $ मॉडल-> आईडी, लेकिन किसी कारण से ActiveRecord ने मॉडल को उत्कृष्ट आईडी के साथ रखने से इनकार कर दिया। मुझे नहीं पता कि यह क्यों काम नहीं करता है)।
(
वास्तव में, लेखक बस आईडी फ़ील्ड में AUTO_INCREMENT निर्दिष्ट करना भूल गया था। लेकिन मैंने लापरवाही के एक छोटे सबक के रूप में इस हिस्से को छोड़ने का फैसला किया। नोट अनुवादक। )
हमने इसे समझ लिया, अब एक दृश्य बनाएं।
<?php use yii\helpers\Html; ?> <?php $form = $this->beginWidget('yii\widgets\ActiveForm', array( 'options' => array('class' => 'form-horizontal'), )); ?> <?php echo $form->field($model, 'title')->textInput(array('class' => 'span8')); ?> <?php echo $form->field($model, 'content')->textArea(array('class' => 'span8')); ?> <div class="form-actions"> <?php echo Html::submitButton('Submit', null, null, array('class' => 'btn btn-primary')); ?> </div> <?php $this->endWidget(); ?>
बस इतना ही, अब आप मॉडल को बचा सकते हैं। लेकिन कुछ अजीब है, है ना? उदाहरण के लिए, सृजन और अद्यतन समय 0 क्यों है? अगर हम खाली फॉर्म भेजते हैं तो क्या होगा?
जारी रखने से पहले इन दो त्रुटियों को ठीक करते हैं। पोस्ट मॉडल खोलें और निम्न विधि जोड़ें:
public function rules() { return array( array('title, content', 'required'), ); }
यह विधि शीर्षक और सामग्री फ़ील्ड को अनिवार्य बनाती है। अब जब आप मॉडल को बचाने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी यदि इनमें से एक फ़ील्ड खाली है। और चूंकि हम बूटस्ट्रैप का उपयोग करते हैं, यह देखना बहुत आसान है कि
वास्तव में क्या त्रुटि थी। इसे आजमाइए!
अगला, हमें स्वचालित रूप से सही समय निर्धारित करना चाहिए।
सबसे पहले, हमारे मॉडल के शीर्ष पर एक और
उपयोग लाइन जोड़ें।
use \yii\db\Expression;
दूसरे, हम प्रक्रिया को स्वचालित करने के लिए पहले से विधि को अपडेट करेंगे।
अगर ब्लॉक के अंदर ($ यह-> .न्यूकार्ड) लाइन जोड़ें:
$this->created = new Expression('NOW()');
माता-पिता की वापसी से पहले :: पहले ($ डालें) जोड़ें:
$this->updated = new Expression('NOW()');
नतीजतन, विधि इस तरह दिखनी चाहिए:
public function beforeSave($insert) { if ($this->isNewRecord) { $this->created = new Expression('NOW()'); $command = static::getDb()->createCommand("select max(id) as id from posts")->queryAll(); $this->id = $command[0]['id'] + 1; } $this->updated = new Expression('NOW()'); return parent::beforeSave($insert); }
चलो फिर से बचाने की कोशिश करते हैं। अब मॉडल शीर्षक और सामग्री क्षेत्रों को मान्य करता है, और स्वचालित रूप से निर्माण और अद्यतन समय भी भरता है। चलिए अपडेट पर चलते हैं।
अद्यतन
अपडेट की कार्रवाई निर्माण के लगभग समान होगी। एकमात्र अंतर यह है कि हम उस मॉडल को कैसे परिभाषित करते हैं जिसका हम उपयोग करेंगे।
निर्माण क्रिया में, हमने यह किया:
$model = new Post;
अद्यतन कार्रवाई में, आइए इसे करें:
$model = Post::find($id);
मैं अपवादों को फेंकना पसंद करता हूं जब कुछ नहीं मिलता है, इसलिए मेरी कार्रवाई कुछ त्रुटि जांच करेगी। उन्हें जोड़ने के बाद, कोड कुछ इस तरह दिखना चाहिए:
public function actionUpdate($id=NULL) { if ($id === NULL) throw new HttpException(404, 'Not Found'); $model = Post::find($id); if ($model === NULL) throw new HttpException(404, 'Document Does Not Exist'); if (isset($_POST['Post'])) { $model->title = $_POST['Post']['title']; $model->content = $_POST['Post']['content']; if ($model->save()) Yii::$app->response->redirect(array('site/read', 'id' => $model->id)); } echo $this->render('create', array( 'model' => $model )); }
क्या आपने कुछ दिलचस्प देखा है? हम अभी भी बनाने के लिए दृश्य का उपयोग करते हैं, क्योंकि वे
बिल्कुल समान हैं । कूल, हह?
निष्कर्ष
तो, हमने किया। कुछ ही घंटों में हम Yii2 के पूर्ण अज्ञान से उस पर एक साधारण CRUD आवेदन के लिए चले गए। इस ज्ञान का उपयोग करते हुए, आप आसानी से उपयोगकर्ता समर्थन, प्रमाणीकरण, डेटाबेस में अतिरिक्त तालिकाओं और यहां तक कि बहुत अधिक शक्तिशाली सुविधाओं को जोड़कर अनुप्रयोगों का विस्तार कर सकते हैं।
Yii2 Yii 1.x से
बहुत मिलता-जुलता है, हालाँकि इसमें कई बदलाव हैं जिनका आपको उपयोग करना सीखना चाहिए। चूँकि Yii2 अभी तक बहुत अच्छी तरह से प्रलेखित नहीं है, इसलिए मैंने केवल Github पर स्रोत कोड के आधार पर यह लेख लिखा था। फ्रेमवर्क कोड बहुत अच्छी तरह से प्रलेखित है। और चूंकि विधियां Yii1 से बहुत मिलती-जुलती हैं, इसलिए यह खोजना आसान था कि मुझे क्या चाहिए।
जैसा कि हमने पाया, कुछ और मुद्दे हैं जिन्हें ठीक करने की आवश्यकता है (या तो बेहतर ActiveRecord प्रलेखन के माध्यम से, या जो टूट गया है उसे ठीक करने के माध्यम से)।
संदर्भ
जीथुब स्रोत कोडडेमोस्रोत लेख