cakephp
CakePHP3 कोडिंग टिप्स
खोज…
नया नियंत्रक बनाना
namespace App\Controller;
class PostsController extends AppController {
public function initialize(){
parent::initialize();
// code that you want to run before every action
}
public function view($id) {
//Your code here
}
}
नियंत्रक में पहले जोड़ें () विधि
नियंत्रक में किसी भी अन्य विधि को निष्पादित करने से पहले पहलेफिल्टर () विधि निष्पादित होती है।
अपनी नियंत्रक फ़ाइल में कक्षा को परिभाषित करने से पहले इवेंट नेमस्पेस का उपयोग करें।
use Cake\Event\Event;
अपने नियंत्रक में, पहले दिखाए गए तरीके () विधि को नीचे दिखाए अनुसार जोड़ें।
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
या, आप initialize() विधि का उपयोग कर सकते हैं।
public function initialize(){
parent::initialize();
}
देखने के लिए चर पासिंग
एक बार में देखने के लिए प्रत्येक चर को पास करें
$this->set('color', 'pink');
$this->set('color', $color);
कॉम्पैक्ट () फ़ंक्शन के माध्यम से एक साथ देखने के लिए कई चर पास करें
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
$ _POST के बराबर पोस्ट डेटा पुनर्प्राप्त कर रहा है
आप Array के रूप में पोस्ट डेटा पुनः प्राप्त कर सकते हैं।
$post_data= $this->request->data;
आप विशेष कुंजी के लिए पोस्ट डेटा पुनः प्राप्त कर सकते हैं।
$this->request->data['field'];
विशिष्ट कुंजी मान प्राप्त करें
$this->request->data('key_name');
नेस्टेड सरणी के विशिष्ट कुंजी मान को पुनः प्राप्त करें
$this->request->data('data.subfield');
सरणी संकेतन और data() विधि के बीच का अंतर यह है कि data() त्रुटि data() त्रुटि सुरक्षित है और कुंजी में सरणी में मौजूद नहीं होने पर null हो जाता है
ऐसा करने का इरादा है
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
तुम कर सकते हो
if($this->request->data('field')) { ...}
CakePHP के लिए 3.4.x +
सभी डेटा प्राप्त करें:
$this->request->getData();
विशिष्ट कुंजी प्राप्त करें:
$this->request->getData('key');
GetData फ़ंक्शन के लिए उपलब्ध डेटा सेट करने के लिए आपको कुछ करना होगा:
$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');
स्थिर डेटा के साथ नियंत्रक में मॉडल को अपडेट करने के लिए उपयोगी है
एक और मॉडल को नियंत्रक में लोड करें
डिफ़ॉल्ट रूप से CakePHP नियंत्रक में संबंधित मॉडल को लोड करता है। नियंत्रक में किसी अन्य मॉडल को लोड करने के लिए, लोडमॉडल () विधि का उपयोग करें:
$this->loadModel('Articles');
या मक्खी पर लोड
$table = TableRegistry::get('Articles');
$table->find();
नियंत्रक से दूसरे पृष्ठ पर पुनर्निर्देशित करना
अनुप्रयोग के भीतर पुनर्निर्देशित (विशिष्ट नियंत्रक की एक और कार्रवाई)।
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
संदर्भ पृष्ठ पर पुनर्निर्देशित करें
return $this->redirect($this->referer());
एप्लिकेशन या विशिष्ट URL के बाहर पुनर्निर्देशित करें
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
रीडायरेक्ट के साथ URL से एक्शन के लिए वैरिएबल पास करना
एक विधि के पैरामीटर के रूप में URL में वैरिएबल पास करना
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
यूआरएल इस तरह दिखना चाहिए http: // your_app_url / users / profile / {id}
प्रोफ़ाइल () विधि में UsersController.php फ़ाइल
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
URL में क्वेरी स्ट्रिंग के रूप में परिवर्तनशील चर
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
यूआरएल इस तरह दिखना चाहिए http: // your_app_url / users / profile /? Id = {id}
प्रोफ़ाइल () विधि में UsersController.php फ़ाइल
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
एप्लिकेशन का लेआउट सेट या बदलें
संपूर्ण एप्लिकेशन के लिए डिफ़ॉल्ट लेआउट सेट करें। अर्थात, /src/Template/Layout/admin.ctp में लेआउट फ़ाइल बनाई गई
class AppsController extends Controller {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->viewBuilder()->layout('admin'); // For Version >= 3.1 or
$this->layout = 'admin'; // for version < 3.1
// your other code should be here
}
}
एप्लिकेशन में विशिष्ट कार्रवाई के लिए डिफ़ॉल्ट लेआउट सेट करें। यानी, आवेदन में लॉगिन पृष्ठ में /src/Template/Layout/login.ctp में अलग लेआउट है
class UsersController extends Controller {
public function login() {
$this->viewBuilder()->layout('login'); // For Version >= 3.1 or
$this->layout = 'login'; // for version < 3.1
//your other code should be here
}
}
विशिष्ट नियंत्रक के लिए लेआउट बदलें। यानी, आपको विशिष्ट नियंत्रक की सभी विधि के लिए अलग-अलग लेआउट की आवश्यकता है
वर्ग उपयोक्ता नियंत्रण नियंत्रक का विस्तार
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->viewBuilder()->layout('user_layout'); // For Version >= 3.1 or
$this->layout = 'user_layout'; // for version < 3.1
//your other code should be here
}
}
अजाक्स अनुरोध लेआउट सेट करें
आम तौर पर AJAX में लोड CSS, JS की कोई आवश्यकता नहीं होती है। अन्य HTML कोड को भी छोड़ देना।
/ Src / टेम्पलेट / लेआउट में ajax.ctp फ़ाइल बनाएं, और कोड होना चाहिए
<?php
$this->fetch('content');
AppsController.php में पूरे आवेदन के लिए AJAX आधारित लेआउट सेट करें
वर्ग AppsController नियंत्रक {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
if($this->request->isAjax())
{
$this->viewBuilder()->layout('ajax'); // For Version >= 3.1 or
$this->layout = 'ajax'; // for version < 3.1
}
else
{
$this->viewBuilder()->layout('admin'); // For Version >= 3.1 or
$this->layout = 'admin'; // for version < 3.1
}
// your other code should be here
}
}
CakePHP में लोड अवयव
हम घटकों को दो तरीकों से लोड कर सकते हैं।
- नियंत्रक में $ घटकों की संपत्ति को इनिशियलाइज़ या ओवरराइड करके
- प्रारंभक () विधि नियंत्रक में loadComponent () पद्धति का उपयोग करके।
Way-1 इसे AppsController.php लोडिंग घटक को एक या अधिक घटक से ओवरराइड किया जाना चाहिए
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Way-2 इस तरह का उपयोग करें जब आपको विशिष्ट नियंत्रक के लिए गतिशील रूप से लोड घटक की आवश्यकता होती है। एक घटक लोड करें
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
Initilaize () विधि क्या है?
initialize () CakePHP संस्करण> 3.0 में पेश किया गया है
एक कोड संरचना के रूप में, यह पहले की तरह ही लग रहा हैफिल्टर () विधि। लेकिन इससे पहले फ़िल्टर () और इनिशियलाइज़ () के बीच कई अंतर हैं।
- आरंभीकरण () को हमेशा कंस्ट्रक्टर कहा जाता है के बाद कहा जाता है। लेकिन इससे पहले कि फ़िल्टर () एक्शन विधि के मामले में कॉल नहीं कर रहा है जो विशेष नियंत्रक में नहीं मिला है।
- आरंभिक () विधि का उपयोग आम तौर पर नए घटकों और सहायकों को जोड़ने जैसी किसी चीज़ को आरंभ करने के लिए किया जाता है। लेकिन इससे पहले किफिल्टर () का इस्तेमाल आमतौर पर कुछ वैश्विक लॉजिक पार्ट को निष्पादित करने के लिए किया जाता है।
$ _GET के बराबर क्वेरी स्ट्रिंग डेटा पुनर्प्राप्त करें
आप ऐरे के रूप में क्वेरी स्ट्रिंग डेटा पुनः प्राप्त कर सकते हैं।
$post_data= $this->request->query;
आप विशेष कुंजी के लिए पोस्ट डेटा पुनः प्राप्त कर सकते हैं।
$this->request->query['field'];
विशिष्ट कुंजी मान प्राप्त करें
$this->request->query('key_name');
नेस्टेड सरणी के विशिष्ट कुंजी मान को पुनः प्राप्त करें
$this->request->query('data.subfield');
तालिका (मॉडल) कक्षा बनाना
User Model Class कैसे बनाये
namespace App\Model\Table;
use Cake\ORM\Table;
class UsersTable extends Table {
public function initialize(array $config) {
$this->table('users'); //define table name
$this->displayField('username'); // unique or other special field of users table
$this->primaryKey('id'); // primary key of users table
$this->tablePrefix('prefix_'); // if prefix set tablename should be prefix_users
// your other code here
}
// your other methods here
}
CakePHP में मॉडल एसोसिएशन
4 प्रकार के संघों (रिश्ते) हैं जिन्हें हम CakePHP में परिभाषित कर सकते हैं
class PostsTable extends Table {
public function initialize(array $config) {
// table initialization code should be here
$this->belongsTo('Authors', [
'className' => 'Authors',
'foreignKey' => 'author_id',
'joinType' => 'INNER',
]);
$this->hasMany('Tags');
$this->hasOne('Categories');
$this->hasAndBelongsToMany('Topics');
}
}
उपरोक्त उदाहरण में, आप 4 प्रकार के संबंधों को देख सकते हैं
पोस्ट लेखक (एक करने के लिए एक) के अंतर्गत आता है, उस में इसका मतलब है posts तालिका एक विदेशी कुंजी है author_id जो साथ जुड़ा हुआ है id के authors की मेज।
पोस्ट में कई टैग (एक से कई) हैं , इसका मतलब है कि tags तालिका में एक विदेशी कुंजी post_id जो posts टेबल की id से संबंधित है।
पोस्ट एक टैग (एक या एक से एक करने के लिए कई) है, यह में इसका मतलब है posts तालिका एक विदेशी कुंजी है category_id जो साथ जुड़ा हुआ है id की categories तालिका।
पोस्ट में विषय (कई से कई) हैं , यह posts और topics तालिका के बीच कई संबंध हैं। कई संबंधों को बनाए रखने के लिए तीसरी तालिका बनाने की आवश्यकता होनी चाहिए, तालिका का नाम posts_categories होना चाहिए। इस तालिका के क्षेत्र नीचे दिए गए हैं
- आईडी (तालिका की प्राथमिक कुंजी)
- post_id (
postsटेबल की विदेशी कुंजी) - topic_id (
topicsतालिका की विदेशी कुंजी)