Página, a estrutura de MVC de PHP ultra simplista
Veja os projetos infantis deste projeto: https://github.com/h3rb/papi e https://github.com/h3rb/pagemin
Demonstrando a configuração de um novo aplicativo de estrutura "Page" em um domínio premiado do Apache2 servido http://indiedev.space clique aqui para a demonstração: https://asciinema.org/a/dbaycbfxgbyh4jqmbj1vnxumr
A demonstração acima mostra como:
Copyright (c) 2015-2017, H. Elwood Gilliland III Todos os direitos reservados.
Redistribuição e uso em formulários de origem e binária, com ou sem modificação, são permitidos, desde que as seguintes condições sejam atendidas:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
Este software é fornecido pelos detentores de direitos autorais e colaboradores "como está" e quaisquer garantias expressas ou implícitas, incluindo, entre outros, as garantias implícitas de comercialização e condicionamento físico para um determinado objetivo. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF Aconselhado sobre a possibilidade de tais danos.
A estrutura da página é super fácil, mas tem muito pouco documentos. Basta ler o index.php e cavar a partir daí para ver como os logins funcionam. A página de inscrição ainda não foi feita, mas o login está disponível para a conta de administrador padrão.
A partir deste ponto, você pode fazer qualquer coisa. A página é especificamente boa para o desenvolvimento de aplicativos da Web mínimos de PHP-> baseados em PDO. Tudo o que você precisa para instalar a página é colocá -la em uma pasta e verificar duas vezes o seu .htaccess e um caminho, e você é dourado. Várias implantações de página podem compartilhar o mesmo banco de dados de autenticação. Por que usar alguma estrutura gigantesca, afinal? Tudo o que você precisa está aqui para começar a criar ferramentas colaborativas para equipes ou serviços públicos como blogs, sites de mídia social personalizados, qualquer que seja!
Observe que tudo o que você realmente precisa aparece na pasta "núcleo", tudo o mais é apenas implementação em cima desse núcleo. Tudo o que o Core fornece é o objeto da página, o invólucro PDO e alguns recursos realmente úteis fundamentalmente, tudo o mais é implementado na pasta principal ou um dos outros subestimadores. Se você entender tudo em /core /, todo o resto pode ser removido (exceto talvez a pasta de cache). Para voltar ao mínimo, basta cortar o "núcleo" com um cortador de biscoitos. Há uma versão deste disponível agora chamada pagemin http://github.com/h3rb/pagemin
A página foi escrita para o PHP5, mas funciona muito bem no PHP7, pois usa um conjunto mínimo de recursos do idioma PHP. A única coisa que você terá que observar é o uso do AMPERSand (&), já que algumas páginas de pedaços e demonstrações podem usá -lo na forma de & $ p, mas você pode simplesmente substituí -lo por $ p. O projeto foi iniciado em 2008, mas não tinha o nome "página". Foi revivido, reorientado e renomeado em 2014, quando se tornou uma "semente" para os sistemas internos de intranet da startup de impressão 3D. Eu o uso para fazer ferramentas para Lostastronaut.com e como um "ágar" básico para outros sites de lâmpadas, onde quero muitas funcionalidades de back-end personalizadas. Também tem sido usado no WAMP.
Usos:
Com essa estrutura até agora, fiz vários sistemas corporativos totalmente funcionando e em uso. Fiz uma intranet corporativa segura, um sistema de gerenciamento de conteúdo compartilhado on-line baseado em banco de dados e uma ferramenta de edição para um departamento de design, um site de métricas de produto integrado completo com processamento de dados e vários aplicativos de utilitário. É fácil de implantar e começar a se desenvolver assim que você conhece o básico. Funciona de maneira mais confiável apenas na pilha de lâmpadas. As implementações do WAMP podem funcionar com algumas modificações, mas sem gauras. Foi implantado nas instâncias da AWS e pode ser reduzido a uma pegada mínima se você remover a funcionalidade de amostra que é embalada com ela.
Você pode apenas colocar a página em uma pasta e conectá -la ao banco de dados. Você pode repetir esse processo se desejar criar vários conjuntos de funcionalidade.
Fornece o básico:
Filosofia:
Exemplo de um arquivo php de visualização do controlador "página" típico:
include " core/Page.php " ;
$ p = new Page ;
$ p -> title = " My wickid page " ;
if ( Session:: is_logged_in () ) // Checks to see if user is logged in or not...
$ p -> HTML ( " Hey I'm logged in!!!! YAY! " );
else $ p -> HTML ( " not logged in.. :( " );
$ p -> Render (); // Puts page to screen.Exemplo de um arquivo php típico "PHP automatizado de um script":
include " core/automation.php " ; // Does everything Page does except create the Page class.. no Auth either.
//... load models and do stuff to db ...Para configurar o registro granular completo (armazenado em cache/logs/last-log.txt):
global $ plog_level ; $ plog_level = 1 ; // must appear before Page.php is included
include ' core/Page.php ' ;Exemplo de como fazer um novo modelo:
Como anexar à tabela de um banco de dados usando um modelo:
global $ database ;
$ my_model = new tableName ( $ database );Consulte os arquivos no CORE/ DOP/ para saber como tudo funciona.
Instalando e usando jQuery
A página suporta qualquer versão do jQuery e possui alguns recursos básicos que permitem implantar programaticamente jQuery. Ao contrário de outras estruturas ou métodos organizacionais de código, você deseja dividir seu plug-in de jQuery no CSS/ e JS/ pastas, colocando o CSS e as imagens no CSS/ e nos arquivos JavaScript em JS/ para que você possa usar $ Page-> JS () $ Page-> CSS () para carregá-los. Use $ página-> jq () para colar linhas na área Document Ready () e use $ Page-> JS () para adicionar ao JavaScript global da página.
include ' core/Page.php ' ;
$ p = new Page ();
$ p -> JS ( ' somejsfile.js ' );
$ p -> JS ( ' http://cdn.url.com ' );
$ p -> JQuery (); // Loads Jquery automatically
$ p -> JQ ( '
$("#docisready").on("click" ... );
' );
$ p -> JS ( ' var myGlobal=1; setInterval(function(){alert( ' foo');}, 1000 );');Além disso, você deve estar ciente de que, se você carregar seu próprio jQuery personalizado, modifique a sequência de carregamento em núcleo/página.php na versão de sua escolha na localização de sua escolha ou carregue -a através de outro método e informe que ele já está instalado para não instalá -lo duas vezes, fazendo:
$page->jq_loaded=TRUE;
Widgets de dados comuns de "edição ao vivo" integrados
(Métodos na classe Page Core, mas parte da funcionalidade não essencial)
A página foi usada para editar os dados do banco de dados-como um front-end de banco de dados para uma intranet corporativa-e permite que você e outras pessoas editem dados em tempo real. Você pode até usar recursos internos, como bloqueio automático e bloqueio de linha, para proteger os dados da edição de sniping. O suporte de bloqueio de linha está em Shreds/Autolocks.php
Todos esses widgets estão vinculados ao Ajax.*. Arquivos PHP e têm algumas desvantagens menores. Eles são escritos para trabalhar, mas às custas da rede (não cache ou atrasa as mensagens de saída). Além disso, se você deixar a página rapidamente depois de alterar alguma coisa, a solicitação não poderá concluir. Portanto, se você vai deixar a página esperar pelo menos 1-2 segundos, dependendo da latência atual da sua rede.
Além disso, você precisa usar as ACLs para proteger seus usuários de banco de dados de editar coisas que eles não têm permitido. Você pode usar as ACLs pelo nível de tabela ou campo da granularidade, na forma de nome de edição-tablename ou edit-tablename-fieldName. A classe ACL é definida em Shreds/ACL.php e essas "tags" da ACL são verificadas em alguns dos arquivos Ajax.*. PHP. Eles devem ser armazenados no perfil do usuário. Os ACLs especiais "Admin" e "SU" permitem ignorar essa segurança! Tenha cuidado lá fora.
Você deve usar o jQuery e os plug-ins de suporte que eles precisam e deve ativar esses recursos usando $ página-> bind_loadplugins ();
Uma vez ativado, você usa as opções $ Page-> Bind* para modificar seu banco de dados $ Global Primário. Você deve lê -los em núcleo/página.php
$ p = new Page ();
$ p -> Bind_LoadPlugins (); // Automatically loads jQuery and the required jQuery plugins.
$ p -> BindString (...);visualizar/
Contém tudo o que você deseja chamar expressamente de "visualização" - não incluído automaticamente, invocar: incluir "View/myview.php"
automação/
Contém tudo o que você não se importa em ter na pasta da web (caso contrário, use uma pasta chamada/offline) geralmente na forma de scripts Bash e/ou PHP que usam o ponto de entrada Core/Automation.php.
cache/
Contém arquivos de log (da função PLOG) e armazenamento em cache para qualquer plug -ins que você possa estar usando ou qualquer outra coisa que você queira em cache.
Certifique-se de que isso seja escrito e de todos os seus subpastas ...
essencial/
Contém o núcleo da estrutura da página. Core/Page.php é o que você deseja incluir o tempo todo. Core/Automation.php é para scripts offline que precisam acessar seus modelos. Core/Utility.php é onde eu mantenho todas as funções auxiliares úteis.
núcleo/PDO/
Contém a funcionalidade relacionada à PDO. O que você precisa estender é o modelo. Você deve lê -los para ter uma ideia das opções e da interface.
CSS/
Contém seu main.css e outros arquivos CSS para plugins ou áreas especiais do seu site. Você pode incluir estes arquivos como este:
$ p -> CSS ( ' main.css ' ); // Includes css/main.css
$ p -> CSS ( ' myplugin/plugin.css ' ); // Includes css/myplugin/plugin.css. motores/
Essa pasta contém qualquer coisa que seja mais "semelhante ao motor", e os arquivos são incluídos automaticamente para que, com exceção do .htaccess, terminem no .php e sejam código válido (sem erros de sintaxe).
formas/
Contém arquivos especializados para a classe Dataform, geralmente nomeada como form_name.txt, usada para mapear diretamente um formulário da web clássico para campos em um banco de dados para entrada e edição de dados.
exemplos/
Contém alguns exemplos e notas.
global/
Essa pasta contém qualquer coisa que seja "global", e os arquivos são incluídos automaticamente para que, com exceção do .htaccess, terminem no .php e sejam código válido (sem erros de sintaxe). Geralmente, você está apenas invocando a diretiva global e configurando padrões, embora possa torná -la "mais inteligente" da maneira que desejar.
html/
Contém trechos HTML que podem ser carregados na referência de arquivo de uma página -> html por arquivo, exemplo $ p-> html ('myfile.html') é descoberto automaticamente em html/
js/
Coloque seus arquivos JavaScript aqui. Quando você $p->JS('somefile.js')
phtml/
Qualquer coisa que você quiser avaliada e inclui o HTML de modo misto deve estar aqui. Não é realmente um recurso recomendado, mas eu o adicionei se você quiser fazer esse tipo de coisa.
esquemas/
Quaisquer que sejam os esquemas de banco de dados que você usou para criar seu site pode ser armazenado aqui, mas é inseguro. Exclua esta pasta, se desejar.
configurações/
Contém arquivos de configuração. Todos os arquivos nesta pasta são carregados automaticamente e devem terminar em .php e conter código PHP válido.
ui/
Contém arquivos de snippet de interface do usuário que usam a classe base da interface do usuário em core/ui.php - acabei fazendo o meu em shreds/ em vez disso, mas você pode usar isso, se quiser. Todos os arquivos nesta pasta são carregados automaticamente e devem terminar em .php e conter código PHP válido.
modelo/
Contém arquivos de configuração. Todos os arquivos nesta pasta são carregados automaticamente e devem terminar em .php e conter código PHP válido.
Shreds/
Contém módulos carregados automaticamente, trechos, funções, qualquer que seja. Eu o uso para embrulhar plug-ins jQuery (ou outras peças JavaScript) no PHP para pré-processamento quando não quero lidar com isso de outra maneira. Por exemplo, implementei a funcionalidade relacionada ao Muuri.js dessa maneira, para que você possa usá -la em um terminal, e não em um fragmento de página de inclusão de HTML/ pasta ou um arquivo JS incluído.
módulos/
Arquivos que você deseja incluir manualmente. Semelhante ao fornecedor/ pasta no bolo. include 'module/whatever.php'
eu/
Suas imagens! Tudo isso é referenciado nos arquivos .html, por exemplo. Ou você pode fazer referência a eles com i/
docs/
Documentação que você deseja disponibilizar em seu site ou para outras pessoas. Se houver um .SQL aqui, exclua -o depois de usá -lo.
Você precisará que o A2EnMod expira inclua reescrever McRypt e possivelmente alguns outros.
Por conveniência, incluí uma orientação aqui para orientá -lo na configuração do Ubuntu/Php/Apache2. Isso funciona bem nas instâncias da AWS EC2. Depois, pode exigir uma reinicialização da máquina.
Se você estiver instalando o Php7.1 com o FPM, no Ubuntu 16.04 LTS, você teria feito isso antes de qualquer um dos itens acima:
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y unzip apache2 php7.1 php7.1-cli php7.1-common libapache2-mod-php7.1 php7.1-mysql php7.1-fpm php7.1-curl php7.1-gd php7.1-bz2 php7.1-mcrypt php7.1-json php7.1-tidy php7.1-imagick php7.1-mbstring php-redis php-memcached
sudo a2enmod expires include rewrite mcrypt
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.1-fpm
sudo service apache2 restart
Nome de usuário de administrador padrão: senha do administrador para admin: um único espaço '' (altere depois de fazer login)
Fatal error: Call to a member function Select() on a non-object in /var/www/core/PDO/model.php on line 104
Isso significa que seu banco de dados não está configurado corretamente. Ou não existe, ou simplesmente não está disponível.
A página de esqueletos do site de amostra vem, incluindo a autenticação interna, foi escrita em uma versão menos rigorosa do MySQL do que a que é instalada por padrão. Você verá erros ao escrever no banco de dados, se for esse o caso.
Para desativar algumas dessas restrições, ssh no seu servidor como root e crie este arquivo: /etc/mysql/conf.d/disable_strict_mode.cnf
Abra o arquivo e insira essas duas linhas:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Preencha a operação reiniciando o MySQL.
sudo service mysql restart
Para iniciar um projeto completamente do zero usando apenas a funcionalidade principal
Desempenho e log
Você nunca deve permitir $ plog_level = 1 configurações em um servidor de produção.
Você não deve manter seus esquemas em sua pasta pública da Web, isso inclui o Page_Authdb.SQL pré-embalado, por razões óbvias.
Propriedade sobre dados
Observe que você deve examinar todas as solicitações relacionadas ao banco de dados de propriedade e visibilidade. Eventualmente, uma vez que eu tenho tempo para implementar o Módulo Core Porm, a Page lidará com isso para você sobre a propriedade sobre os dados, mas cabe a você executar o endurecimento e a validação necessários dos dados a serem recuperados e armazenados no banco de dados. Sabendo disso, muitos dos ajax.?.php Você deve implementar seu próprio sistema de propriedade do banco de dados (em grupo e permissões individuais, públicas e privadas).
Escondendo o código -fonte privado
A página depende do recurso de arquivo .htaccess do Apache2 (ou especificidade de configuração geral dentro do VHOST ou HTTPD ou portas ou qualquer .conf que você estiver usando) para definir permissões e parâmetros especiais de cada pasta da web e suas subpastas. Isso é feito para permitir que a página seja inserida em outros projetos ou para ser colocada em vários lugares no mesmo servidor da web. A página pronta para uso pode ser colocada em uma pasta e quase todos os arquivos serão ocultos, exceto na pasta principal. Mesmo novos subpastas que você faz não serão acessíveis ao público, a menos que você crie um arquivo .htaccess que o permite.
Se você estiver usando o nginx ou qualquer outra coisa que não o Apache, poderá pular os próximos dois parágrafos e seguir as instruções.
No entanto, algumas pessoas parecem pensar que essa é uma má ideia. Contanto que você seja cuidadoso que tipo de código você adiciona à página, poderá fazer um site seguro. No passado, isso era feito para PHP, testando na parte superior de cada arquivo incluído, se o recurso estava sendo carregado ou não por um navegador remoto ou sendo incluído em um arquivo (CodeIgniter, Zend, por exemplo). A Page não faz isso, porque toda a pasta é inacessível e também se eles conseguissem executar um dos arquivos "classe", nada aconteceria de qualquer significado. Independentemente disso, algumas pessoas parecem acreditar que os hackers podem de alguma forma enganar o Apache2 a ignorar arquivos .htaccess. Página e seus recursos de upload, não permitem isso. Além disso, a página não exige que eval() seja usado para qualquer coisa, porque não usa os mesmos métodos para implementar o MVC que outras estruturas (CodeIniter, Zend, por exemplo).
Se você acredita que a lógica que colocar código em uma pasta exposta, mas não pública, é uma má idéia, para sua página pode ser mais segura, movendo-a para uma pasta offline e expondo apenas pontos de extremidade públicos do PHP (arquivos que você deseja que as pessoas naveguem) na pasta do servidor da web. Pessoalmente, não vejo o benefício, exceto que isso torna impossível que você estrague e não tenha os arquivos .htaccess que você precisa. Um efeito colateral de fazer isso é que, se você tiver vários sites construídos na página e deseja manter um único núcleo, poderá usar esse mesmo método para fazê-lo.
Para manter a página fora do escopo e em uma pasta da web offline:
Pode ser necessário ajustar as primeiras linhas do seu núcleo/página.php real para refletir essa diferença de caminho, onde você vê incluir_all e incluir_once relacionado ao núcleo, mas deve ficar bem, pois neste momento é relatado ao arquivo core/Page.php incluído.
Se você incluiu manualmente algum módulo, precisará adicionar /path/to/page/folder/
Um dia, implementarei ainda mais o POWN, o que facilitará os recursos de semeadura de banco de dados e migração de esquema para facilitar a vida. You will be able to create an entire description of a database in a specialized text file (it will look like class declarations in C++ / Java), and convert that to a JSON tree (which you could also read from a file) and then feed that to a Pown class constructor, and attempt to deploy the database, or migrate it using $orm->Deploy() (where migration will add missing table columns, and modify existing columns detectando o tipo antigo primeiro)
Pensamentos
Como uso cada vez mais, acho viciante. Page tem um equivalente no mundo dos nodejs: expressjs. Independentemente disso, essas mãos antigas ainda digitam PHP muito mais rápido. Eu uso o PHP para ferramentas internas no LostasTronaut.com com bastante eficácia, porque é relativamente semelhante ao C ++ em que escrevi meu mecanismo de jogo do Windows. Também estou trabalhando em outros sites que o usarão. Ainda não há nada que pareça mais poderoso do que poder renderizar JavaScript personalizado usando PHP, mesmo que seja um pesadelo de sintaxe.