Advertisement
  1. Code
  2. PHP

Membangun aplikasi Web dari awal dengan Laravel: Filter, validasi dan file

Scroll to top
Read Time: 20 min

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 masukan

    1
            'email' => 'required'
    
  • alpha - nilai harus hanya terdiri dari karakter abjad

    1
            'full_name' => 'alpha'
    
  • alpha_num - nilai harus hanya terdiri dari huruf

    1
            'username' => 'alpha_num'
    
  • alpha_dash - nilai harus hanya terdiri dari alfanumerik, berlari dan/atau menggarisbawahi

    1
            'user_name' => 'alpha_dash'
    
  • size - nilai hanya boleh panjang tertentu, atau harus sama jika numerik

    1
            'api_key' => 'size:10'
    
    1
            'order_count' => 'size:10'
    
  • between - nilai adalah daripada antara suatu kisaran spesifik

    1
            'order_count' => 'between:1,100'
    
  • min - nilai setidaknya diberikan

    1
            'order_count' => 'min:1'
    
  • max - nilai sama dengan atau kurang daripada diberikan

    1
            'order_count' => 'max:100'
    
  • numeric - nilai numerik

    1
            'order_count' => 'numeric'
    
  • integer - nilai integer

    1
            'order_count' => 'integer'
    
  • in - nilai yang terkandung dalam diberikan

    1
            'tshirt_size' => 'in:xsmall,small,medium,large,xlarge'
    
  • not_in - nilai ini tidak di diberikan

    1
            'tshirt_size' => 'not_in:xsmall,xlarge'
    
  • confirmed - akan memeriksa jika key_confirmation ada dan setara dengan nilai

    1
            'password' => 'confirmed'
    

    Ini akan memeriksa apakah nilai password_confirmation ada dan sama dengan password

  • accepted - ini akan memeriksa jika nilai diatur ke 'ya' atau 1. Berguna untuk kotak centang

    1
            'terms_of_service' => 'accepted'
    
  • same - nilai adalah sama dengan nilai atribut tertentu

    1
            'password' => 'same:confirm_password'
    
  • different - nilai harus berbeda dari nilai atribut tertentu

    1
            'password' => 'different:old_password'
    
  • match - nilai harus cocok dengan ekspresi reguler yang diberikan

    1
            '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 tabel

    1
            '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 tertentu

    1
            'publish_date' => 'before:2012-07-14'
    
  • after - nilai harus tanggal setelah tanggal tertentu

    1
            'publish_date' => 'after:2012-07-14'
    
  • email - nilai harus dalam format email yang valid

    1
            'subscriber_email' => 'email'
    
  • url - nilai adalah format url yang valid

    1
            'github_profile' => 'url'
    
  • active_url - nilai dalam format url berlaku dan aktif

    1
            'github_profile' => 'active_url'
    
  • mimes - cek untuk jenis mime dari sebuah file upload. Anda dapat menggunakan nilai tipe-mime dari config/mimes.php file

    1
            'avatar' => 'mimes:jpg,gif,png,bmp'
    
  • image - file harus gambar

    1
            'avatar' => 'image'
    

    Anda juga dapat menggunakan validator max di sini untuk memeriksa ukuran file dalam kilobyte

    1
            '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 yang same, 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 aturan required, email_email adalah pesan error yang digunakan ketika email gagal email 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

Instapics

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">&times;</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>&copy; 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!

Upload InstapicUpload InstapicUpload Instapic

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>&copy; 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:

Instapic ErrorsInstapic ErrorsInstapic Errors

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!

Instapic ErrorsInstapic ErrorsInstapic Errors

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!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.