MVC trong Laravel 5.1 ( Overview Laravel 5.1 )

Chào mừng ngày cuối tuần bằng bài viết cho những bạn mới tìm hiểu về Laravel mà còn bỡ ngỡ không biết Controller, View và Model gọi nhau thế nào nhé.

Mình chỉ nói tư tưởng và cách viết để các bạn có tư duy sơ bộ về MVC trong Laravel 5.1 như thế nào nhé.

1. View

  • Phần hiện thị ở phía Client như thế nào, đẹp xấu ra sao là do phần này các bạn viết thế nào nhé. Nó nằm trong thư mục resources/views, là thư mục quy định sẵn của Laravel 5.1 lần này. Khác với Laravel 4, các bạn sẽ thấy Views nằm trong thư mục View ngay trong App folder.
  • Trong thư mục Views này chứa những file html được giữ nguyên cách đặt tên như trong Laravel 4 đó là: fileName.blade.php
  • Các file trong Views sử dụng những thành phần trong thư mục Public gồm css, images, js.
  • Mọi truy cập từ bên ngoài vào Server của bạn sẽ dẫn tới thư mục public này, có nghĩa là mọi tấn công từ bên ngoài cũng chỉ vào được khu vực này thôi. Bạn yên tâm là họ chỉ đọc được Css, images, javascript.
  • Cùng xem một đoạn code sau trong file “home.blade.php”:

 

スクリーンショット 2015-12-05 午前10.48.26

  • Đây chỉ là một đoạn Html đơn giản, tuy nhiên chúng ta sẽ xem phải show nó lên như thế nào trong Laravel 5.1 nhé!
  • Route: Khi truy cập tới route: “home-page” bằng phương thức “get” chúng ta cần một khai báo trong router như dưới đây:

Route::get(‘home-page’, array(‘uses’ =>                                                 ‘Admin\AdminController@showHomePage’));

Có thể hiểu như sau: khi có một action get truy cập tới “home-page” thì controller: AdminController sẽ được kích hoạt và gọi tới hàm showHomePage.

2. Controller

Trong AdminController hàm showHomePage được viết như sau:

public function showHomePage() {

$userEmail = nishi@betogoo.com

$dataUser = \App\UserManage::getInfoUser($userEmail);
return View::make(‘home’, array(
‘userLogin’ => $dataUser,
));
}

Đoạn code đơn giản này đã thể hiện được cách làm việc từ việc gọi Model để lấy dữ liệu $dataUser sau đó đổ nó lên View có tên là “home” (chính là file view: “home.blade.php”) thông qua phương thức “make” , ngoài ra việc truyền nhiều biến vào View bạn có thể nhét hết vào một mảng trong “array” như trên!

3. Model

Hàm lấy thông tin “getInfoUser” này nằm trong file “UserManage” trong thư mục App chính vì thế để gọi được nó chúng ta phải chỉ ra trong controller cụ thể nó nằm ở đâu thông qua: \App\UserManage::getInfoUser

Cùng xem Model được viết như thế nào nhé:

public static function getInfoUser($email) {
$userInfo = DB::table(‘users’)->where(’email’, $email)->first();
return $userInfo;
}

Cần phải khai báo static để mọi controller có thể gọi được function này. Ta có thể thấy model này gọi tới bảng “users” với điều kiệu là email phải bằng biến $email, email này được truyền vào từ controller:

$userEmail = nishi@betogoo.com

$dataUser = \App\UserManage::getInfoUser($userEmail);

 

Một chút trên để các bạn hình dung cơ chế gọi nhau của Controller, View và Model, để thành thạo cách sử dụng chúng và thực hiện các tác vụ phức tạp hơn, các bạn hãy thực hành thật nhiều và tham khảo trang chủ của laravel.com nhé.

Install Laravel 5 in Maccccccccccccc

1. Download Composer.phar to htdocs folder (Link: https://getcomposer.org/download/)
2. Run command to require laravel:
php composer.phar global require “laravel/installer=~1.1”
3. Download Laravel by this command to “projectName” :
php composer.phar create-project laravel/laravel projectName
4. Go to “projectName”
5. Run command:
$ sudo chmod -R gu+w storage
and:
$ sudo chmod -R guo+w storage
(# Group Writable (Group, User Writable)
$ sudo chmod -R gu+w storage
# World-writable (Group, User, Other Writable)
$ sudo chmod -R guo+w storage)
6. Done!

Share link lên Facebook và các mạng xã hội trong Laravel

Bạn tải thư viện này về: https://github.com/thujohn/share-l4

sau đó trong file composer.json bạn thêm dòng: 

"thujohn/share": "dev-master" vào trong  phần Require kiểu như sau:

"require": {
 "laravel/framework": "4.2.*",
 "thujohn/share": "dev-master"
 },
Tiếp theo trong file app/config/app.php 
Bạn thêm vào phần providers và aliases những dòng như sau:
'Thujohn\Share\ShareServiceProvider', 
'Share' => 'Thujohn\Share\ShareFacade',
Tiếp theo bạn làm theo hướng dẫn của bài viết nhé ;)
Mình chỉ  hướng dẫn tới đây vì đoạn dưới anh tác giả đã 
hướng dẫn dễ hiểu rồi.

			

Create Sub Controller and Sub Model in Laravel

You have controller folder below:
controllers\
---- folder1
------------HomeController.php
In Route:
Route::get('/', 'Home\HomeController@index');
In HomeController.php have to write in header of file:
namespace folder1;
use BaseController;
(<?php
namespace folder1; 
use BaseController;
class HomeController extends BaseController {
 ... )
 And if you call a model in this controller you must use '/' before model name. 
For example we have a model is Menu, we'll call: 
$menu = \Menu::all();
To finish, in cmd you go to the laravel project and type:
php composer dump-autoload
or: 
php composer.phar dump-autoload (if composer not found)
(You don't have to change composer.json and global.php) 

2. Sub Model
as same sub controller but you must have:
namespace name_of_sub_model;
use Eloquent;
use DB; //If you want to use query builder 
So easy!

Setup Laravel 4 for Mac with Xampp

Step 1. You have to install Xampp

Step 2. Download laravel-master latest version in https://github.com/laravel/laravel

Step 3. Move folder laravel-master (which have downloaded) to folder htdocs of Xampp

Step 4. Download Composer.phar on link https://getcomposer.org/composer.phar

Step 5. Move file Composer.phar to folder laravel-master

Step 6. In Terminal cd to folder laravel-master and type:

php composer.phar install

Step 7:  chmod 777 app/storage/*

Step 8: Check http://localhost/ laravel-master/public in browser. You’ll see

You have arrived.

OK!

Upload File Bằng phương thức FTP trong C#

Chào các bạn.

Upload file bằng phương thức FTP là một phương thức upload cơ bản và nó có rủi ro là nếu bạn bị dùng đường truyền internet bình thường sẽ có thể bị ăn cắp dữ liệu và để khắc phục điều này người ta dùng một phương thức phức tạp hơn là FPTS hay là SFTP.

Nhưng trong bài viết này mình trình bày vấn đề upload cơ bản để chúng ta tìm hiểu về cách thức đưa dữ liệu lên server từ client như thế nào nhé.

Đầu tiên cần: host, user, pass để có thể truy cập vào server nhé.

private string host = null;
private string user = null;
private string pass = null;

Chúng ta cần một cái FtpWebRequest để gửi Request lên, tiếp theo là FtpWebResponse để nhận Response từ server về và cuối cùng là một Stream để như một cái ống nối vô hình từ Server với Client để truyền dữ liệu qua lại giữa 2 bạn này với nhau. Chúng ta khai báo như sau:

private FtpWebRequest ftpRequest = null;
private FtpWebResponse ftpResponse = null;
private Stream ftpStream = null;

Chúng ta khởi tạo nhé:

public Ftp(string hostIP, string userName, string password)

{

host = hostIP;

user = userName;

pass = password;

}

+ Hàm Download như sau:

/* Download File */
public bool download(string remoteFile, string localFile)
{
bool isDownloadSuccessful = false;
try
{
int bufferSize = this.getFileSize(remoteFile);
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + remoteFile);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Get the FTP Server’s Response Stream */
ftpStream = ftpResponse.GetResponseStream();
/* Open a File Stream to Write the Downloaded File */
FileStream localFileStream = new FileStream(localFile, FileMode.Create);
/* Buffer for the Downloaded Data */

byte[] byteBuffer = new byte[bufferSize];
int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
/* Download the File by Writing the Buffered Data Until the Transfer is Complete */
try
{
while (bytesRead > 0)
{
localFileStream.Write(byteBuffer, 0, bytesRead);
bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
}
isDownloadSuccessful = true;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Resource Cleanup */
localFileStream.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
return isDownloadSuccessful;
}

+ Upload:

/* Upload File */

public bool doUpload(string remoteFileName, string localPathFile)
{
bool iSuccessful = false;
try
{
/*Get Local File Information*/
FileInfo objLocalFile = new FileInfo(localPathFile);

/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + remoteFileName);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
//ftpRequest.Timeout = 1000;
//set Time out for request upload
ftpRequest.Timeout = 600000 * 3;
ftpRequest.ContentLength = objLocalFile.Length;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
/* Establish Return Communication with the FTP Server */
ftpStream = ftpRequest.GetRequestStream();
/* Open a File Stream to Read the File for Upload */
//FileStream remoteFileStream = new FileStream(remoteFile, FileMode.Create);
FileStream remoteFileStream = objLocalFile.OpenRead();

/* Buffer for the Uploaded Data */
int bufferSize = (int)remoteFileStream.Length;
byte[] byteBuffer = new byte[bufferSize];
int bytesSent = remoteFileStream.Read(byteBuffer, 0, bufferSize);
/* Upload the File by Sending the Buffered Data Until the Transfer is Complete */
try
{
while (bytesSent != 0)
{
ftpStream.Write(byteBuffer, 0, bytesSent);
bytesSent = remoteFileStream.Read(byteBuffer, 0, bufferSize);
}
iSuccessful = true;
}
catch (Exception ex)
{
messageUploadFile = ex.Message.ToString();
MessageBox.Show(ex.Message.ToString());
//Console.WriteLine(ex.ToString());
}
/* Resource Cleanup */
remoteFileStream.Close();
ftpStream.Close();
ftpRequest = null;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return iSuccessful;
}

+ Delete File như sau:

/* Delete File */
public bool delete(string deleteFile)
{
bool isDeleted = false;
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)WebRequest.Create(host + “/” + deleteFile);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Resource Cleanup */
ftpResponse.Close();
ftpRequest = null;
isDeleted = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return isDeleted;

}

/* Rename File */
public void rename(string currentFileNameAndPath, string newFileName)
{
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)WebRequest.Create(host + “/” + currentFileNameAndPath);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.Rename;
/* Rename the File */
ftpRequest.RenameTo = newFileName;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Resource Cleanup */
ftpResponse.Close();
ftpRequest = null;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
return;
}

Và giờ là hàm lấy size của File, nếu không có Hàm này thì khi upload và download bạn có thể sẽ không đưa được hết dữ liệu tới nơi vì nếu cái thùng của bạn bé quá sẽ không đựng được hết dữ liệu hoặc lớn quá sẽ thừa thãi.

/* Get the Size of a File */
public int getFileSize(string fileName)
{
int fileSize = 0;
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + fileName);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Establish Return Communication with the FTP Server */
ftpStream = ftpResponse.GetResponseStream();

fileSize = (int)ftpResponse.ContentLength;
/* Get the FTP Server’s Response Stream */
StreamReader ftpReader = new StreamReader(ftpStream);
/* Store the Raw Response */
string fileInfo = null;
/* Read the Full Response Stream */
try
{
while (ftpReader.Peek() != -1)
{
fileInfo = ftpReader.ReadToEnd();
}
}
catch (Exception ex)
{
//Bạn nên log những thay Exception tại đây nhé
}
/* Resource Cleanup */
ftpReader.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
/* Return File Size */
return fileSize;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Return an Empty string Array if an Exception Occurs */
return fileSize;
}

Nếu bạn muốn lấy những file trong một thư mục thì hàm sau sẽ giúp bạn và dữ liệu trả về sẽ là một list danh sách tên file và thông tin các các file đó:

/* List Directory Contents in Detail (Name, Size, Created, etc.) */
public List<string> directoryListDetailed(string directory)
{
List<string> listFiles = new List<string>();
this.setFtpForUpload();
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + directory);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Establish Return Communication with the FTP Server */
ftpStream = ftpResponse.GetResponseStream();
/* Get the FTP Server’s Response Stream */
StreamReader ftpReader = new StreamReader(ftpStream);
/* Store the Raw Response */
//string directoryRaw = null;
/* Read Each Line of the Response and Append a Pipe to Each Line for Easy Parsing */
try
{
while (ftpReader.Peek() != -1)
{
//directoryRaw += ftpReader.ReadLine() + “|”;
listFiles.Add(ftpReader.ReadLine());
}
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Resource Cleanup */
ftpReader.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
/* Return the Directory Listing as a string Array by Parsing ‘directoryRaw’ with the Delimiter you Append (I use | in This Example) */
try
{
return listFiles;
//string[] directoryList = directoryRaw.Split(“|”.ToCharArray()); return directoryList;
}
catch (Exception ex)
{
errorLog.writeErrorToLogFile(ex);
}
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Return an Empty string Array if an Exception Occurs */
return new List<string> { “” };
}
}
}

Thắc mắc xin mời các bạn hỏi ạ!

Một chút suy ngẫm về ngành công nghệ thông tin trong nước.

Phải nói quá khó khăn cho hướng đi của chúng ta.
Khó khăn từ nội tại mà ra cả thôi, trình độ nhân lực yếu, sức tiêu thụ phần mềm quá yếu từ đó tạo một thị trường trong nước èo uột, các doanh nghiệp làm tin học sống được là nhờ mối quan hệ để nhận các dự án nhà nước về làm, sống qua ngày, tương lai phát triển dài lâu là không có! Bởi tương lai đó được duy trì bằng các mối quan hệ, mà lòng người thì khó đoán!
Phát triển một sản phẩm, dịch vụ tin học được như Vatgia, Zing,… vào thời điểm này là quá khó, bởi giờ người khôn đã nhiều rồi, không như hồi mù mờ ấy, thằng nào có đèn pin là đủ đi được tới thành công, giờ đèn pha cũng khó đấu lại với dò đường kiểu GPS!
Chúng ta nai lưng ra gia công phần mềm, hệt như thợ làm bánh trong nhà máy bánh kẹo hồi đầu năm mình đi làm thêm vậy! Mệt mỏi và rẻ mạt!
Chúng ta thiếu gì mơ ước và sáng tạo, sao vẫn chỉ là nhân công giá rẻ vậy? Bách khoa dạy lũ kỹ sư phần mềm thế nào mà để sau khi ra trường chúng đều làm lập trình hết vậy? Ko phải lỗi giáo dục, mà là lỗi của môi trường xã hội, thị trường việc làm! Một vài kẻ trăn trở tìm đường đi ra như mình thì lại ngộ ra vài điều và ngồi viết cái bài thê lương như vầy đây!