Indonesian (Bahasa Indonesia) translation by Ari Gustiawan (you can also view the original English article)
Dalam Nettuts + Mini Seri ini, kita akan membangun aplikasi web dari awal, sambil menyelam ke PHP framework baru besar yang cepat mengambil Uap, disebut Laravel.
Pada pelajaran ini kita akan belajar tentang beberapa fitur Laravel sangat berguna: filter, dan validasi dan file Perpustakaan.
Tinjauan
Selamat datang kembali ke aplikasi Web kami dari awal dengan seri Laravel! Dalam seri kedua tutorial dari Mini Seri kami, kami belajar banyak tentang Laravel's ORM implementasi:
- Beberapa latar belakang pada "Model"
- Apakah itu Eloquent ORM
- Cara men-setup konfigurasi database Laravel's
- Cara membuat Laravel Model yang pertama Anda
- Fungsi dasar dari perpustakaan Auth dan Input
- Membuat penggunaan ORM Eloquent dalam view
Jika Anda belum melihat itu belum, saya mendorong Anda untuk memeriksa bagian pertama dan kedua dari Mini Seri — itu akan membuatnya secara signifikan lebih mudah untuk mengikuti bersama, seperti yang kita membangun aplikasi tes, Instapics, melalui setiap bagian.
Jadi mari kita mulai!
1 - Laravel Filter
Singkatnya, filter adalah fungsi yang dapat kita jalankan pada rute before
atau after
siklus permintaan. Hal ini terutama berguna untuk hal-hal seperti otentikasi dan logging. Untuk mendaftarkan filter, kita perlu menambahkan sesuatu seperti berikut ke application/routes.php file:
1 |
Route::filter('myfilter', function() |
2 |
{
|
3 |
//What you want the filter to do
|
4 |
});
|
Setelah kami mendaftarkan filter, kita perlu pasangkan ke route, seperti:
1 |
Route::any('/', array('before' => 'filter', function() |
2 |
{
|
3 |
//What you want the route to do
|
4 |
}));
|
Dalam contoh di atas, myfilter
akan memicu pada semua permintaan untuk halaman indeks (yaitu /). Mari kita mengatakan kami ingin menerapkan filter otentikasi untuk rute dashboard
:
1 |
Route::filter('auth', function() |
2 |
{
|
3 |
if(Auth::guest()) { |
4 |
return Redirect::to('home'); |
5 |
}
|
6 |
});
|
7 |
|
8 |
Route::any('dashboard', array('before' => 'auth, function() |
9 |
{
|
10 |
return View::make('dashboard'); |
11 |
});
|
Kode di atas akan mengarahkan semua permintaan tidak terauthentikasi ke dashboard rute ke jalur home.
Global filter
Secara default, Laravel termasuk dua filter, before
dan after
, yang menjalankan sebelum dan setelah setiap permintaan pada aplikasi. Ini adalah di mana Anda menempatkan hal-hal, seperti permintaan logging, menambahkan aset global atau fire event global. Sebagai contoh:
1 |
Route::filter('after', function($response) |
2 |
{
|
3 |
Log::write('request', 'Request finished on ' . date('d M, Y - h:i:sA') . '.\n\nRequest Information:\n '. var_export(Input::get(), true)); |
4 |
});
|
Ini menulis pesan log jenis request
untuk aplikasi log dan daftar ada masukan dari permintaan.
Route Grup
Jika Anda menemukan diri Anda menerapkan filter sama beberapa rute, Anda dapat menggunakan Route Group untuk kelompok mereka semua bersama-sama dan mengurangi pengulangan kode:
1 |
Route::filter('admin_auth', function() |
2 |
{
|
3 |
if(Auth::guest() || !Auth::user()->isAdmin()) { |
4 |
return Redirect::to('home'); |
5 |
}
|
6 |
});
|
7 |
|
8 |
Route::group(array('before' => 'admin_auth'), function() |
9 |
{
|
10 |
Route::get('admin', function() |
11 |
{
|
12 |
return View::make('admin'); |
13 |
});
|
14 |
|
15 |
Route::get('useradmin', function() |
16 |
{
|
17 |
return View::make('useradmin'); |
18 |
});
|
19 |
});
|
Filter controller
Untuk aplikasi (seperti Instapics kami sendiri) yang menggunakan Controllers, kita dapat menerapkan penyaring menggunakan fungsi $this->filter()
di konstruktor controller:
1 |
public function __construct() |
2 |
{
|
3 |
$this->filter('before', 'auth'); |
4 |
}
|
Filter ini, seperti rute, juga dapat disesuaikan berlaku hanya untuk tertentu HTTP kata dan tindakan-tindakan spesifik controller:
1 |
public function __construct() |
2 |
{
|
3 |
//call 'log_download' filter for all download/file GET requests
|
4 |
$this->filter('after', 'log_download')->only(array('file'))->on('get'); |
5 |
|
6 |
//call the 'auth_download' filter for all download/* requests, except for the 'queue' action
|
7 |
$this->filter('before', 'auth_download')->except(array('queue')); |
8 |
}
|
2 - Laravel Validation
Laravel's built-in validasi membuatnya mudah untuk diterapkan validasi apapun array nilai, lebih khusus lagi, form input. Untuk melakukannya, Anda hanya perlu untuk membangun dua array:
- $input - ini adalah array asosiatif nilai-nilai yang Anda ingin memvalidasi.
- $rules - ini adalah array asosiatif (dengan tombol yang sama sebagai $input array) bahwa daftar turun aturan validasi.
1 |
//Getting our input from the Input library
|
2 |
$input = Input::all(); |
3 |
//Create our validation rules
|
4 |
$rules = array( |
5 |
'email' => 'required|email|unique:users', |
6 |
'password' => 'required' |
7 |
);
|
8 |
|
9 |
//Getting a $validation instance for our error checking
|
10 |
$validation = Validator::make($input, $rules); |
11 |
|
12 |
//Check if the validation succeeded
|
13 |
if( $validation->fails() ) { |
14 |
//do something with the error messages from the $validation instance
|
15 |
$validation->errors; |
16 |
}
|
Validation Rules
Dibawah ini adalah daftar aturan validasi yang dapat digunakan dengan perpustakaan validasi Laravel. Seperti dalam contoh di atas, Anda bebas untuk mencampur dan mencocokkan ini dengan memisahkan mereka dengan pipa ("|"):
-
required
- nilai harus hadir dalam array masukan1
'email' => 'required'
-
alpha
- nilai harus hanya terdiri dari karakter abjad1
'full_name' => 'alpha'
-
alpha_num
- nilai harus hanya terdiri dari huruf1
'username' => 'alpha_num'
-
alpha_dash
- nilai harus hanya terdiri dari alfanumerik, berlari dan/atau menggarisbawahi1
'user_name' => 'alpha_dash'
-
size
- nilai hanya boleh panjang tertentu, atau harus sama jika numerik1
'api_key' => 'size:10'
1
'order_count' => 'size:10'
-
between
- nilai adalah daripada antara suatu kisaran spesifik1
'order_count' => 'between:1,100'
-
min
- nilai setidaknya diberikan1
'order_count' => 'min:1'
-
max
- nilai sama dengan atau kurang daripada diberikan1
'order_count' => 'max:100'
-
numeric
- nilai numerik1
'order_count' => 'numeric'
-
integer
- nilai integer1
'order_count' => 'integer'
-
in
- nilai yang terkandung dalam diberikan1
'tshirt_size' => 'in:xsmall,small,medium,large,xlarge'
-
not_in
- nilai ini tidak di diberikan1
'tshirt_size' => 'not_in:xsmall,xlarge'
-
confirmed
- akan memeriksa jikakey_confirmation
ada dan setara dengan nilai1
'password' => 'confirmed'
Ini akan memeriksa apakah nilai
password_confirmation
ada dan sama denganpassword
-
accepted
- ini akan memeriksa jika nilai diatur ke 'ya' atau 1. Berguna untuk kotak centang1
'terms_of_service' => 'accepted'
-
same
- nilai adalah sama dengan nilai atribut tertentu1
'password' => 'same:confirm_password'
-
different
- nilai harus berbeda dari nilai atribut tertentu1
'password' => 'different:old_password'
-
match
- nilai harus cocok dengan ekspresi reguler yang diberikan1
'user_name' => 'match:/[a-zA-Z0-9]*/'
-
unique
- cek untuk keunikan nilai dalam tabel yang diberikan.1
'user_name' => 'unique:users'
Kolom tertentu juga diterima jika nama kolom tidak sama seperti nama atribut.
1
//if the column in the users table is username,
2
//we can provide this in the given like so:
3
'user_name' => 'unique:users,username'
Ada saat-saat ketika kita ingin memeriksa keunikan, tetapi mengabaikan record tertentu (biasanya record yang terkait dengan pengguna saat ini). Kita dapat melakukan ini dengan menambahkan ketiga diberikan, yang seharusnya menjadi ID dari record dalam tabel.
1
//ID 10 is the record ID of the current user
2
'user_name' => 'unique:users,user_name,10'
-
exists
- nilai harus ada dalam sebuah tabel1
'category' => 'exists:categories'
Ini juga menerima kedua diberikan jika kita ingin mengubah nama kolom untuk memeriksa.
1
'category' => 'exists:categories,category_name'
-
before
- nilai harus tanggal sebelum tanggal tertentu1
'publish_date' => 'before:2012-07-14'
-
after
- nilai harus tanggal setelah tanggal tertentu1
'publish_date' => 'after:2012-07-14'
-
email
- nilai harus dalam format email yang valid1
'subscriber_email' => 'email'
-
url
- nilai adalah format url yang valid1
'github_profile' => 'url'
-
active_url
- nilai dalam format url berlaku dan aktif1
'github_profile' => 'active_url'
-
mimes
- cek untuk jenis mime dari sebuah file upload. Anda dapat menggunakan nilai tipe-mime dari config/mimes.php file1
'avatar' => 'mimes:jpg,gif,png,bmp'
-
image
- file harus gambar1
'avatar' => 'image'
Anda juga dapat menggunakan validator
max
di sini untuk memeriksa ukuran file dalam kilobyte1
'avatar' => 'image|max:100'
Error Handling
Sekali Anda memanggil Validator->fails()
atau Validator->passes()
metode, Perpustakaan mengumpulkan semua kesalahan dalam kelas yang dapat diakses melalui Validator->errors
. Anda kemudian akan mampu mengambil kesalahan ini dengan beberapa fungsi di kelas errors
. Laravel menyediakan beberapa fungsi yang keren untuk mengotomatisasi kesalahan penanganan yang sesuai pada kebanyakan skenario POST/REDIRECT/GET:
1 |
class Register_Controller extends Base_Controller |
2 |
{
|
3 |
public $restful = true; |
4 |
|
5 |
public function get_index() |
6 |
{
|
7 |
return View::make('register.index'); |
8 |
}
|
9 |
|
10 |
public function post_index() |
11 |
{
|
12 |
$rules = array( |
13 |
'email' => 'required|email|unique:users', |
14 |
'password' => 'confirmed' |
15 |
);
|
16 |
|
17 |
$validation = Validator::make(Input::get(), $rules); |
18 |
|
19 |
if( $validation->fails() ) { |
20 |
//Send the $validation object to the redirected page
|
21 |
return Redirect::to('register')->with_errors($validation); |
22 |
}
|
23 |
}
|
24 |
}
|
Di sini, kami menggunakan metode with_errors
untuk Perpustakaan Redirect
. Ini secara otomatis mengikat $errors
variabel dalam tampilan untuk dimanapun kita berada mengarahkan - dalam hal ini, halaman register/index
:
1 |
<form>
|
2 |
{{-- $errors variable passed via with_errors --}} |
3 |
@if ($errors->has('email')) |
4 |
@foreach ($errors->get('email', '<p class="error-message">:message</p>') as $email_error) |
5 |
{{ $email_error }} |
6 |
@endforeach |
7 |
@endif |
8 |
<label for="email">Email:</label> |
9 |
<input type="email" name="email" placeholder="Enter your email address here" /> |
10 |
|
11 |
@if ($errors->has('password')) |
12 |
@foreach ($errors->get('password', '<p class="error-message">:message</p>') as $password_error) |
13 |
{{ $password_error }} |
14 |
@endif |
15 |
<label for="password">Password:</label> |
16 |
<input type="password" name="password" placeholder="Enter your password here" /> |
17 |
|
18 |
<label for="password_confirmation">Confirm Password:</label> |
19 |
<input type="password" name="password_confirmation" placeholder="Re-type your password here" /> |
20 |
</form>
|
Pada berkas Lihat, kita menggunakan metode $errors->has()
untuk memeriksa jika ada kesalahan untuk bidang tertentu. Jika tidak, kami kemudian menggunakan metode $errors->get()
untuk menampilkan pesan kesalahan. Parameter kedua dalam metode ini dapat digunakan untuk memberikan template pada bagaimana kita menampilkan pesan kesalahan.
Custom Error Message
Karena kebanyakan orang ingin mengubah pesan kesalahan untuk Laravel untuk menyesuaikan aplikasi mereka merek atau bahasa, validasi library juga memungkinkan untuk menyesuaikan pesan error yang dihasilkan oleh hanya menambahkan dalam sebuah array $messages
untuk Validasi::make
fungsi panggilan:
1 |
$rules = array( |
2 |
'email' => 'required|email|unique:users', |
3 |
'password' => 'confirmed' |
4 |
);
|
5 |
|
6 |
$messages = array( |
7 |
'email_required' => 'Please provide an email address', |
8 |
'email_email' => 'Please provide a valid email address', |
9 |
'email_unique' => 'The email address you provided is already being used', |
10 |
'password_confirmed' => 'Your password confirmation did not match your password.' |
11 |
);
|
12 |
$validation = Validator::make(Input::get(), $rules, $messages); |
Ada dua cara untuk membuat sebuah array $messages
:
- Rule-bases - Anda dapat memberikan pesan kustom untuk semua bidang yang disahkan oleh aturan tertentu. Sebagai contoh:
1
$messages = array(
2
'required' => 'The :attribute field is required.',
3
'same' => 'The :attribute and :other must match.',
4
'size' => 'The :attribute must be exactly :size.',
5
'between' => 'The :attribute must be between :min - :max.',
6
'in' => 'The :attribute must be one of the following types: :values',
7
);
Ini akan mengubah default pesan kesalahan untuk semua bidang yang
required, same, size, between dan in
aturan. Di sini, kita juga melihat bahwa Laravel menggunakan pengganti untuk mengganti nilai-nilai tertentu dalam pesan error.:atribute
akan berubah menjadi atribut bidang (sans garis bawah) itu adalah untuk.:other
digunakan untuk aturan yangsame
, yang mengacu pada atribut lainnya yang harus sesuai.:size
mengacu pada ukuran didefinisikan dalam parameter aturan.:min
dan:max
adalah nilai-nilai minimum dan maksimum, dan:values
adalah daftar nilai-nilai yang kita tentukan nilai dari field tersebut. - Attribute-based - di sisi lain, Anda dapat juga memberikan pesan kustom untuk atribut tertentu pada aturan khusus. Mengambil contoh dari atas:
1
$messages = array(
2
'email_required' => 'Please provide an email address',
3
'email_email' => 'Please provide a valid email address',
4
'email_unique' => 'The email address you provided is already being used',
5
'password_confirmed' => 'Your password confirmation did not match your password.'
6
);
email_required
pesan error yang digunakan ketika atribut email gagal aturanrequired
,email_email
adalah pesan error yang digunakan ketikaemail
gagalemail
aturan, dan sebagainya.
Jika Anda menemukan diri Anda consantly menciptakan pesan kustom yang sama meskipun, akan lebih mudah untuk hanya menentukan pesan kesalahan kustom secara global. Anda dapat melakukannya dengan mengedit application/langauge/en/validation.php file, dan mengedit array custom
ditemukan di sana:
1 |
...
|
2 |
...
|
3 |
'custom' => array( |
4 |
'email_required' => 'Please provide an email address', |
5 |
'email_email' => 'Please provide a valid email address', |
6 |
'email_unique' => 'The email address you provided is already being used', |
7 |
'password_confirmed' => 'Your password confirmation did not match your password.' |
8 |
);
|
9 |
...
|
10 |
...
|
3 - Laravel File
Penanganan File upload
Perpustakaan Files Laravel yang membuatnya mudah untuk menangani upload file dengan menggunakan metode Input::upload
, yang merupakan pembungkus sederhana untuk PHP move_uploaded_file
fungsi:
1 |
Input::upload('input_name', 'directory/to/save/file', 'filename.extension'); |
Untuk memvalidasi file upload, Anda dapat menggunakan perpustakaan Validator
yang kita bahas di atas seperti:
1 |
$input = array( |
2 |
'upload' => Input::file('upload') |
3 |
);
|
4 |
|
5 |
$rules = array( |
6 |
'upload' => 'mimes:zip,rar|max:500' |
7 |
);
|
8 |
|
9 |
$validator = Validator::make($input, $rules); |
Manipulasi file
Perpustakaan Files juga memiliki beberapa metode manipulasi file, seperti:
1 |
//Get a file
|
2 |
$data = File::get('path/file.extension'); |
3 |
|
4 |
//Write a file
|
5 |
File::put('path/file.extension', $data); |
6 |
|
7 |
//Appending to a file
|
8 |
File::append('path/file.extension', $data); |
File yang berhubungan dengan fungsi
Laravel juga menyediakan beberapa tujuan umum file yang berhubungan dengan fungsi yang dapat digunakan di seluruh kode. Sebagai contoh, metode File::extension
mengembalikan extensi string nama file:
1 |
//This will return 'zip'
|
2 |
File::extension('data.zip'); |
Fungsi File::is
memeriksa apakah file dari jenis tertentu. Perhatikan bahwa ini tidak hanya check ekstensi file, tetapi menggunakan Fileinfo
PHP extension untuk membaca isi sebenarnya dari file. Hal ini berguna untuk menentukan file yang benar-benar jenis file benar:
1 |
//Returns true if the file is a zip file, false if otherwise
|
2 |
File::is('zip', 'path/file.zip'); |
Daftar ekstensi kompatibel dapat dilihat di application/config/mimes.php.
Berbicara tentang jenis mime, Anda juga dapat menggunakan fungsi File::mime
untuk mendapatkan jenis mime extensi. Jenis mime kembali didasarkan pada file mimes.php yang sama:
1 |
//This will return image/png
|
2 |
File::mime('png') |
File::cpdir
dan metode File::rmdir
dapat menyalin dan menghapus direktori, masing-masing.
1 |
File::cpdir('directory/to/copy', 'destination/directory'); |
2 |
|
3 |
//File::rmdir is a recursive delete, so it will delete all files and folders inside the directory.
|
4 |
File::rmdir('directory/to/delete'); |
Sekarang bahwa kita telah Pelajari semua tentang Filter, Validation Perpustakaan dan Perpustakaan Files, mari kita menerapkan mereka dalam aplikasi kita, Instapics.
Langkah 1 membuat auth
Filter

Menambahkan filter ke Base_Controller
Mari kita memulai dengan memastikan user hanya dapat melihat halaman otentikasi dengan menciptakan sebuah filter auth
yang berjalan sebelum semua permintaan. Karena kita menggunakan controller berbasis routing, kita harus mengkonfigurasi filter kami di controller kami. Mari kita menempatkan filter dalam metode __construct
Base_Controller
untuk memastikan auth
filter berjalan pada semua kontroler yang extend itu. Sementara kita di itu, mari kita tambahkan filter nonauth
serta untuk memastikan orang-orang dapat hanya mengunjungi halaman tertentu ketika mereka sedang tidak dikonfirmasi:
1 |
class Base_Controller extends Controller { |
2 |
|
3 |
public function __construct() |
4 |
{
|
5 |
//Assets
|
6 |
Asset::add('jquery', 'js/jquery-1.7.2.min.js'); |
7 |
Asset::add('bootstrap-js', 'js/bootstrap.min.js'); |
8 |
Asset::add('bootstrap-css', 'css/bootstrap.min.css'); |
9 |
Asset::add('bootstrap-css-responsive', 'css/bootstrap-responsive.min.css', 'bootstrap-css'); |
10 |
Asset::add('style', 'css/style.css'); |
11 |
parent::__construct(); |
12 |
|
13 |
//Filters
|
14 |
$class = get_called_class(); |
15 |
switch($class) { |
16 |
case 'Home_Controller': |
17 |
$this->filter('before', 'nonauth'); |
18 |
break; |
19 |
|
20 |
case 'User_Controller': |
21 |
$this->filter('before', 'nonauth')->only(array('authenticate')); |
22 |
$this->filter('before', 'auth')->only(array('logout')); |
23 |
break; |
24 |
|
25 |
default: |
26 |
$this->filter('before', 'auth'); |
27 |
break; |
28 |
}
|
29 |
}
|
Di sini kita mendefinisikan bahwa setiap permintaan untuk rute home
akan memerlukan bebas dikonfirmasi pengguna, yang baik karena ini adalah di mana layar login kebohongan. request lain meskipun akan default untuk mengharuskan authenticated user. Untuk User_Controller
, kami benar-benar memiliki dua metode yang terpisah yang memerlukan baik non-authenticated user (mengotentikasi) dan pengguna yang diotentikasi (logout), sehingga kita membuat penggunaan only
metode untuk menentukan tindakan controller filter berlaku untuk.
Buat filter definisi di routes.php
Sekarang, buka application/routes.php, yang mana kita akan mendefinisikan auth
dan nonauth
filter. Perhatikan bahwa Anda mungkin sudah ada definisi filter auth
jadi hanya menggantinya dengan yang ada di bawah ini:
1 |
Route::filter('auth', function() |
2 |
{
|
3 |
if (Auth::guest()) return Redirect::to('home'); |
4 |
});
|
5 |
|
6 |
Route::filter('nonauth', function() |
7 |
{
|
8 |
if (Auth::guest() == false) return Redirect::to('dashboard'); |
9 |
});
|
Di dalam filter auth
, kami memeriksa jika pengguna diotentikasi dengan perpustakaan Auth
. Jika pengguna tidak dikonfirmasi, kami mengarahkan mereka kembali ke route home
yang mana screen login berada, jika tidak, mereka diizinkan untuk melanjutkan. Hal yang sama dengan nonauth
filter - check jika pengguna diotentikasi, jika dia, kemudian mengarahkan dirinya ke dashboard.
Langkah 2 menerapkan User upload
Membuat form upload foto
Sekarang bahwa kita tahu sedikit lebih tentang bagaimana untuk menangani upload file dalam Laravel, mari kita mulai menerapkan salah satu fitur utama Instapics' — meng-upload foto. Mulailah dengan menciptakan sebuah folder bernama folder application/views/plugins, dan dalam hal ini membuat sebuah blade view file bernama upload_modal.blade.php. Menyisipkan HTML berikut:
1 |
<div class="modal hide" id="upload_modal"> |
2 |
<div class="modal-header"> |
3 |
<button type="button" class="close" data-dismiss="modal">×</button> |
4 |
<h3>Upload a new Instapic</h3> |
5 |
</div>
|
6 |
<div class="modal-body"> |
7 |
<form method="POST" action="{{ URL::to('photo/upload') }}" id="upload_modal_form" enctype="multipart/form-data"> |
8 |
<label for="photo">Photo</label> |
9 |
<input type="file" placeholder="Choose a photo to upload" name="photo" id="photo" /> |
10 |
<label for="description">Description</label> |
11 |
<textarea placeholder="Describe your photo in a few sentences" name="description" id="description" class="span5"></textarea> |
12 |
</form>
|
13 |
</div>
|
14 |
<div class="modal-footer"> |
15 |
<a href="#" class="btn" data-dismiss="modal">Cancel</a> |
16 |
<button type="button" onclick="$('#upload_modal_form').submit();" class="btn btn-primary">Upload Photo</a> |
17 |
</div>
|
18 |
</div>
|
Membuat button trigger
Mari kita memicu bentuk modal dengan tombol - Tambahkan ini ke application/views/layouts/main.blade.php, setelah .nav-collapse
div:
1 |
<div class="nav-collapse"> |
2 |
<ul class="nav"> |
3 |
@section('navigation') |
4 |
<li class="active"><a href="home">Home</a></li> |
5 |
@yield_section |
6 |
</ul>
|
7 |
</div><!--/.nav-collapse --> |
8 |
@section('post_navigation') |
9 |
@if (Auth::check()) |
10 |
@include('plugins.loggedin_postnav') |
11 |
@endif |
12 |
@yield_section |
Di sini, kami menyertakan file tampilan yang disebut loggedin_postnav
jika pengguna masuk. Ini adalah tempat kami akan menambahkan tombol untuk form modal upload. Pada file yang sama, tambahkan ini setelah .container
div:
1 |
<div class="container"> |
2 |
@yield('content') |
3 |
<hr>
|
4 |
<footer>
|
5 |
<p>© Instapics 2012</p> |
6 |
</footer>
|
7 |
</div> <!-- /container --> |
8 |
@section('modals') |
9 |
@if (Auth::check()) |
10 |
@include('plugins.upload_modal') |
11 |
@endif |
12 |
@yield_section |
Ini adalah dimana kami meliputi upload_modal
HTML. Kami memastikan bahwa meskipun bahwa pengguna tidak login sebelumnya termasuk file HTML ini, sejak seperti tombol pelatuk, ini tidak akan benar-benar diperlukan jika pengguna tidak dikonfirmasi.
Sekarang, membuat application/views/plugins/loggedin_postnav.blade.php
1 |
<div class="btn-group pull-right"> |
2 |
<button type="button" class="btn btn-primary" onclick="$('#upload_modal').modal({backdrop: 'static'});"><i class="icon-plus-sign icon-white"></i> Upload Instapic</button> |
3 |
</div>
|
Refresh halaman dan Anda akan melihat tombol upload baru - klik untuk melihat bahwa ia bekerja!



Menghubungkan bentuk ke controller sesuai
Sekarang bahwa kita memiliki barang-barang kami front-end bekerja, mari kita mulai bekerja di bagian back-end form. Membuat application/controllers/photo.php, dan dimasukkan ke dalam kode berikut untuk controller:
1 |
class Photo_Controller extends Base_Controller |
2 |
{
|
3 |
public function action_upload() |
4 |
{
|
5 |
$input = Input::all(); |
6 |
$extension = File::extension($input['photo']['name']); |
7 |
$directory = path('public').'uploads/'.sha1(Auth::user()->id); |
8 |
$filename = sha1(Auth::user()->id.time()).".{$extension}"; |
9 |
|
10 |
$upload_success = Input::upload('photo', $directory, $filename); |
11 |
|
12 |
if( $upload_success ) { |
13 |
Session::flash('status_success', 'Successfully uploaded new Instapic'); |
14 |
} else { |
15 |
Session::flash('status_error', 'An error occurred while uploading new Instapic - please try again.'); |
16 |
}
|
17 |
|
18 |
if( $upload_success ) { |
19 |
$photo = new Photo(array( |
20 |
'location' => URL::to('uploads/'.sha1(Auth::user()->id).'/'.$filename), |
21 |
'description' => $input['description'] |
22 |
));
|
23 |
Auth::user()->photos()->insert($photo); |
24 |
}
|
25 |
|
26 |
return Redirect::to('dashboard'); |
27 |
}
|
28 |
}
|
Mencobanya - Anda dapat mulai meng-upload baru Instapics.
Tambahkan validasi ke formulir upload
Mari kita tambahkan beberapa aturan validasi ini untuk memastikan bahwa pengguna hanya mengajukan hal-hal yang benar. Memperbarui controller dengan berikut:
1 |
class Photo_Controller extends Base_Controller |
2 |
{
|
3 |
public function action_upload() |
4 |
{
|
5 |
$input = Input::all(); |
6 |
|
7 |
if( isset($input['description']) ) { |
8 |
$input['description'] = filter_var($input['description'], FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES); |
9 |
}
|
10 |
|
11 |
$rules = array( |
12 |
'photo' => 'required|image|max:500', //photo upload must be an image and must not exceed 500kb |
13 |
'description' => 'required' //description is required |
14 |
);
|
15 |
|
16 |
$validation = Validator::make($input, $rules); |
17 |
|
18 |
if( $validation->fails() ) { |
19 |
return Redirect::to('dashboard')->with_errors($validation); |
20 |
}
|
21 |
|
22 |
$extension = File::extension($input['photo']['name']); |
23 |
$directory = path('public').'uploads/'.sha1(Auth::user()->id); |
24 |
$filename = sha1(Auth::user()->id.time()).".{$extension}"; |
25 |
|
26 |
$upload_success = Input::upload('photo', $directory, $filename); |
27 |
|
28 |
if( $upload_success ) { |
29 |
$photo = new Photo(array( |
30 |
'location' => URL::to('uploads/'.sha1(Auth::user()->id).'/'.$filename), |
31 |
'description' => $input['description'] |
32 |
));
|
33 |
Auth::user()->photos()->insert($photo); |
34 |
Session::flash('status_success', 'Successfully uploaded your new Instapic'); |
35 |
} else { |
36 |
Session::flash('status_error', 'An error occurred while uploading your new Instapic - please try again.'); |
37 |
}
|
38 |
return Redirect::to('dashboard'); |
39 |
}
|
40 |
}
|
Lihat bagaimana kami validasi input? Kami memastikan bahwa foto hadir, gambar dan kurang dari 500kb. Kami juga memastikan bahwa Deskripsi ada setelah sanitasi. Kami tidak akan dapat melihat pesan kesalahan kita namun meskipun, jadi mari kita memperbaikinya dengan menambahkan beberapa HTML untuk membuat pesan kesalahan kita. Buka application/views/layouts/main.blade.php dan tambahkan baris berikut di .container
div:
1 |
<div class="container"> |
2 |
@include('plugins.status') |
3 |
@yield('content') |
4 |
<hr>
|
5 |
<footer>
|
6 |
<p>© Instapics 2012</p> |
7 |
</footer>
|
8 |
</div> <!-- /container --> |
Sekarang, membuat application/views/plugins/status.blade.php. Ini adalah tempat kami akan memberikan pesan kesalahan yang sebenarnya. Kami juga menambahkan dukungan untuk pesan status berbasis sesi (seperti yang kita gunakan dalam $upload_success
memeriksa kode controller Photos
):
1 |
@if (isset($errors) && count($errors->all()) > 0)
|
2 |
<div class="alert alert-error"> |
3 |
<a class="close" data-dismiss="alert" href="#">×</a> |
4 |
<h4 class="alert-heading">Oh Snap!</h4> |
5 |
<ul>
|
6 |
@foreach ($errors->all('<li>:message</li>') as $message) |
7 |
{{ $message }} |
8 |
@endforeach |
9 |
</ul>
|
10 |
</div>
|
11 |
@elseif (!is_null(Session::get('status_error'))) |
12 |
<div class="alert alert-error"> |
13 |
<a class="close" data-dismiss="alert" href="#">×</a> |
14 |
<h4 class="alert-heading">Oh Snap!</h4> |
15 |
@if (is_array(Session::get('status_error'))) |
16 |
<ul>
|
17 |
@foreach (Session::get('status_error') as $error) |
18 |
<li>{{ $error }}</li> |
19 |
@endforeach |
20 |
</ul>
|
21 |
@else |
22 |
{{ Session::get('status_error') }} |
23 |
@endif |
24 |
</div>
|
25 |
@endif |
26 |
|
27 |
@if (!is_null(Session::get('status_success'))) |
28 |
<div class="alert alert-success"> |
29 |
<a class="close" data-dismiss="alert" href="#">×</a> |
30 |
<h4 class="alert-heading">Success!</h4> |
31 |
@if (is_array(Session::get('status_success'))) |
32 |
<ul>
|
33 |
@foreach (Session::get('status_success') as $success) |
34 |
<li>{{ $success }}</li> |
35 |
@endforeach |
36 |
</ul>
|
37 |
@else |
38 |
{{ Session::get('status_success') }} |
39 |
@endif |
40 |
</div>
|
41 |
@endif |
Cobalah menyebabkan kesalahan pada form upload sekarang dengan mengirimkan tanpa file yang dipilih atau tanpa keterangan (karena keduanya diperlukan). Anda akan melihat pesan error yang diberikan di atas:



Langkah 3 menambahkan validasi Login Form dan pendaftaran
Sekarang bahwa kita tahu bagaimana menggunakan Laravel's Validation library, mari kita meninjau form pertama - bentuk login dan registrasi. Saat ini, kita hanya menggunakan echo
untuk melihat bahwa login atau registrasi gagal-Mari kita ganti yang dengan validasi yang tepat. Buka application/controllers/user.php dan update seperti:
1 |
class User_Controller extends Base_Controller |
2 |
{
|
3 |
public function action_authenticate() |
4 |
{
|
5 |
$email = Input::get('email'); |
6 |
$password = Input::get('password'); |
7 |
$new_user = Input::get('new_user', 'off'); |
8 |
|
9 |
$input = array( |
10 |
'email' => $email, |
11 |
'password' => $password |
12 |
);
|
13 |
|
14 |
if( $new_user == 'on' ) { |
15 |
|
16 |
$rules = array( |
17 |
'email' => 'required|email|unique:users', |
18 |
'password' => 'required' |
19 |
);
|
20 |
|
21 |
$validation = Validator::make($input, $rules); |
22 |
|
23 |
if( $validation->fails() ) { |
24 |
return Redirect::to('home')->with_errors($validation); |
25 |
}
|
26 |
|
27 |
try { |
28 |
$user = new User(); |
29 |
$user->email = $email; |
30 |
$user->password = Hash::make($password); |
31 |
$user->save(); |
32 |
Auth::login($user); |
33 |
|
34 |
return Redirect::to('dashboard'); |
35 |
} catch( Exception $e ) { |
36 |
Session::flash('status_error', 'An error occurred while creating a new account - please try again.'); |
37 |
return Redirect::to('home'); |
38 |
}
|
39 |
} else { |
40 |
|
41 |
$rules = array( |
42 |
'email' => 'required|email|exists:users', |
43 |
'password' => 'required' |
44 |
);
|
45 |
|
46 |
$validation = Validator::make($input, $rules); |
47 |
|
48 |
if( $validation->fails() ) { |
49 |
return Redirect::to('home')->with_errors($validation); |
50 |
}
|
51 |
|
52 |
$credentials = array( |
53 |
'username' => $email, |
54 |
'password' => $password |
55 |
);
|
56 |
if( Auth::attempt($credentials)) { |
57 |
return Redirect::to('dashboard'); |
58 |
} else { |
59 |
Session::flash('status_error', 'Your email or password is invalid - please try again.'); |
60 |
return Redirect::to('home'); |
61 |
}
|
62 |
}
|
63 |
}
|
64 |
|
65 |
public function action_logout() |
66 |
{
|
67 |
Auth::logout(); |
68 |
Redirect::to('home/index'); |
69 |
}
|
70 |
}
|
Karena kami membuat kami rendering pesan status dalam gaya modular, kita bahkan tidak perlu untuk menulis HTML setiap tambahan untuk melihat pesan kesalahan dalam tindakan! Silahkan coba!



Kesimpulan
Dalam tutorial ketiga dalam seri Laravel kami, kita belajar:
- Bagaimana, Kapan dan di mana untuk menggunakan Laravel Filter
- Bagaimana menggunakan Laravel's Validation library, dan bagaimana untuk menangani kesalahan Validation library.
- Bagaimana mengelola file dalam Laravel yang menggunakan perpustakaan Files
Laravel datang dengan banyak fungsi kecil dan Perpustakaan, yang meskipun diimplementasikan dengan cara lain, dibuat lebih mudah dan sederhana (misalnya file upload dalam satu baris!) dengan mengadopsi Laravel's ekspresif. It's Perpustakaan sedikit menghemat waktu tersebut menambahkan hingga dan dari waktu ke waktu, menghemat satu ton terbuang produktivitas menulis ulang kode.
Berikutnya di aplikasi Web kami dari awal dengan Laravel seri, kita akan mempelajari lebih lanjut tentang acara, migrasi dan penggunaan beberapa maju ORM Eloquent!
Apa yang Anda pikirkan Perpustakaan Laravel yang dibahas dalam tutorial? Apakah itu sesuatu yang Anda anggap berguna? Beritahu saya di komentar! Dan, jika Anda anggota Tuts + Premium, menantikan untuk kursus Laravel Essentials mendatang kami!