Ubuntu 20.04 安裝 Laravel

Step1. install Apacher Server
sudo apt install apache2

執行apache2伺服器

sudo sytemctl start apache2

開機啟動apache2

sudo systemctl enable apache2 

測試apach2執行情形

sudo systemctl status apache2
Step2. Installing PHP and its additional plugins

安裝PHP

sudo apt install php libapache2-mod-php php-mbstring php-cli php-bcmath php-json php-xml php-zip php-pdo php-common php-tokenizer php-mysql

測試安裝情形

php -v
Step3. creating a database

安裝MariaDB伺服器

sudo apt install mariadb-server

執行Mariadb

sudo mysql -u root -p

執行SQL語法

CREATE DATABASE laravel_db;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'secretpassword';
GRANT ALL ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
QUIT;
Step 4: Install Composer

執行”連線到安裝網站,使用PHP安裝”

$ curl -sS https://getcomposer.org/installer | php

安裝完後設定

sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer
composer --version
Step 5: Install Laravel 8 on Ubuntu
cd /var/www/html
sudo composer create-project laravel/laravel laravelapp
sudo chown -R www-data:www-data /var/www/html/laravelapp
sudo chmod -R 775 /var/www/html/laravelapp/storage
cd laravelapp
php artisan
Step 6: Configure Apache to serve Laravel

 建立laravel.conf檔案

<VirtualHost *:80>
ServerName example.com
ServerAdmin admin@example.com
DocumentRoot /var/www/html/laravelapp/public
<Directory /var/www/html/laravelapp>
AllowOverride All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

執行下列兩個指令,讓他們進入Apache rewiter 模組

sudo a2ensite laravel.conf
$ sudo a2enmod rewrite

重新啟動apache2

sudo systemctl restart apache2
Step 7: Run Laravel in a web browser

網站在 /var/www/html/laravelapp/public

使用Laravel8 PHP(一)

類別class

class.php

<?php  //class.php

echo "<head>
  <meta charset='utf-8'>
  <meta name='description' content='Free Web Tutorial'>
  <meta name='author' content='wwesbake'>
</head>
";

class Dog
{
	public $age;

	public function sayAge()
	{
		echo "我的年齡 {$this->age} 歲";
	}
}

$myDog = new Dog();
$myDog->age=1;
$myDog->sayAge();

?>

__condtruct(建構子)以及__destruct(解構子)

class Dog
{
	public $age;
	//規定建立類別一定要給年齡參數
	
	public function __construct($age)
	{
		echo "旺旺旺, 我誕生了!<br>";
		$this->age=$age;
	//前面是類別自身屬性,後方是建立物件時傳入的值
	}

	public function sayAge()
	{
		echo "我的年齡{$this->age} 歲";
	}

	public function __destruct()
	{
		echo "<br/> PHP程式執行結束 Dog Class關閉";
	}
}

$myDog = new Dog(1); //建立實體物件執行__construct()內的動作
$myDog->sayAge();
說明
public $age; 1.<--屬性

public function satAge()
{
echo "我的年齡 $this->age 歲"; 2.<--方法
} 3.使用自身的屬性要加$this關鍵字

注意
要在方法中使用自身類別的屬性,必須使用關鍵字$this來取得屬性值,只使用$age會讀不到值,必須使用$this->age。

繼承(Extends)

<?php  //extend.php

echo "<head>
  <meta charset='utf-8'>
  <meta name='description' content='Free Web Tutorial'>
  <meta name='author' content='wwesbake'>
</head>
";

class Animal
{
	public $age;

	public function sayAge()
	{
		echo "我的年齡 {$this->age} 歲";
	}
}

class Dog extends Animal
{
	//內容為空
}

class Cat extends Animal
{
	//內容為空
}

$myDog = new Dog();
$myDog->age=1;
$myDog->sayAge();
echo "<br/>--HR--<br/>";
//產生了新的物件
$myCat = new Cat();
$myCat->age=2;
$myCat->sayAge();

?>
說明
Animal 類別是 Dog、Cat的父類別,反之Dog、Cat都是Animal的子類別,可以看到子類別的內容都是為空,但Dog、Cat產生實體物件,可以設定年齡以及執行顯示年齡的方法,讓我們不用重複撰寫一樣的程式碼,父子類別它們在意義上是有關係的才使用繼承,以上我們都使用public存取權限,繼承後子類別擁有父類別的所有屬性以及方法。

封裝(Encapsulation)

<?php

echo "<head>
  <meta charset='utf-8'>
  <meta name='description' content='Free Web Tutorial'>
  <meta name='author' content='wwesbake'>
</head>
";

class Animal
{
	public     $name;    //存取權限public
	protected  $age;     //存取權限protected
	private    $weight;  //存取權限private

	public function __construct($name, $age, $weight)
	{
		$this->name = $name;
		$this->age = $age;
		$this->weight = $weight;
	}

	public function animalShowData()
	{
		echo "暱稱: {$this->name} <br>";   //正常讀取
		echo "年齡: {$this->age} <br>";    //正常讀取
		echo "體重: {$this->weight} <br>"; //正常讀取
	}
}

class Dog extends Animal
{
		public function dogShowData()
		{
			echo "暱稱: {$this->name} <br>";   //正常讀取
		  echo "年齡: {$this->age} <br>";    //正常讀取
		  echo "體重: {$this->weight} <br>"; //無法讀取
		}
}


$myDog = new Dog('多多', 3, '3kg');
//$myDog->animalShowData(); //正常顯示屬性

echo $myDog->name;   //正常讀取
echo $myDog->age;    //無法讀取
echo $myDog->weight; //無法讀取

//$myDog->dogShowData();  //無法讀取$weight變數
?>

介面(Interface)

一個類別只能繼承單一類別,但可以實作多個介面,介面用於更抽象的定義,例如狗的類別有年齡的方法,人類也有年齡的方法要實作,但計算方式可能略為不同,可以建立Age介面,在其中定義,讀取年齡的方法...如果類別有年齡的特性,可以於該類別使用Age介面,類別就要實作Age介面中定義的所有方法,也可以建立一個Foot介面定義用腳可以跑步、走路...。
//1.介面 Age 使用interface 宣告介面Age
interface Age
{
	public function getAge();
}

interface Foot
{
	public function run();
	public function walk();
}


//2.Dog 類別使用implrmrnts 實作Age介面的定義
class Dog implements Age, Foot
{
	public $age;

	public function getAge()
	{
		 return $this->age * 7 . "<br>";
	}

	public function run()
	{
		 return "我用四隻腳跑步<br>";
	}

	public function walk()
	{
		 return "我用四隻腳走路<br>";
	}
}

$dog = new Dog();
$dog->age = 1;
echo $dog->getAge(); // 7
echo $dog->run();    // 我用四隻跑步
echo $dog->walk();   // 我用四隻腳走路

注意介面中只能定義常數以及public 存取權限的抽象方法。