Membangun aplikasi Web dari awal dengan Laravel ( Part II )

Oke seperti yang saya bilang di artikel sebelumnya bahwa tutorial membuat web dari awal dengan Laravel akan kita buat ber part ..

Oke di part II kali ini kita lanjutkan sedikit tentang Mengatur Routing pada Laravel.


Laravel Website


Ada banyak lagi yang bisa kita lakukan dengan Routes di Laravel sehingga bisa berdiri sendiri sebagai tutorialnya sendiri. Hal-hal seperti:

  • HTTP Verbs - Laravel memberi kita kemampuan untuk membuat rute, berdasarkan HTTP Verbs yang digunakan dalam request. Sebagai contoh, kita dapat meminta GET ke rute / home pergi ke suatu tempat yang berbeda dari tempat request POST pergi.
  • Wildcards - ini memungkinkan kita merutekan URL dengan nilai wildcard yang melekat padanya (mis. / user / (: num) di mana (: num) adalah ID pengguna)
  • Filters - ini memungkinkan kita menjalankan beberapa fungsi sebelum atau setelah rute dieksekusi, tergantung pada rute yang dipanggil. Sebagai contoh, kita dapat membuat filter auth yang akan dipanggil sebelum semua rute, kecuali home dan tentang rute. Dalam CodeIgniter, ini mirip dengan Hooks, tetapi jauh lebih mudah untuk diterapkan, karena fakta bahwa filter didasarkan pada rute - sehingga kita dapat menerapkannya untuk semua request atau hanya beberapa.
Untuk keperluan aplikasi web ini, kita hanya perlu beberapa rute. Pertama, rute yang memetakan semua permintaan ke pengontrol secara default. Buka file route.php, dan beri komentar rute default ke Home controller:

 /*  
 Route::get('/', function()  
 {  
   return View::make('home.index');  
 });  
 */  

Berikut ini sedikit kode, tambahkan baris berikut:

 Route::controller(Controller::detect());  

Baris ini akan memetakan semua permintaan kita ke semua controllers. Jika controller atau tindakan tidak ada, sistem akan mengembalikan respons 404.

Sekarang, kita membuat rute untuk http://instapics.com/about. Secara teknis, kita bisa membuat about controller, tapi itu akan sia-sia, karena kita bisa memasukkannya ke dalam HOME controller. Tambahkan baris berikut setelah rute yang baru saja kita buat:

 Route::controller(Controller::detect());  
 Route::get('about', 'home@about');  

Rute ini akan mengarahkan semua permintaan ke http://instapics.com/about ke Home Controller, dan about Action.

oke setelah selesai dengan Setup Routing, mari kita lanjutkan ke tutorial berikutnya

Controllers
Mengontrol siapa saja?
 
Controllers di Laravel ditemukan di dalam folder application/controller. Secara default, Home Controller akan menerima permintaan yang dikirim ke root aplikasi Laravel. Sebagai contoh, pergi ke http://instapics.com/ akan pergi ke metode Home-> action_index ().

Untuk membuat controller, cukup buat file di dalam folder application/controller. Dengan konvensi, kita ingin memberi nama file tersebut sesuatu yang deskriptif yang juga akan menjadi nama kelas controller. Untuk saat ini, mari kita buat controller baru untuk mekanisme login kita, yang disebut "Login":

 class Login_Controller extends Base_Controller  
 {    
   public function action_index()  
   {  
     //do our login mechanisms here  
     echo 'test'; //echo test so we can test this controller out  
   }  
 }  

Selanjutnya, buka browser Anda dan kunjungi http://instapics.com/login. Dari sini, Anda akan melihat pesan debug "test" yang kita tempatkan. Karena, dalam file routes.php, kami mengaturnya untuk mengaktifkan rute ke semua controller, ini seharusnya bekerja tanpa konfigurasi tambahan. Setelah Anda mengkonfirmasi bahwa itu berfungsi, hapus saja pesan debug. Kita akan kembali ke controller ini di artikel berikutnya

Untuk saat ini, ucapkan selamat kepada diri sendiri; Anda baru saja membuat Laravel Controller pertama Anda!.

Controller Lebih Menyenangkan

Filter


Ada banyak lagi yang bisa kita lakukan dengan controller, daripada hanya menjadi gateway untuk melihat file. Misalnya, ingat fitur Filter yang saya sebutkan sebelumnya di bagian rute? Selain dilampirkan ke Rute tertentu, kita juga dapat melampirkannya ke controllers tertentu! Cukup buat metode __constructor untuk controller, dan setup filter di sana. Misalnya, jika kita perlu memastikan bahwa pengguna diautentikasi untuk semua metode di controller, kita dapat menggunakan contoh filter auth:

 public function __construct() {  
   $this->filter('before', 'auth');  
 }  

Ini akan memanggil filter auth pada semua tindakan di controller ini. Jika kita ingin menargetkan beberapa tindakan tertentu, kita dapat merujuk ke satu-satunya metode, seperti:

 public function __construct() {  
   $this->filter('before', 'filter_name')->only(array('action', 'actionagain'));  
 }  

Kami juga dapat menggunakan metode except untuk menerapkan filter pada semua tindakan, kecuali beberapa:

 public function __construct() {  
   $this->filter('before', 'filter_name')->except(array('action', 'actionagain'));  
 }  

Perhatikan seberapa ekspresif kode ini?

Kami bahkan dapat menargetkan HTTP Verb tertentu:

 public function __construct() {  
   $this->filter('before', 'filter_name')->except(array('action', 'actionagain'))->on('post');  
 }  

Base_Controller

Sebagian besar, jika tidak semua, pengontrol memperluas Base_Controller. Ini memberi kita cara untuk mendefinisikan metode yang akan sama untuk semua controllers kita. Sebagai contoh, jika kita perlu membuat metode logging untuk mencatat setiap controller request:

 class Base_Controller extends Controller {  
   /**  
    * Catch-all method for requests that can't be matched.  
    *  
    * @param string  $method  
    * @param array   $parameters  
    * @return Response  
    */  
   public function __call($method, $parameters)  
   {  
     return Response::error('404');  
   }  
   public function logRequest()  
   {  
     $route = Request::route();  
     Log::log('request', "Controller: {$route->controller} / Action: {$route->controller_action} called at ". date('Y-m-d H:i:s'));  
   }  
 }  

Kapan saja kita ingin mencatat (log) sebuah request, kita bisa memanggil $ this-> logRequest (); dalam controller apa pun.

RESTful Controllers

Laravel's RESTful Controllers memudahkan untuk menambahkan respons RESTful ke Laravel controller mana pun. Ini membuatnya mudah untuk membuat, misalnya, RESTful API. Untuk melakukannya, cukup tambahkan flag $ restful ke controller Anda:

 class Api_Controller extends Base_Controller  
 {  
   public $restful = true;  
   public function post_authenticate()  
   {  
     //all POST requests to /api/authenticate will go here  
     //any other requests that are NOT POST will NOT go here.  
   }  
   public function get_user()  
   {  
     $user_id = Input::get('id');  
     //get the USER based on $user_id and return it for whoever requested it  
   }  
   public function post_user()  
   {  
     $email = Input::get('email');  
     $password = Input::get('password');  
     //Create a new User  
     $user = User::create($email, $password);  
   }  
 }  

Kita akan membahas semua fitur keren ini di tutorial selanjutnya, tetapi, untuk sekarang, mari perbarui Home Controller. Kita perlu menambahkan metode action_about, karena kita membuat rute http://instapics.com/about untuk mengarahkan ke metode ini. Buka application / controller / home.php, dan perbarui, seperti:

Kita menambahkan action_ ke semua action methods di controller kita (mis. Action_about). Ini memberi sinyal kepada Laravel bahwa action ini dapat dilihat di situs web. Metode lain apa pun, yang tidak memiliki awalan action_, tidak akan dapat diakses publik.

 class Home_Controller extends Base_Controller {  
   public function action_index()  
   {  
     return View::make('home.index');  
   }  
   public function action_about()  
   {  
     return View::make('home.about');  
   }  
 }  

Laravel mendukung dua cara untuk menghasilkan pandangan untuk aplikasi:
  • PHP-based Views - ini adalah pandangan yang menggunakan PHP sebagai bahasa templating.
  • Blade-based Views - ini adalah pandangan yang memanfaatkan mesin templating bawaan Laravel, yang disebut Blade.
 Blade Templating Engine adalah kerangka kerja templating yang, mirip dengan cara kerja Smarty Templating Engine, memanfaatkan tag dan fungsi yang disesuaikan untuk memungkinkan pemisahan logika presentasi dan kode aplikasi yang lebih baik.

Demi kesederhanaan, kita akan menggunakan Blade Templating Engine, sebagai lawan dari tampilan berbasis PHP.

Semua file tampilan yang akan menggunakan Blade Templating Engine perlu memiliki ekstensi .blade.php. Ini memberitahu Laravel untuk menggunakan mesin pada file tampilan.

Pertama, mari kita buat tata letak tujuan umum yang akan kita gunakan untuk semua tampilan kita. Buat folder application/ views / layout, dan di dalamnya, buat file, bernama main.blade.php:

 <!DOCTYPE html>  
 <html lang="en">  
   <head>  
     <meta charset="utf-8">  
     <title>Instapics</title>  
     {{ Asset::styles() }}  
     {{ Asset::scripts() }}  
   </head>  
   <body>  
     <div class="navbar navbar-fixed-top">  
       <div class="navbar-inner">  
         <div class="container">  
           <a class="brand" href="home">Instapics</a>  
           <div class="nav-collapse">  
             <ul class="nav">  
               @section('navigation')  
               <li class="active"><a href="home">Home</a></li>  
               @yield_section  
             </ul>  
           </div><!--/.nav-collapse -->  
         </div>  
       </div>  
     </div>  
     <div class="container">  
       @yield('content')  
       <hr>  
       <footer>  
       <p>&copy; Mata Panda Crew 2019</p>  
       </footer>  
     </div> <!-- /container -->  
   </body>  
 </html>  

Sekarang kita memiliki tata letak utama, mari perbarui file indeks. Buka application/views/home/index.blade.php dan perbarui:

 @layout('layouts/main')  
 @section('navigation')  
 @parent  
 <li><a href="/about">About</a></li>  
 @endsection  
 @section('content')  
 <div class="hero-unit">  
   <div class="row">  
     <div class="span6">  
       <h1>Welcome to Instapics!</h1>  
       <p>Instapics is a fun way to share photos with family and friends.</p>  
       <p>Wow them with your photo-filtering abilities!</p>  
       <p>Let them see what a great photographer you are!</p>  
       <p><a href="about" class="btn btn-primary btn-large">Learn more &raquo;</a></p>  
     </div>  
     <div class="span4">  
       <img src="http://nettuts.s3.amazonaws.com/2064_laravel/img/phones.png" alt="Instapics!" />  
     </div>  
   </div>  
 </div>  
 <!-- Example row of columns -->  
 <div class="row">  
   <div class="span3">  
     &nbsp;  
   </div>  
   <div class="span4">  
     <a href="#"><img src="http://nettuts.s3.amazonaws.com/2064_laravel/img/badge_ios.png" alt="Get it on iOS" /></a>  
   </div>  
   <div class="span4">  
     <a href="#"><img src="http://nettuts.s3.amazonaws.com/2064_laravel/img/badge_android.png" alt="Get it on Android" /></a>  
   </div>  
 </div>  
 @endsection  

NB : Untuk file gambar, jika mendapatkan tampilan access denide, silahkan cari gambar lain :)

Mari kita tinjau file tampilan kita. Dalam templat tata letak utama, kita menggunakan tiga fungsi:

  • The Assets manager (Assets::styles(), Assets::scripts())
  • The @section Blade function (with @yield_section)
  • And the @yield Blade function
Mengelola Aset

Laravel menyediakan cara yang kuat untuk memuat file CSS dan JS, melalui fungsionalitas manajemen Asetnya. Sintaks untuk menambahkan aset adalah  Assets::add('[asset name]', '[relative url from the public folder'], '[name of dependency, array of dependencies if multiple]'). Manajer Aset juga menyediakan dukungan untuk dependensi aset, yang digunakan untuk memberi tahu Laravel untuk memuat dependensi terlebih dahulu, sebelum memuat aset.

Kami harus mendaftarkan aset kami agar file tampilan dapat menggunakannya. Buka application/controllers/base.php, dan tambahkan kode berikut:

 public function __construct()  
 {  
   //Assets  
   Asset::add('jquery', 'js/jquery-1.7.2.min.js');  
   Asset::add('bootstrap-js', 'js/bootstrap.min.js');  
   Asset::add('bootstrap-css', 'css/bootstrap.min.css');  
   Asset::add('bootstrap-css-responsive', 'css/bootstrap-responsive.min.css', 'bootstrap-css');  
   Asset::add('style', 'css/style.css');  
   parent::__construct();  
 }  

Dengan melakukan ini, kami membuatnya lebih mudah untuk menambah, menghapus, atau memperbarui aset apa pun yang kami butuhkan. Kami memasukkannya ke dalam metode __construct() controller basis untuk menambahkan aset ke semua pengontrol kami. Untuk memanfaatkan ini dalam tampilan, kami cukup memanggil Assets::styles() untuk file CSS, dan Assets::scripts() untuk file JS dalam file tampilan apa pun. Laravel secara otomatis menentukan jenis aset apa, berdasarkan ekstensi file, dan memuatnya dengan grup aset yang sesuai.

Bagian ini mari kita inject konten ke tata letak utama dari dalam tampilan. Untuk menentukan bagian mana dari tata letak utama kami yang merupakan bagian, kita mengelilinginya dengan tag blade @section dan @yield_section.

Di file tampilan utama kita, kita telah menandai item navigasi sebagai bagian @section (called navigation). Melihat sekarang pada file tampilan indeks, kita menambahkan tautan navigasi <>About> ke bilah navigasi dengan kode berikut:

 @section('navigation')  
 @parent  
 <li><a href="about">About</a></li>  
 @endsection  

Dengan memanggil fungsi @parent, kita menginstruksikan file tampilan untuk mewarisi konten bagian asli dari tata letak utama. Jika kita menghapus fungsi @parent, seperti:

 @section('navigation')  
 <li><a href="/about">About</a></li>  
 @endsection  

Sekarang, bagian navigasi file tampilan indeks akan menggantikan navigasi tata letak utama sepenuhnya. Ini membuat proses mengubah tata letak HTML menjadi lebih fleksibel.

Fungsi @yield mirip dengan fungsi @section/@yield_section, namun, sebaliknya, membiarkan tampilan bersarang mengisi konten sepenuhnya. Dalam file indeks kami, kami memiliki fungsi @section('content') yang menggantikan @yield('content').

Sekarang, mari kita coba parsing beberapa variabel ke tampilan kita. Pertama, buat file tampilan baru di folder application/views/home untuk halaman Tentang. Sebut saja about.blade.php:

 @layout('layouts/main')  
 @section('navigation')  
 @parent  
 <li><a href="about">About</a></li>  
 @endsection  
 @section('content')  
 <div class="row">  
   <div class="span3">  
     <div class="well sidebar-nav">  
       <ul class="nav nav-list">  
         <li class="nav-header">Navigation</li>  
         @foreach ($sidenav as $sn)  
         <li @if ($sn['active']) class="active" @endif>  
           <a href="{{ $sn['url'] }}">{{ $sn['name'] }}</a>  
         </li>  
         @endforeach  
       </ul>  
     </div>  
   </div>  
   <div class="span9">  
     <h1>About Instapics</h1>  
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent ullamcorper lectus et sapien volutpat iaculis. Phasellus arcu justo, commodo ac ornare at, pellentesque vitae nulla. Sed id justo mauris, et semper est. Mauris id dui vitae felis hendrerit sollicitudin ut vel nisi. Phasellus a dolor quis tellus sagittis commodo. Suspendisse potenti. Donec sagittis rhoncus sem in venenatis. Nam sit amet leo metus. Mauris eget nisi eu felis interdum venenatis nec sed ipsum. Integer lobortis, risus non pellentesque pharetra, massa augue vulputate sem, quis sagittis arcu tortor sit amet nisi. Ut quis nibh sem. Morbi malesuada, lorem ac tincidunt venenatis, quam erat rhoncus sapien, et tempus quam mauris sit amet metus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam varius dictum lectus non placerat.</p>  
     <p>Cras tincidunt, libero eu dignissim egestas, erat purus mattis urna, vitae pellentesque nisi turpis at velit. Vivamus vitae euismod nisi. Duis luctus ante nec neque fermentum vulputate. Phasellus in dolor quis mauris rhoncus consectetur ut quis lacus. Nulla facilisi. Nullam magna velit, accumsan vehicula consectetur a, vestibulum eget neque. Sed feugiat dui quis ligula convallis sed placerat dui dignissim. Aliquam interdum tempus leo, a hendrerit orci ultrices ut. Aliquam sem dolor, auctor eu mattis id, varius a massa. Fusce facilisis, massa id ultricies lacinia, urna nunc sollicitudin massa, sit amet posuere metus justo vitae metus. Vivamus in dolor quam, ut elementum libero. Proin vehicula diam eu diam consectetur ut imperdiet ipsum pulvinar. Cras eu est quis urna semper adipiscing ut et leo. Curabitur tristique consectetur aliquet. Phasellus quam neque, dapibus non eleifend quis, feugiat vel elit.</p>  
   </div>  
 </div>  
 @endsection  

Kembali ke Home controller, perbarui metode action_about():

 public function action_about()  
 {  
   return View::make('home.about', array(  
     'sidenav' => array(  
       array(  
         'url' => 'home',  
         'name' => 'Home',  
         'active' => false  
       ),  
       array(  
         'url' => 'about',  
         'name' => 'About',  
         'active' => true  
       )  
     )  
   ));  
 }  

Meninjau kode kita, kita melihat bahwa, di Home Controller, kita mengirimkan array parameter. Saat ini, ini adalah nilai yang dikodekan, tetapi dapat berasal dari mana saja - misalnya, dari model atau database. Ini diteruskan ke file tampilan, tempat kita menggunakan beberapa tag Blade untuk merender parameter.

 @foreach ($sidenav as $sn)  
 ...  
 @endforeach  

Ini memungkinkan kita mengulang array di parameter kita.

 <li @if ($sn['active']) class="active" @endif>  

Ini adalah if-statement. Jika kita ingin menggunakan yang lain, akan terlihat seperti ini:

 @if ($sn['active'])  
   class="active"  
 @else  
   class="notactive"  
 @endif  

 <a href="{{ $sn['url'] }}">{{ $sn['name'] }}</a>  

Ini adalah tag Blade paling dasar - ini hanya menggaungkan variabel yang kita atur.

Perhatikan bahwa, di sebagian besar tag Blade, kami menggunakan PHP yang baik. Ini membuatnya lebih mudah untuk menulis tag Blade, karena kita akan dapat menggunakan fungsi PHP asli, seperti isset() atau count(). Ada juga tag Blade lain yang tidak dapat saya gunakan di sini; Anda dapat mempelajari lebih lanjut tentang mereka di dokumentasi Blade. Percayalah, ini sangat mudah!

Laravel benar-benar merupakan framework yang luar biasa. Ini cepat, sederhana, elegan dan sangat mudah digunakan. Ini benar-benar pantas dipertimbangkan sebagai framework yang akan digunakan untuk project Anda berikutnya.

Terima Kasih ..

selamat berjumpa di tutorial selanjutnya :)