2013-08-23 5 views
15

तो मैं v4 के रूप में लैरवेल ढांचे के लिए नया हूं और सोच रहा हूं कि रीस्टफुल कंट्रोलर बनाने और उपयोग करने का तरीका क्या है। प्रलेखन के माध्यम से पढ़ना, मैं थोड़ा कंट्रोलर और संसाधन नियंत्रकों के बीच अंतर के रूप में थोड़ा उलझन में हूँ।लार्वेल 4 रीस्टफुल कंट्रोलर को परिभाषित करता है

जब एक RESTful नियंत्रक को परिभाषित करने, डॉक्स के अनुसार, यह routes.php में निम्नलिखित करने का सुझाव देता:

Route::controller('posts', 'PostController'); 

PostController में, HTTP के साथ विधि का नाम लगाकर द्वारा हम वर्ग के तरीकों को परिभाषित करना क्रिया का उपयोग करना चाहिए? उदाहरण के लिए:

class PostController extends \BaseController { 
    public function getIndex() 
    { 
     // 
    } 
} 

हालांकि, यह भी संसाधन नियंत्रकों तो जैसे routes.php फ़ाइल में बनाने का एक तरीका रूपरेखा: मार्ग :: संसाधन ('पदों', 'PostController');

और PostController.php में हम HTTP क्रिया के साथ इसे उपसर्ग किए बिना विधियों को परिभाषित करते हैं।

class PostController extends \BaseController { 
    public function index() 
    { 
     // 
    } 
} 

दोनों के बीच क्या अंतर है? और हम दूसरे के बजाय एक का उपयोग कब करते हैं, और क्यों?

इसके अलावा, हम Route::controller('posts', 'PostController'); या Route::resource('posts', 'PostController'); का उपयोग करने के लिए नियंत्रक मार्ग पारित करने के लिए करना चाहिए या हम नीचे की तरह मैन्युअल रूप से प्रत्येक मार्ग परिभाषित करना चाहिए,:

Route::get('/users', '[email protected]'); 
Route::get('/users/create', '[email protected]'); 
Route::post('/users', '[email protected]'); 
Route::get('/users/{id}', '[email protected]'); 
Route::get('/users{id}/edit', '[email protected]'); 
Route::put('/users', '[email protected]'); 
Route::delete('/users', '[email protected]'); 
+0

बाद वाले, रूट :: संसाधन, दस्तावेज़ों के अनुसार - जब तक आपको अधिक नियंत्रण की आवश्यकता न हो। :) –

+0

तो 'रूट :: नियंत्रक (' पोस्ट ',' पोस्टकंट्रोलर ') का उपयोग करके;' रीस्टफुल कंट्रोलर बनाने के लिए इस्तेमाल नहीं किया जाना चाहिए? न ही हम नियंत्रक विधियों को उपयुक्त HTTP क्रिया के साथ उपसर्ग करना चाहिए? मुझे एहसास है कि आखिरी सवाल शायद इस प्रारूप के लिए उचित नहीं है क्योंकि यह व्यक्तिपरक है। – Iain

उत्तर

34

उदाहरण के रूप में इस नियंत्रक लें:

<?php 

class TestController extends BaseController { 

    public function getIndex() 
    { 
     echo "a"; 
    } 

    public function postSecond($a) 
    { 
     echo "b"; 
    } 

} 

में आपके मार्ग, यदि आपके पास

Route::controller('tests', 'TestController'); 

और निष्पादन ई

php artisan routes 

आप होगा:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| Domain | URI          | Name     | Action       | Before Filters | After Filters | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
|  | GET /tests/index/{v1}/{v2}/{v3}/{v4}/{v5} |      | [email protected]   |    |    | 
|  | GET /tests         |      | [email protected]   |    |    | 
|  | POST /tests        | tests.store   | [email protected]    |    |    | 
|  | GET /tests/{_missing}      |      | [email protected]  |    |    | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 

Laravel नियंत्रक निरीक्षण करता है और क्या तरीकों यह पाता है के आधार पर मार्गों उत्पन्न करता है, स्वचालित रूप से।

लेकिन अगर आप ऐसा करेंगे

Route::resource('tests', 'TestController'); 

आप इस मार्ग सूची मिल जाएगा:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| Domain | URI          | Name     | Action       | Before Filters | After Filters | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
|  | GET /tests         |      | Closure       |    |    | 
|  | GET /tests         | tests.index   | [email protected]    |    |    | 
|  | GET /tests/create       | tests.create   | [email protected]    |    |    | 
|  | POST /tests        | tests.store   | [email protected]    |    |    | 
|  | GET /tests/{tests}       | tests.show    | [email protected]    |    |    | 
|  | GET /tests/{tests}/edit     | tests.edit    | [email protected]    |    |    | 
|  | PUT /tests/{tests}       | tests.update   | [email protected]    |    |    | 
|  | PATCH /tests/{tests}      |      | [email protected]    |    |    | 
|  | DELETE /tests/{tests}      | tests.destroy   | [email protected]   |    |    | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 

कोई अनुमान लगा, Laravel मार्गों में से एक पूर्वनिर्धारित CRUD सूची का उपयोग करता है, तो आप उन मार्गों में से कुछ को हटा सकते हैं, लेकिन यह आपके विधियों के लिए मार्ग बनाने के लिए आपके नियंत्रक का निरीक्षण नहीं करेगा।

आप तय करते हैं कि आपके लिए सबसे अच्छा क्या है। लेकिन, आमतौर पर, यदि आपका नियंत्रक एक CRUD है, तो रूट :: संसाधन() एक अच्छी शुरुआत है, अन्यथा आप रूट :: नियंत्रक() का उपयोग कर सकते हैं या अपने मार्ग मैन्युअल रूप से बना सकते हैं।

संपादित करें:

कोई वास्तव में क्यों एक या क्यों एक और, डिजाइन और पसंद का सिर्फ एक मामला है। कुछ कभी भी उनमें से किसी का भी उपयोग नहीं करेंगे। यह सिर्फ टोपी Route::resource() मार्ग के मार्ग के मार्ग का अनुसरण करता है: http://guides.rubyonrails.org/routing.html

Route::resource() का उपयोग करके आप, क्योंकि Laravel हमेशा डिफ़ॉल्ट रूप से उन सभी को बनाने के लिए, जब तक आप करते हैं ये सभी पद्धतियां बनाने की जरूरत नहीं है, लेकिन आप व्यर्थ रूट की एक सूची के साथ समाप्त कर देंगे:

Route::resource('photo', 'PhotoController', 
       array('only' => array('index', 'show'))); 

और मार्गों की आपकी सूची केवल अनुक्रमणिका दिखाएगी और कार्यों को दिखाएगी।

इसके अलावा, अगर आपको Route::resource() का उपयोग करके कुछ अन्य मार्गों की आवश्यकता है, तो आपको उन्हें अपने सभी संसाधनों के लिए स्वचालित बनाने के लिए मैन्युअल रूप से बनाना होगा या कुछ जादू करना होगा। Route::controller() का उपयोग करना सब कुछ स्वचालित है, हर बार जब आप एक नई विधि जोड़ते हैं, तो आपके लिए एक नया मार्ग बनाया जाता है।

फिर, अगर आप का निर्माण करने के लिए एक CRUD नियंत्रक है, Route::resource() का उपयोग करके शुरू करते हैं। अन्यथा, अपने विशेष मामले में एक या दूसरे के लाभों के बारे में सोचें।

EDIT2:

यह एक बढ़िया लेख, फिल Sturgeon (PyroCMS और PHP-अंजीर) से है, मैन्युअल रूप से अपने सभी मार्गों का निर्माण के लाभों के बारे: http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil

+0

मुझे यकीन नहीं है कि मैं आपका जवाब समझता हूं। मैं रूट :: संसाधन' के बजाय 'रूट :: नियंत्रक' का उपयोग क्यों करूं यदि वे दोनों एक ही चीज़ प्राप्त करते हैं? 'रूट :: कंट्रोलर 'एक विश्वसनीय नियंत्रक स्थापित करने के लिए एक और अधिक जटिल प्रक्रिया की तरह प्रतीत होता है क्योंकि इसे HTTP क्रिया के साथ नियंत्रक विधियों को तोड़ने और उपसर्ग करने की आवश्यकता होती है। 'मार्ग :: संसाधन' पर इसका उपयोग करने का कोई कारण है? यदि मैं 'रूट :: संसाधन' का उपयोग करता हूं तो मुझे इंडेक्स, निर्माण, स्टोर, शो, एडिट, अपडेट और नष्ट करने के लिए नियंत्रक विधियां नहीं हैं? इसमें विधियों को जोड़ने या हटाने से उपलब्ध मार्गों में प्रतिबिंबित होगा? – Iain

+0

बस स्पष्ट करने के लिए संपादित किया गया। –

+3

एक और संपादन, बस एक लेख के लिए एक लिंक जोड़ने के लिए। –

5

@ एंटोनियो का जवाब अच्छा है। मुझे थोड़ा और संक्षेप में कुछ समान और महत्वपूर्ण कहने दो। routes.php में:

Route::resource('users', 'UserController'); 

संसाधन पद्धति का उपयोग करना Laravel CRUD कार्यक्षमता मान बनाता है और यह केवल अपने छह, पूर्व निर्मित CRUD तरीकों के लिए लग रहा है: सूचकांक, शो आदि बनाने की दुकान, को नष्ट, यह जीत लिया ' आप वहां कोई अन्य, नई विधियां बनाते हैं "देखें"।

Route::controller('info', 'InfoController'); 

नियंत्रक विधि का उपयोग करके आप कस्टम विधियों/पृष्ठों को बनाने की अनुमति देते हैं। जब आप HTTP क्रिया के साथ विधि/पृष्ठ नाम प्रीपेड करते हैं तो लैरावेल उनके लिए खोजता है। आपके XxxxController.php में:

class InfoController extends \BaseController { 

    public function getFeatures() 
    { 
     return View::make('info.features'); 
    } 

    public function getContactUs() 
    { 
     return View::make('info.contact-us'); 
    } 

    public function getPricing() 
    { 
     return View::make('info.pricing'); 
    } 

} 
+0

कम शब्दों में बहुत स्पष्ट – Yash

संबंधित मुद्दे